Skip to main content

การซิงก์รายชื่อผู้ติดตาม LINE OA

ภาพรวม

ตอนเชื่อม LINE OA เข้าระบบเป็นครั้งแรก ตาราง line_user ยังว่างเปล่า ทั้งที่ OA นั้นอาจมีเพื่อนอยู่แล้วหลายแสนคน งานนี้ทำหน้าที่ดึงรายชื่อผู้ติดตามทั้งหมดจาก LINE Messaging API มาเติมลงตาราง line_user เพื่อให้ผู้ใช้เริ่มยิง multicast ทำ segment และดูสถิติได้ทันทีโดยไม่ต้องรอให้ผู้ติดตามทักเข้ามาเอง

เนื่องจากเป็นงาน long-running ที่ดึงข้อมูลทีละ 1,000 รายชื่อจนครบ ระบบจึงเก็บสถานะการซิงก์ไว้เพื่อให้ CMS แสดงความคืบหน้าให้ผู้ใช้เห็น

Business Flow

  1. รับ payload ที่มีฟิลด์ lineOaId ซึ่ง publish มาจาก CMS เมื่อผู้ใช้กดปุ่มซิงก์ผู้ติดตาม
  2. โหลดข้อมูล OA หากสถานะไม่ใช่ active ระบบจะตั้งสถานะการซิงก์เป็น failed พร้อมข้อความภาษาไทยรหัส LOA_004 แล้วจบงาน
  3. ตั้งสถานะการซิงก์เป็น PROCESSING และเขียน Redis key LINE_OA:<REDIS_KEY_SYNC_FOLLOWER_USER_PROCESSING>:<lineOaId> ไว้เป็น flag บอกว่างานกำลังทำงานอยู่
  4. วน paginate เรียก GET /v2/bot/followers/ids ครั้งละ 1,000 รายชื่อ โดยส่ง cursor ผ่านพารามิเตอร์ start ต่อเนื่องไปเรื่อย ๆ
  5. แต่ละหน้าที่ได้มา ระบบจะ bulk INSERT เข้าตาราง line_user แบบ or-ignore คือหากมีแถวนั้นอยู่แล้วจะข้ามไปโดยไม่ทับข้อมูลเดิม พร้อมผูก organization_id และ line_oa_id ของ OA นั้นเข้าไปด้วย
  6. เมื่อดึงจนหมดหน้า คือไม่มี cursor next ส่งกลับมาแล้ว จะตั้งสถานะการซิงก์เป็น COMPLETED และเคลียร์ flag ใน Redis
  7. หากเกิดข้อผิดพลาดระหว่างทาง ระบบจะตั้งสถานะเป็น failed พร้อมบันทึกข้อความอธิบาย

ไฟล์และฟังก์ชันหลัก

  • internal/lineoa/syncfollower.go
    • Service.ProcessLineSyncFollowerUser(ctx, payload) — ลำดับการทำงานหลัก
    • insertFollowerBatch() — bulk insert ครั้งละ 1,000 รายชื่อ
    • updateSyncFollowerStatus() — เขียนสถานะและข้อความ log กลับลงฐานข้อมูล
  • internal/lineoa/consumer.goConsumer.HandleLineSyncFollowerUser
  • internal/lineoa/types.goLineSyncFollowerUserPayload และค่าคงที่สถานะ SyncFollowerStatusProcessing, SyncFollowerStatusCompleted, SyncFollowerStatusFailed
  • internal/line/audience.go และ internal/line/client.goClient.GetFollowerIDs(ctx, baseURL, limit, start)
  • คิวที่เกี่ยวข้อง: line_sync_follower_user (runtime profile main)

จุดเชื่อมต่อกับ 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 APIGET /v2/bot/followers/ids พร้อมพารามิเตอร์ limit เท่ากับ 1,000 และ cursor โดย base URL อ่านจากตัวแปร LINE_ENDPOINT
  • ข้อจำกัดของข้อมูลที่ได้ — ผู้ใช้ที่ซิงก์เข้ามาจะยังไม่มีข้อมูลโปรไฟล์ ทั้งชื่อที่แสดงและรูป จนกว่าจะมี interaction เกิดขึ้นจริง หรือถูกเติมข้อมูลผ่านงานนำเข้ารายชื่อผู้ใช้จากไฟล์ CSV