消息隊列的優缺點,使用場景
優點:
1、解耦,降低系統之間的依賴
2、異步處理,不需要同步等待
3、削峰填谷,将流量從高峰期引到低谷期進行處理
缺點:
1、增加了系統的複雜度,幂等、重複消費、消息丢失等問題的帶入
2、系統可用性降低,mq的故障會影響系統可用
3、一緻性,消費端可能失敗
場景:
日志采集、釋出訂閱等
如何保證消息不被重複消費
幂等:
一個資料或者一個請求,重複來多次,確定對應的資料是不會改變的,不能出錯。
思路:
- 如果是寫 redis,就沒問題,反正每次都是 set ,天然幂等性
- 生産者發送消息的時候帶上一個全局唯一的id,消費者拿到消息後,先根據這個id去 redis裡查一下,之前有沒消費過,沒有消費過就處理,并且寫入這個 id 到 redis,如果消費過了,則不處理。
- 基于資料庫的唯一鍵
Kafka、ActiveMQ、RabbitMQ、RocketMQ 對比
ActiveMQ:
JMS規範,支援事務、支援XA協定,沒有生産大規模支撐場景、官方維護越來越少
RabbitMQ:
erlang語言開發、性能好、高并發,支援多種語言,社群、文檔方面有優勢,erlang語言不利于java程式員二次開發,依賴開源社群的維護和更新,需要學習AMQP協定、學習成本相對較高以上吞吐量單機都在萬級