鍍金池/ 問答/人工智能  Linux  數(shù)據(jù)庫  網(wǎng)絡(luò)安全/ 關(guān)于MQ異步調(diào)用,調(diào)用失敗的處理方式

關(guān)于MQ異步調(diào)用,調(diào)用失敗的處理方式

@Transactional
void a(){
  b();//插入數(shù)據(jù)a,id=101
  c(101);
}

/*
* 異步執(zhí)行
*/
@Async
void c(int id){
  // 查詢
  Obj data = query(id);
  // 調(diào)用mq 
 push(data)
}

在一個(gè)事務(wù)里面,插入數(shù)據(jù),然后在另一個(gè)線程里查詢并推送數(shù)據(jù)。

這里query的時(shí)候,可能由于事務(wù)沒有提交,查詢不到數(shù)據(jù)的。

問題

mq異步調(diào)用失敗,如何保證數(shù)據(jù)一致性?

已知方案:調(diào)用失敗寫入數(shù)據(jù)庫,然后定時(shí)掃表,做補(bǔ)償,不過感覺這種效率不高。

還有其他更好的方案嗎?

回答
編輯回答
你好胸

按你的使用場景,推送數(shù)據(jù)必須得在數(shù)據(jù)創(chuàng)建事務(wù)成功之后執(zhí)行,這里必須有個(gè)先后。你可以將推送這個(gè)操作異步執(zhí)行,消息隊(duì)列有一搬有ack機(jī)制,確保消息沒丟失。這時(shí)候監(jiān)聽消息隊(duì)列的程序會(huì)執(zhí)行推送,如果推送成功做標(biāo)記。如果推送失敗也標(biāo)記記錄時(shí)間,也可以推到另一個(gè)消息隊(duì)列約定多少分鐘重試。實(shí)在不行就徹底標(biāo)記失敗,或者回滾之前創(chuàng)建的數(shù)據(jù)。這個(gè)才是最終一致性。
如果是并行的操作,就得使用消息隊(duì)列的confirm機(jī)制了。

2017年5月13日 16:13