天天看點

面試中常用消息中間件對比

消息隊列的優缺點,使用場景

優點:

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協定、學習成本相對較高以上吞吐量單機都在萬級

kafka:

rocketmq: