在早期,我们的分布式消息中间件都是建立在ActiveMQ 5.x(prior to 5.3)之上。我们通过其作为异步消息通信、搜索、社交网络信息流、数据管道甚至在交易处理上,为我们的复杂多样的业务服务。但是随着我们业务交易的吞吐量上升,消息集群的压力也变得越来越大。
根据我们的调查,随着queue和虚拟topic使用的数量的增长,ActiveMQ的IO模块会到达一个瓶颈。我们竭尽全力去解决这个问题使用节流、断路、降级等方式,但是依然没有效果。所在在那时,我们开始将目标投向流行的消息解决方案kafka。而不幸的是,kafka不能达到我们的要求,特别是在低延迟和高可用方面,详细可以参考这里。
在这样的情况下,我们决定自己研发一款消息引擎,能提供更广泛的使用场景,从传统的发布订阅到海量实时,零丢失容忍的事务系统。我们相信这个解决方案是非常有用的,所以我们开源给社区。到今天,有超过100家公司在他们的业务中使用开源版本的RocketMQ。我们也发布了一款基于RocketMQ商用版本的PaaS产品,成为Alibaba ONS。
下面的表格列举了各款消息中间件的不同,包括RocketMQ、ActiveMQ和Kafka(根据awesome-java(一个java框架、类库和软件的精选清单),Apache中最受欢迎的消息解决方案)
请注意这份文档是RocketMQ团队撰写的,尽管我们的期望是公正的的技术和功能对照,但作者的专业知识会明显偏向于RocketMQ。
下表是简便快捷的参考,点出RocketMQ与和看似最受欢迎的替换品之间的区别。
消息产品 | 客户端sdk | 协议规范 | 消息有序性 | 延迟消息 | 批量消息 | 广播消息 | 消息过滤器 | 服务器重传 | 消息存储 | 消息追溯 | 消息优先级 | 高可用和容错 | 消息追踪 | 配置事宜 | 管理操作工具 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ActiveMQ | Java, .NET, C++ etc | push模型,支持OpenWire, STOMP, AMQP, MQTT, JMS | 单消费者或者单单队列可以保证顺序 | 支持 | 不支持 | 支持 | 支持 | 不支持 | 支持通过使用JDBC在高性能日志,如levelDB,kahaDB来快速持久化 | 支持 | 支持 | 支持,依赖存储方式,如果使用kahadb会使用zk的服务 | 不支持 | 默认配置是低水准的,使用者需要自定义配置参数来优化 | 支持 |
Kafka | Java, Scala etc. | pull模式,支持TCP | 分区内有序 | 不支持 | 当是异步生产者支持 | 不支持 | 支持,使用stream进行过滤 | 不支持 | 高性能文件存储 | 支持offset定位消息 | 不支持 | 支持,但需要zk服务 | 不支持 | 使用键值对配置,可以通过文件或者程序的方式 | 支持,使用终端命令去查看指标 |
RocketMQ | Java, C++, Go | pull模式,支持 TCP, JMS, OpenMessaging | 确保严格的顺序和平滑拓展 | 支持 | 支持,使用同步模式避免消息丢失 | 支持 | 支持,建立在SQL92上的属性过滤表达式 | 支持 | 高性能和低延迟文件存储 | 支持时间戳和offset两种方式定位消息 | 不支持 | 支持,主从模式不需要额外的工具 | 支持 | 集成在box中,用户只需要关注很少的配置项 | 支持,丰富的web和终端命令查看指标 |