黄舟2017-04-18 09:28:19
冪等一般是指方法不改變業務狀態,因而能保證重複調用的效果和單次的效果一致.
看你的描述, 你的定時任務和異步處理很可能會改變業務狀態(比如插入了數據).很可能你的方法應該本身就不是冪等的. 如果是這樣基本無解了.
我覺得你提問的實際想法可能是: 分佈式環境下, 如何保證定時任務和異步處理在發送重複請求時, 實際業務邏輯只執行一次?
如果是樣, 你可以使用使用一個集中式存儲(比如redis), 來保存調用端請求記錄, 服務端在接收到請求後, 用原子性的查詢和保存操作(比如redis的setnx命令) , 來保證只有一個請求會成功保存下來. 這樣就能達到實際業務只執行一次的效果了.
boolean setSuccess = redis.setnx(request.serializeToString(),"");//原子操作
if(setSuccess){
doBusiness(); //执行业务
}else{
doNothing(); //什么都不做
}
PHPz2017-04-18 09:28:19
個人並沒有這方面的經驗,不過公司裡的做法是用IP來做判斷,指定的IP才能去執行這個定時任務。
以下為個人空想,並無實務經驗:
搭建一個公共應用專門處理定時任務,然後提供訊息介面給具體應用呼叫。