kafka應用和冪等性


Kafka 是LinkedIn 開發的一個高性能、分布式的消息系統.

用途:廣泛用於日志收集、流式數據處理、在線和離線消息分發等場景。

1. Kafka 將消息流按Topic 組織,保存消息的服務器稱為Broker,消費者可以訂閱一個或者多個Topic。為了均衡負載,一個Topic 的消息又可以划分到多個分區(Partition),分區越多,Kafka並行能力和吞吐量越高。

    Kafka 集群需要zookeeper 支持來實現集群,最新的kafka 發行包中已經包含了zookeeper,部署的時候可以在一台服務器上同時啟動一個zookeeper Server 和 一個Kafka Server,也可以使用已有的其他zookeeper集群。

2.  ActiviMq消息隊列,解決了服務解耦合的動作,緩解了服務並發量很大,造成服務器無法處理的狀況。

    (kafka、rabbitMQ、activiMQ)其他作用:異步處理、消息通訊、流量消峰、應用解耦

應用場景1:(異步處理)用戶注冊后,需要發注冊郵件和注冊短信,

應用場景2:(應用解耦合)雙11是購物狂節,用戶下單后,訂單系統需要通知庫存系統,傳統的做法就是訂單系統調用庫存系統的接口.

應用場景3:(秒殺活動)場景:秒殺活動,一般會因為流量過大,導致應用掛掉,為了解決這個問題,一般在應用前端加入消息隊列。

轉自:https://www.jianshu.com/p/2820561158c4

 Kafka 對比 ActiveMQ消息隊列:https://www.iteye.com/blog/xiaowei2002-2258845

 

 

 如何保證消息隊列的冪等性?

冪等性:一個請求,不管重復來多少次,結果是不會改變的。

在什么場景會出現消息重復消費?

kafka: 比如說消費端已經消費了 offset=2,offset=3,offset=4 的三條數據,正准備把這個 offset 的值傳給 kafka,這時候消費端機器宕機了,這個數據沒傳過去;重啟之后,消費端同步 kafka,kafka 那邊消費的記錄 offset 還是 1,那么 kafka 會認為之前的 2、3、4 都沒有消費過,會把這幾個數據在傳給消費端;這樣消費端這邊就重復對這幾條數據進行消費了。在數據庫里面可能就多了很多重復的數據。像其他的 MQ,也是一樣,消費端再返回給 MQ 的時候,當機了或者重啟了,那么都會出現重復消費的問題。

每個消息都會有唯一的消息 id。
1)、先查再保存
每次保存數據的時候,都先查一下,如果數據存在了那么就不保存。這個情況是並發不高的情況。

2)、添加消息表

再數據庫里面,添加一張消息消費記錄表,表字段加上唯一約束條件(UNIQUE),消費完之后就往表里插入一條數據。因為加了唯一約束條件,第二次保存的時候,MySQL 就會報錯,就插入不進去;通過數據庫可以限制重復消費。

3)、使用 Redis
如果你的系統是分布式的,又做了分庫分表,那么可以使用 Redis 來做記錄,把消息 id 存在 Redis 里,下次再有重復消息 id 在消費的時候,如果發現 Redis 里面有了就不能進行消費。

4)、高並發下
如果你的系統並發很高,那么可以使用 Redis 或者 zookeeper 的分布式對消息 id 加鎖,然后使用上面的幾個方法進行冪等性控制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM