การอัปเดตกิจกรรมล่าสุดของผู้ใช้
ภาพรวม
ระบบจำเป็นต้องรู้ว่าผู้ใช้แต่ละคนยังเคลื่อนไหวอยู่หรือไม่ ทั้งเรื่องกิจกรรมล่าสุดเกิดขึ้นเมื่อใด เป็นกิจกรรมประเภทใด และเงียบหายไปนานเท่าไร ข้อมูลชุดนี้ถูกใช้ในสามที่ ได้แก่ การทำ segment เช่นเงื่อนไข "ผู้ที่ไม่มีกิจกรรมเกิน 30 วัน" การแสดงผลในหน้ารายชื่อผู้ใช้ของ CMS และการเป็นเงื่อนไขของ trigger rule บางประเภท
งานนี้เป็น consumer ขนาดเล็กที่ทำหน้าที่เพียงอัปเดตฟิลด์กลุ่ม last_activity_ บนแถว line_user โดยแยกออกมาเป็นคิวต่างหาก เพื่อไม่ให้การเขียนฐานข้อมูลไปถ่วง flow ที่ต้องตอบผู้ใช้แบบ realtime
Business Flow
- รับ payload ชนิด
LineUserActivityPayloadซึ่งประกอบด้วยlineUserId,lineOaId,organizationIdพร้อมประเภทและสถานะของกิจกรรม ProcessLineUserLastActivityค้นหาแถวline_userที่ตรงกับชุดคีย์ organizationId, lineOaId และ lineUserId- อัปเดตฟิลด์ 4 ตัว
last_activity_typeคือประเภทของกิจกรรม เช่น message, follow หรือ clicklast_activity_statusคือสถานะ active หรือ inactivelast_activity_periodคือช่วงเวลาที่คำนวณจากระยะห่างระหว่างกิจกรรมlast_activity_dateคือเวลาปัจจุบันที่บันทึก
- ระบบมี Redis cache ของแถว
line_userที่ keyLINE_USER:<lineUserId>ซึ่งถูกอ่านโดย flow อื่นในระบบด้วย - service จัดการข้อผิดพลาดภายในตัวเอง คือบันทึก log แล้วจบงาน ทำให้ handler คืนค่า nil เสมอและ ack ทุกข้อความ ซึ่งตรงกับพฤติกรรมของระบบเดิม เหตุผลคืองานอัปเดต metadata ไม่ควรทำให้ข้อความค้างอยู่ในคิว
ไฟล์และฟังก์ชันหลัก
internal/lineuser/service.goService.ProcessLineUserLastActivity(ctx, payload)— ลำดับการทำงานหลักfindByLineUserId()— อ่านจาก Redis cache ที่ keyLINE_USER:<id>ก่อน แล้วจึง fallback ไปอ่านฐานข้อมูล โดยมีข้อสังเกตว่าฟังก์ชันนี้ไม่เขียน cache กลับตอน miss ซึ่งตรงกับพฤติกรรมของ source เดิม- ค่าคงที่
moduleNameมีค่าเป็นLINE_USERใช้เป็น prefix ของ Redis key
internal/lineuser/consumer.go—Consumer.HandleTrackingLogผูกกับคิวline_user_last_activityinternal/lineuser/types.go— นิยามชนิดLineUserActivityPayload- คิวที่เกี่ยวข้อง:
line_user_last_activity(runtime profilemain)
จุดเชื่อมต่อกับ Service อื่น
- ต้นทางของงาน —
line-management-webhook-goและเส้นทาง tracking หรือ redirect ที่ต้องการบันทึกกิจกรรมโดยไม่ block การตอบกลับ - ฐานข้อมูล — ตาราง
line_userโดยอัปเดตฟิลด์last_activity_type,last_activity_status,last_activity_periodและlast_activity_date - Redis — key
LINE_USER:<lineUserId> - ไม่เรียก LINE API
- ผู้ใช้ข้อมูลปลายทาง — audience filter ฝั่ง cms-api, trigger rule ที่ใช้เงื่อนไขระดับ attribute และรายงานผู้ใช้ใน cms-web