การซิงก์รายชื่อผู้ติดตาม LINE OA
ภาพรวม
ตอนเชื่อม LINE OA เข้าระบบเป็นครั้งแรก ตาราง line_user ยังว่างเปล่า ทั้งที่ OA นั้นอาจมีเพื่อนอยู่แล้วหลายแสนคน งานนี้ทำหน้าที่ดึงรายชื่อผู้ติดตามทั้งหมดจาก LINE Messaging API มาเติมลงตาราง line_user เพื่อให้ผู้ใช้เริ่มยิง multicast ทำ segment และดูสถิติได้ทันทีโดยไม่ต้องรอให้ผู้ติดตามทักเข้ามาเอง
เนื่องจากเป็นงาน long-running ที่ดึงข้อมูลทีละ 1,000 รายชื่อจนครบ ระบบจึงเก็บสถานะการซิงก์ไว้เพื่อให้ CMS แสดงความคืบหน้าให้ผู้ใช้เห็น
Business Flow
- รับ payload ที่มีฟิลด์
lineOaIdซึ่ง publish มาจาก CMS เมื่อผู้ใช้กดปุ่มซิงก์ผู้ติดตาม - โหลดข้อมูล OA หากสถานะไม่ใช่
activeระบบจะตั้งสถานะการซิงก์เป็นfailedพร้อมข้อความภาษาไทยรหัสLOA_004แล้วจบงาน - ตั้งสถานะการซิงก์เป็น PROCESSING และเขียน Redis key
LINE_OA:<REDIS_KEY_SYNC_FOLLOWER_USER_PROCESSING>:<lineOaId>ไว้เป็น flag บอกว่างานกำลังทำงานอยู่ - วน paginate เรียก
GET /v2/bot/followers/idsครั้งละ 1,000 รายชื่อ โดยส่ง cursor ผ่านพารามิเตอร์startต่อเนื่องไปเรื่อย ๆ - แต่ละหน้าที่ได้มา ระบบจะ bulk INSERT เข้าตาราง
line_userแบบ or-ignore คือหากมีแถวนั้นอยู่แล้วจะข้ามไปโดยไม่ทับข้อมูลเดิม พร้อมผูกorganization_idและline_oa_idของ OA นั้นเข้าไปด้วย - เมื่อดึงจนหมดหน้า คือไม่มี cursor
nextส่งกลับมาแล้ว จะตั้งสถานะการซิงก์เป็น COMPLETED และเคลียร์ flag ใน Redis - หากเกิดข้อผิดพลาดระหว่างทาง ระบบจะตั้งสถานะเป็น
failedพร้อมบันทึกข้อความอธิบาย
ไฟล์และฟังก์ชันหลัก
internal/lineoa/syncfollower.goService.ProcessLineSyncFollowerUser(ctx, payload)— ลำดับการทำงานหลักinsertFollowerBatch()— bulk insert ครั้งละ 1,000 รายชื่อupdateSyncFollowerStatus()— เขียนสถานะและข้อความ log กลับลงฐานข้อมูล
internal/lineoa/consumer.go—Consumer.HandleLineSyncFollowerUserinternal/lineoa/types.go—LineSyncFollowerUserPayloadและค่าคงที่สถานะSyncFollowerStatusProcessing,SyncFollowerStatusCompleted,SyncFollowerStatusFailedinternal/line/audience.goและinternal/line/client.go—Client.GetFollowerIDs(ctx, baseURL, limit, start)- คิวที่เกี่ยวข้อง:
line_sync_follower_user(runtime profilemain)
จุดเชื่อมต่อกับ Service อื่น
- ต้นทางของงาน — cms-api-go โดเมน line-oa จากปุ่มซิงก์ผู้ติดตาม
- ฐานข้อมูล —
line_oa(สถานะการซิงก์และ access token) และline_user(bulk insert) - Redis — key
LINE_OA:SYNC_FOLLOWER_USER_PROCESSING:<lineOaId>โดยส่วน prefix ปรับได้ผ่านตัวแปรREDIS_KEY_SYNC_FOLLOWER_USER_PROCESSING - LINE API —
GET /v2/bot/followers/idsพร้อมพารามิเตอร์ limit เท่ากับ 1,000 และ cursor โดย base URL อ่านจากตัวแปรLINE_ENDPOINT - ข้อจำกัดของข้อมูลที่ได้ — ผู้ใช้ที่ซิงก์เข้ามาจะยังไม่มีข้อมูลโปรไฟล์ ทั้งชื่อที่แสดงและรูป จนกว่าจะมี interaction เกิดขึ้นจริง หรือถูกเติมข้อมูลผ่านงานนำเข้ารายชื่อผู้ใช้จากไฟล์ CSV