带你认识开源消息队列

国内开源项目实在令人敬佩,RocketMQ在Apache中顺利孵化,那么什么是消息队列,使用什么场景下?先看下本文的目录:

  1. 消息队列使用场景

  2. 常见的消息队列有哪些

  3. Topic为何物

  4. 分区为何物

1. 消息队列使用场景

使用消息队列具体能做什么呢?

主题订阅、消息优先级、消息持久化、消息的可靠投递、分布式事务、异构系统对接整合。

带你认识开源消息队列

消息队列作用,来自阿里的云栖社区

  1. 对异构系统的整合,例如使用不同开发语言的系统之间的通信。

  2. 应用和应用之间的松耦合。

  3. 用做事件通知,作为事件驱动架构、复杂事件架构模型里面的backbone。

  4. 数据复制通道,这个有很多比较典型的应用场景,比如模拟MySQL的binlog解析,将数据的变更封装为消息,进而复制到远端的另外一个数据源。

  5. 与流计算引擎的整合,像和Apache Storm、Spark、Flink等框架进行整合。

2. 常见的消息队列有哪些,各有哪些优势,如何选择?

常见的消息队列有kafka、RocketMQ、RabbitMQ、ActiveMQ

Kafka

Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。kafka具有百万级的TPS,但在过多的topic以及消息比较大的情况下,TPS就不行了,大的吞吐量得益于kafka的batch,如果关闭了,也就有3W左右的TPS。但人家处理大数据,大多处于离线和半离线,对丢数据不敏感。Kafka在小消息性能传输上是性能最佳的一个。

RabbitMQ

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、

可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,例如银行,对性能和吞吐量的要求还在其次。

RocketMQ

RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

ActiveMQ

作为apache老牌消息队列,实现了JMS规范并支持多种语言开发,支持多种传输协议,例如HTTP,HTTPS,IP多点传送,SSL,STOMP,TCP,UDP,XMPP等。消息可以持久化,ActiveMQ通过KahaDB提供自己的超快速消息持久方案。总结一句就是:宝刀未老。在性能、可靠、实施上要求不是很苛刻的话,仍可选择它。

介绍完了,那么我们怎么选择呢?

kafka:Topic不是很多,消息通常比较小,对数据完整性要求不是很严苛,通常使用日志收集、处理离线数据,对丢失又不敏感,选用kafka。

RabbitMQ:不要求高并发,不要求高性能、只求数据可靠、支持事务。选RabbitMQ

RocketMQ:最性能要求较高、高并发、高可用。和kafka相比,可以使用较多的Topic而不影响其性能,对消息的刷盘方式和kafka不同,数据安全性提高了,同时也支持了事务操作。选择RocketMQ。

ApacheMQ:老牌了,现在很多保守的公司依然在使用,运行仍然良好,但是性能、可靠性、以及高可用方案的实施捉襟见肘。

3. Topic为何物

Topic是消息中间件里一个重要的概念,每一个Topic代表了一类消息,有了多个Topic,就可以对消息进行归类与隔离。

可以参照下图的动物园喂食模型,每一种动物都只能消费相对应的食品。

带你认识开源消息队列

分区为何物

Kafka和RocketMQ都是磁盘消息队列的模式,对于同一个消费组,一个分区只支持一个消费线程来消费消息。过少的分区,会导致消费速度大大落后于消息的生产速度。所以在实际生产环境中,一个Topic会设置成多分区的模式,来支持多个消费者,负载均衡嘛,参照下图:

带你认识开源消息队列

上面内容是对消息队列整体的overview,根据业务需要,可以选择一款符合要求的上手即可,后续我打算重点对RocketMQ做使用说明。再次向阿里开源致敬。


分享到:


相關文章: