Message Queue 消息队列&常用消息中间件

本文介绍了消息队列(MQ)的基本概念,包括其在系统解耦、异步处理和削峰填谷等方面的优势,以及可能带来的系统复杂性和一致性问题。详细对比了ActiveMQ、RabbitMQ、RocketMQ和Kafka四种主流消息中间件的特性,如吞吐量、可用性、时效性等,并探讨了它们在高可用方案、消息丢失预防和重复消费防止等方面的处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Message Queue 消息队列概述

MQ(Message Queue)消息队列,直白定义为把要传输的数据消息放在队列中。

  •  把数据放到消息队列叫做生产者
  •  从消息队列中取数据叫做消费者

优点:

  1. 降低系统耦合性 —— 解耦;
  2. 异步处理提高系统性能 —— 减少响应所需时间;
  3. 削峰&限流。

缺点:

  1. 系统可用性降低;
  2. 系统复杂度提高;
  3. 一致性问题。

JMS规范

JMS(Java Message Service Java消息服务)JMS API是消息服务的标准OR规范,ActiveMQ就是基于JMS规范实现的。

JMS消息模式:

  • 点对点模式(P2P)使用队列(Queue)作为消息通信载体,满足生产者和消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直至被消费或超时;
  • 发布、订阅模式(Pub/Sub)使用主题(Topic)作为消息通信载体,类似广播模式,生产者分布一条消息,该消息会通过主题传递给所有的消费者。

JMS消息类型:

  • StreamMessage:数据流消息
  • MapMessage:键值对消息
  • TextMessage:字符串消息
  • ObjectMessage:Java对象消息
  • BytesMessage:字节流消息

AMQP协议

AMQP(Advanced Message Queuing Protocol 高级消息队列协议)是一个提供统一消息服务的应用层标准高级消息队列协议,为面向消息的中间件设计,兼容 JMS。基于此协议的客户端与消息中间件可传递消息,并不受客户端或中间件同产品和不同的开发语言等条件的限制。RabbitMQ 就是基于 AMQP 协议实现的。

AMQP消息模型:

  • direct exchange
  • fanout exchange
  • topic exchange
  • headers exchange
  • system exchange

AMQP消息类型:

  • byte[](二进制)

常用消息中间件概述及对比

ActiveMQ

 

RabbitMQ

 

RocketMQ

 

Kafka

 

常用消息中间件对比
消息中间件吞吐量可用性时效性功能支持消息丢失支持协议支持语言持久化社区活跃&商业化推荐指数
ActiveMQ万级主从高可用毫秒级(ms)MQ功能完备可能性很低JMS规范实现&可插拔的协议支持多语言支持  
RabbitMQ十万级主从高可用微秒级(ws)MQ功能完备可能性很低AMQP协议实现&支持多协议多语言支持  ❤❤❤
RocketMQ百万级分布式高可用毫秒级(ms)MQ功能完备理论上不会基于Java实现支持Java   阿里云❤❤
Kafka百万级分布式高可用毫秒级(ms)MQ功能简单,大数据领域实时计算&日志采集理论上不会基于Scala实现的一个高性能分布式Publish/Subscribe消息队列系统  磁盘 ❤❤

 

消息中间件常见问题处理

高可用方案

  • ActiveMQ 和 RabbitMQ 为主从高可用(以RabbitMQ为例阐述主从高可用)

        RabbitMQ支持单机、普通集群和镜像集群三总部署模式,只有镜像集群模式才是高可用模式。在镜像集群模式下,你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,也就是说,每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 上。

如何开启RabbitMQ镜像集群模式?

RabbitMQ 有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。

不足之处:

1.性能开销大,消息需要同步到所有机器上,导致网络带宽压力和消耗很重;

2.无实现线性扩展。

  • RocketMQ 和Kafka 通过分布式实现高可用(以Kafka为例阐述分布式高可用)

        Kafka由多个 broker 组成,每个 broker 是一个节点;你创建一个 topic,这个 topic 可以划分为多个 partition,每个 partition 可以存在于不同的 broker 上,每个 partition 就放一部分数据。

 

防消息丢失

防重复消费

 

消费顺序性

 

过期失效

 

参考资料:消息中间件面试题

 

TODO:具体深入学习各常用消息中间件 20190808

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值