消息队列之常见问题
一、消息隊列
1.如何保證消息隊列的高可用?
1.1 kafka的高可用性
HA機制,就是Replication副本機制。只能讀寫leader。
多副本?-> leader & follower -> broker掛了重新選舉leader即可對外服務。
2.如何保證消息不被重復消費(冪等性)?
?冪等性:通俗點說,就一個數據,或者一個請求,給你重復來多次,你得確保對應的數據是不會改變的,不能出錯。
?可以基于數據庫的唯一鍵來保證重復數據不會重復插入多條。
3.如何保證消息的可靠性傳輸(如何處理消息丟失的問題)?
? 分析生產者、消息隊列和消費者哪個環節造成了消息丟失,然后解決。
? kafka消費端丟失:kafka會自動提交offset,那么只要關閉自動提交offset,在處理完之后自己手動提交offset,就可以保證數據不會丟。但是此時確實還是會重復消費,比如你剛處? ? 理完,還沒提交offset,結果自己掛了,此時肯定會重復消費一次,自己保證冪等性就好了。
? 解決方案:關閉自動更新offset,等到數據被處理后再手動跟新offset。
? 在消費前做驗證前拿取的數據是否是接著上回消費的數據,不正確則return先行處理排錯。
? 一般來說zookeeper只要穩定的情況下記錄的offset是沒有問題,除非是多個consumer group 同時消費一個分區的數據,其中一個先提交了,另一個就丟失了。
4.如何保證消息的順序性?
? 1)rabbitmq:拆分多個queue,每個queue一個consumer,就是多一些queue而已,確實是麻煩點;或者就一個queue但是對應一個consumer,然后這個consumer內部用內存隊列做排隊,然后分發給底層不同的worker來處理。
?
?
?2)kafka:一個topic,一個partition,一個consumer,內部單線程消費,寫N個內存queue,然后N個線程分別消費一個內存queue即可。
?
5.如何解決消息隊列的延時以及過期失效問題?消息隊列滿了以后該怎么處理?有幾百萬消息持續積壓幾小時,怎么解決?
? ?恢復消費端。
6.如果讓你寫一個消息隊列,該如何進行架構設計啊?
? 參照kafka:broker -> topic -> partition
?7.Kafka吞吐量高的原因?
?Kafka快的原因是他將一個個消息變成一個文件,通過mmp提高IO速度,寫入時在末尾直接添加,讀取時通過偏移量直接返回。
?
轉載于:https://www.cnblogs.com/wenxiangchen/p/11276590.html
總結
- 上一篇: vue 自定义封装组件 使用 mod
- 下一篇: script学习,如何用linux监控你