常见消息队列|青训营

156 阅读5分钟

常见消息队列介绍

1. RocketMQ

阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq,并做出了自己的一些改进,消息可靠性上比Kafka更好。同时将阿里系内部多款mq产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,RocketMQ在阿里内部被广泛应用在订单、交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

主要特性

  1. 基于队列模型:具有高性能、高可靠、高实时、分布式等特点;
  2. Producer、Consumer、队列都支持分布式;
  3. Producer向一些队列轮流发送消息,队列集合称为Topic。Consumer如果做广播消费,则一个Consumer实例消费这个Topic对应的所有队列;如果做集群消费,则多个Consumer 实例平均消费这个Topic对应的队列集合;
  4. 能够保证严格的消息顺序;
  5. 提供丰富的消息拉取模式;
  6. 高效的订阅者水平扩展能力;
  7. 实时的消息订阅机制;
  8. 亿级消息堆积 能力;
  9. 较少的外部依赖;
  10. 提供针对消息的过滤功能。

阿里官方提供了一些不同于kafka的对比差异: Motivation - Apache RocketMQ

优点

  1. 单机支持1万以上持久化队列;
  2. RocketMQ的所有消息都是持久化的,先写入系统PAGECACHE,然后刷盘,可以保证内存与磁盘都有一份数据,而访问时,直接从内存读取。
  3. 模型简单,接口易用(JMS的接口很多场合并不太实用);
  4. 性能非常好,可以允许大量堆积消息在Broker中;
  5. 支持多种消费模式,包括集群消费、广播消费等;
  6. 各个环节分布式扩展设计,支持主从和高可用;
  7. 开发度较活跃,版本更新很快。

缺点

  1. 支持的客户端语言不多,目前是Java及C++,其中C++还不成熟;
  2. RocketMQ社区关注度及成熟度也不及RabbitMQ、Kafka;
  3. 没有Web管理界面,提供了一个 CLI (命令行界面) 管理工具带来查询、管理和诊断各种问题;
  4. 没有在MQ核心里实现JMS等接口;

2.Kafka

Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,Kafka是一个开源的分布式发布-订阅消息系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的日志提交系统(a distributed commit log),之后成为Apache项目的一部分。Kafka性能高效、可扩展良好并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。

Kafka主要为高吞吐量的订阅发布系统而设计,追求速度与持久化。kafka中的消息由键、值、时间戳组成,kafka不记录每个消息被谁使用,只通过偏移量记录哪些消息是未读的,kafka中可以指定消费组来实现订阅发布的功能。

主要特性

  1. 快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化;
  2. 高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;
  3. 完全的分布式系统:Broker、Producer和Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡;
  4. 高堆积:支持topic下消费者较长时间离线,消息堆积量大;
  5. 支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案;
  6. 支持同步和异步复制两种高可用机制;
  7. 支持数据批量发送和拉取;
  8. 零拷贝技术(zero-copy):减少IO操作步骤,提高系统吞吐量;
  9. 数据迁移、扩容对用户透明;
  10. 无需停机即可扩展机器;
  11. 其他特性:丰富的消息拉取模型、高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、定期删除机制;

优点

  1. 客户端语言丰富:支持Java、.Net、PHP、Ruby、Python、Go等多种语言;
  2. 高性能:单机写入TPS约在100万条/秒,消息大小10个字节;
  3. 提供完全分布式架构,并有replica机制,拥有较高的可用性和可靠性,理论上支持消息无限堆积;
  4. 支持批量操作;
  5. 消费者采用Pull方式获取消息。消息有序,通过控制能够保证所有消息被消费且仅被消费一次;
  6. 有优秀的第三方KafkaWeb管理界面Kafka-Manager;
  7. 在日志领域比较成熟,被多家公司和多个开源项目使用。

缺点

  1. Kafka单机超过64个队列/分区时,Load时会发生明显的飙高现象。队列越多,负载越高,发送消息响应时间变长;
  2. 使用短轮询方式,实时性取决于轮询间隔时间;
  3. 消费失败不支持重试;
  4. 支持消息顺序,但是一台代理宕机后,就会产生消息乱序;
  5. 社区更新较慢。