508   Expired data (Field Level) ด้วย TTL บน Cassandra

จาก Loop ทุกๆ N นาที สู่ No-Loop โดยใช้ TTL กับ Cassandra 

Cassandra การกำหนด time-to-live (TTL)


ก่อนอื่นผมต้องขอแชร์ก่อนว่า

การ Expired Rows จริงๆ แล้วในบางงานก็มีความสำคัญอยู่ไม่ใช่น้อย ยกตัวอย่างเช่น 

- Email Confirm ต่างๆ เช่น เปลี่ยนรหัสผ่าน, ยืนยันตัวตน หากไม่ทำภายในระยะเวลาที่กำหนด
- เคลียร์ข้อมูล 
History เช่น Rows ที่มีอายุเกิน 9 เดือนแล้ว
- SMS OTP ยืนยันตัวตน
- และอีกหลายๆ งาน หรือตามความต้องการเป็นต้น

ซึ่งการ 
Expired Rows ท่าที่ Developers ส่วนใหญ่มักจะทำกันเลย ก็คือ การใช้ Batch ตั้งเวลาไว้ เมื่อถึงเวลาก็เข้ามากวาดเพื่อลบข้อมูลทิ้งไป ฟังดูเหมือนไม่ยาก แต่ถ้าหากเมื่อไหร่งานนั้นๆ จำเป็น แล้ว Batch ไม่ทำงานจะเกิดอะไรขึ้นซึ่งเราก็จะต้องมา Handle กันอีกที

Per Row หลายๆ ท่าน คงจะรู้สึกเฉยๆ แล้ว เพราะถ้าสาย Java อย่าง Redis ก็สามารถทำได้

แล้วถ้า ?!! Per Field ล่ะ จะทำยังไง เรามาดูกัน ฟิ๊ว ~

>> มาเข้าเรื่องได้แล้วววว

ในบทความนี้ผมจะพูดถึงวิธีการ Insert และ Update โดยใช้คำสั่ง ttl หรือ Time To Live นั่นเอง 

บทบาทสำคัญของ Cassandra Time to Live (TTL) คือ การตั้งเวลาเพื่อกำหนดเวลาหมดอายุของ Row หรือ Field นั้นๆ เมื่อเวลาครบตามที่กำหนด Cassandra จะลบข้อมูลทิ้งโดยอัตโนมัติ

Cassandra time-to-live (TTL) มีประโยชน์อย่างไร ?

มีประโยชน์มากในการ
กำหนดเวลาหมดอายุ สำหรับ Row หรือ Field ที่เราต้องการ

ผมจะยกตัวอย่างให้เห็นภาพครับ

สมมติว่าเราต้องการ Verify ข้อมูล User 
โดยการส่งข้อความ OTP แล้วนำเลข OTP ดังกล่าวมากรอกในระบบเพื่อปรับ Status จาก WAITING เป็น VERIFIED เป็นการยืนยันตัวตน

มาเริ่มกันเลย

1. สร้าง Table test_ttl ขึ้นมาก่อน

create table mindshop_dev.test_ttl
(
    uid          varchar,
    full_name    varchar,
    otp_verify   varchar,
    tel          varchar,
    status       varchar,
    created_date timestamp,
    created_by   varchar,
    updated_date timestamp,
    updated_by   varchar,
    primary key (uid, tel)
);

2. สมมติว่าลูกค้าสมัครสมาชิกเข้ามา
insert into test_ttl (uid,
                      full_name,
                      otp_verify,
                      tel,
                      status,
                      created_by,
                      created_date)
values ('abcde1',
        'Moss Panusitt',
        null,
        '0669999969',
        'WAITING',
        'Mindbase',
        toUnixTimestamp(now()));

3. จากนั้นระบบก็ทำการ Generate เลข OTP ขึ้นมา สมมติว่าได้เลข 987789 ก็นำไป Update ในฐานข้อมูล แล้วส่ง SMS ให้ลูกค้าดังกล่าวนำมากรอกยืนยันในระบบ
*โดยเลข OTP จะมีอายุเพียงแค่ 30 วินาที (แต่ของจริงแล้วแต่ Requirement เลยครับ)
update test_ttl
    using ttl 30
set otp_verify = '987789'
where uid = 'abcde1'
  and tel = '0669999969';



4. กรณีที่ลูกค้านำเลข OTP มากรอกเราก็ทำการเช็คปกติ
select tel, otp_verify
from test_ttl
where tel = '0669999969';

เรามาดูเงื่อนไขกัน

ถ้าลูกค้ากรอกเลข OTP เข้ามาภายใน 30 วินาที จะต้องพบข้อมูลในระบบ >> แล้วก็ Update Status จาก WAITING เป็น VERIFIED ได้เลยครับ



ถ้าลูกค้ากรอกเลข OTP เข้ามาหลังจาก 30 วินาที จะสังเกตุเห็นได้ว่า field otp_verify จะเป็น null เนื่องจาก 
field ดังกล่าวหมดอายุ



เรียบร้อยครับสำหรับการกำหนดเวลาให้ Field นั้นๆ

ต่อไปเรามาดูอีกกรณีครับ

การกำหนดเวลาให้ทั้ง Row 
เมื่อครบตามเวลาที่กำหนดระบบจะลบข้อมูลทิ้งทันที

ผมจะยกตัวอย่างให้เห็นภาพครับ

1. สมมติว่าลูกค้าสมัครสมาชิกเข้ามา หากลูกค้าไม่ Verify OTP ภายใน 30 วินาที ระบบจะลบข้อมูลทิ้งทันที
insert into test_ttl (uid,
                      full_name,
                      otp_verify,
                      tel,
                      status,
                      created_by,
                      created_date)
values ('abcde1',
        'Moss Panusitt',
        '999666',
        '0669999969',
        'WAITING',
        'Mindbase',
        toUnixTimestamp(now()))
    using ttl 30;

จะสังเกตุได้ว่ามีการกำหนดเวลาให้ในระหว่างการ Insert ข้อมูลเลย
คำสั่ง using ttl 30



คำถามต่อไป อ้าวววว ~~~ แล้วถ้าลูกค้า Verify ก่อน 30 วินาทีล่ะ เราจะทำยังไงเพราะว่าไปกำหนดเวลาหมดอายุนี่หน่าา = ='

เราก็แค่สั่ง Update field otp_verify = null แล้วกำหนด using ttl 0 ทีนี้ Row ดังกล่าว ก็จะมีชีวิตอยู่ต่อ ไม่หมดอายุอีกต่อไปครับ

update test_ttl
    using ttl 0
set otp_verify = null
where uid = 'abcde1'
  and tel = '0669999969';

ได้เห็นความสามารถของ Cassandra แล้วเป็นไงบ้างครับ เพื่อนๆ สะดวก ใช้งานง่าย ตอบโจทย์ แน่นอน


ทีนี้ท่านก็ลองนำความรู้ดังกล่าวที่เรียนมาไปประยุกต์ใช้งานกับ Flow การทำงานท่านต่อได้เลยครับ

หวังว่าเป็นบทความที่มีความรู้ และสามารถพาท่านเรียนรู้ได้จนเข้าใจ

~~~~ bamossza.com คลังความรู้ที่พร้อมจะแชร์ประสบการณ์การให้กับคุณ

_/\_ 
_/\_ _/\_
?> if (isset($PAGINATION)) { echo $PAGINATION; } ?>
Back to Top