1.消息重復消費
- 場景:
- 以Kafka舉例,生產(chǎn)者發(fā)送三條消息到Kafka,分別為:數(shù)據(jù)一(offset:1)南捂、數(shù)據(jù)二(offset:2)蛔屹、數(shù)據(jù)三(offset:3).消費者從mq中消費數(shù)據(jù),offset1的數(shù)據(jù)消費成功,數(shù)據(jù)保存到數(shù)據(jù)庫,消費者提交offset,通過zookeeper記錄當前offset1已經(jīng)被消費,消費者繼續(xù)消費數(shù)據(jù)二,消費成功,數(shù)據(jù)保存到數(shù)據(jù)庫,消費者準備提交offset2,此時消費者掛了,offset2沒有能提交,那么這個offset2沒有沒被zookeeper記錄已經(jīng)消費,當程序重啟時,消費者繼續(xù)向mq消費數(shù)據(jù),此時Kafka從zookeeper獲取到上次最后消費的是offset1,那么mq會把offset1后面的數(shù)據(jù)發(fā)送給消費者,此時消費者消費到offset2數(shù)據(jù),這就造成數(shù)據(jù)重復消費.
- 常用方案:
- 1.通過唯一標識,列如:Kafka的offset泽艘、MQ的Message ID、數(shù)據(jù)中有保證唯一字段,
- 2.可以每次消費數(shù)據(jù)把唯一標識存入redis,每次操作數(shù)據(jù)可以去redis校驗是否已經(jīng)存在;數(shù)據(jù)庫可以設計一張專門用來校驗數(shù)據(jù)的表,把唯一標識存入數(shù)據(jù)庫,或者在當前操作的數(shù)據(jù)庫表上多加一個唯一字段,用于存儲唯一字段,每次都通過數(shù)據(jù)庫校驗是否重復消費;