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.shworker 流程:
讀 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目前基準值:
| id | p_key | p_value |
|---|---|---|
| 2 | task_run_version | 2 |
若只調整 task_event_queue worker 或 handler 版本切換邏輯,通常更新 task_run_version,不是 run_version。
完整控制參數請看 event_queue_params。
Handler 對應
dispatcher:
Lib/Util/TaskEvent/TaskEventFactory.phphandler map 在:
TaskEventFactory::$handlers例如:
| event_key | handler |
|---|---|
bid_contact_count | BidContactCountHandler |
sent_contact_provider_sms | SentContactProviderSMSHandler |
request_provider_read_count | RequestProviderReadCountHandler |
update_badge | UpdateBadgeHandler |
常用 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_queuerow 不代表沒送,可能已經進task_event_queue_log。 - 測試機若有 cron / worker 正在跑,
task_event_queuerow 可能送出後很快被抓去執行。 - handler 失敗時看
task_event_queue_log.message與 application log channelTask_EventQueue_index。 - 驗證 downstream side effect 時,優先看 handler 最終更新的 table。