今天的事件發生在獎學金系統
用排程發送獎勵失敗
但是用API單筆發送就成功
又是一起不科學事件

公司有許多獎勵活動
只要客戶上完指定的課程
就會用排程送出獎勵

一樣在某個風和日麗的午後
運維工程師回報
有客戶反映沒有領到獎勵

原本以為客戶自己計算錯誤
結果使用API打單筆資料
還真的符合資格

查看排程Log也都有正常啟動
以為是偶發事件
打完API,客戶領到獎勵後
我就置之腦後了

沒想到短短兩天
又遇到了一次
再用API戳了一次客戶的合約
一樣判定合格
真的是讓我看傻了眼

雖然一個是排程一個是API
不過程式內其實是同一個方法
差別只在於合約筆數的多寡

白話翻譯就是
打多筆可能失敗
打單筆必定成功
這真是太神奇了,傑克
schedule-2.jpg

因為牽涉到真實的上課資料
無法在測試或是local 環境模擬
只能乖乖一行一行看程式碼Debug

程式邏輯也不複雜

  1. 撈出參加活動的合約
  2. 找出合約上的課程
  3. 判斷是否符合資格

一開始懷疑是打外部API有錯
但我看也沒有error log
實在不懂為啥會有問題

看了最近的commit
發現有一個distinct
再仔細看一下Code
大概長這樣
schedule-1.png

因為兩個list一個Distinct過
一個沒有
導致部分客戶的上課資料會沒有拿到
所以這個Bug才會發生在多筆的狀況

再看一下兇手
原來也是我自己
當初是為了解決另外一個Bug
才加了Distinct去重複

果然解鈴還需繫鈴人
自己造的孽還是得自己收拾

下回預告
測試了一個月的功能
上線後依然發生Bug
VPN也無法模擬客戶情況
到底發生什麼事了

下一回
500 Error bug事件