task_event_queue

定位

task_event_queue 用來處理專案內部的非同步資料任務。

常見用途:

  • 重算 counter
  • 更新 read count / badge
  • 延遲任務
  • 發送後續 event_queue
  • 補同步其他 table 的 derived state

event_queue 不同,task_event_queue.event_key 會直接對應到 TaskEventFactory::$handlers 裡的 task handler。

寫入位置

寫入 model:

Lib/Model/TaskEventQueue.php

寫入方式:

TaskEventQueue::get()->insertEvent($eventKey, $params);

資料會寫入:

task_event_queue.event_key
task_event_queue.params
task_event_queue.priority

消費 worker

worker:

Endpoint/V1/TaskEventQueue.php::index()

啟動 script:

CLI/cron_task_event_queue.sh

worker 流程:

讀 task_event_queue
-> lock row
-> 複製到 task_event_queue_log
-> 刪除 task_event_queue row
-> TaskEventFactory 找 handler
-> handler process()
-> 更新 task_event_queue_log.status_id / message

控制參數

task_event_queue worker 的版本控制參數放在:

event_queue_params.p_key = task_run_version

目前基準值:

idp_keyp_value
2task_run_version2

若只調整 task_event_queue worker 或 handler 版本切換邏輯,通常更新 task_run_version,不是 run_version

完整控制參數請看 event_queue_params

Handler 對應

dispatcher:

Lib/Util/TaskEvent/TaskEventFactory.php

handler map 在:

TaskEventFactory::$handlers

例如:

event_keyhandler
bid_contact_countBidContactCountHandler
sent_contact_provider_smsSentContactProviderSMSHandler
request_provider_read_countRequestProviderReadCountHandler
update_badgeUpdateBadgeHandler

常用 SQL

查待處理 queue

SELECT
  id,
  created,
  event_key,
  params,
  priority,
  retry
FROM task_event_queue
WHERE event_key = '<event_key>'
ORDER BY id DESC
LIMIT 20;

查已處理 log

SELECT
  id,
  inserted,
  executed,
  event_key,
  params,
  message,
  status_id,
  retry
FROM task_event_queue_log
WHERE event_key = '<event_key>'
ORDER BY id DESC
LIMIT 20;

排查重點

  • 找不到 task_event_queue row 不代表沒送,可能已經進 task_event_queue_log
  • 測試機若有 cron / worker 正在跑,task_event_queue row 可能送出後很快被抓去執行。
  • handler 失敗時看 task_event_queue_log.message 與 application log channel Task_EventQueue_index
  • 驗證 downstream side effect 時,優先看 handler 最終更新的 table。