这几天针对高性能,强顺序的MQ产品进行了测试和选型,主要针对的是apache kafka和apache rocketmq 两款产品。
对两端产品的特性做一个简单的阐述:
rocketmq 是国内阿里巴巴出产,来自大厂,听说经过双十一洗礼,稳定可靠,主要针对电商场景,支持事务消息,支持延迟消息(用于付款),支持多副本(高可用),消息严格有序,性能测试与kafka不相上下,异步刷盘和同步刷盘,消息持久化。每个topic下都有读/取 队列划分,可以路由消息到指定队列,这一点和kafka的消息分区概念接近。
kafka 出自国际大厂 linkin, 目前主要创始人目前自立门户创办了公司 confluent并且推出开源的平台和组件,稳定可靠,上手部署快。各种大厂都在用,用户群体广,稳定可靠,但是有些问题。其支持的特性是 异步刷盘、0.10版本开始支持事务消息和流处理,支持多副本,要严重依赖zookeeper实现副本集群和leader、follower切换,支持topic分区。
不支持 延迟消息队列(要靠自己实现),因消费通过offset进行确认的机制,导致消息卡顿和消息重复消费。
kafka 的事务消息与 rocketmq 实现方式有差异,kafka 的事务可以跨分区并且有回滚操作,而rocketmq 采用2PC 强一致的方式进行。
kafka 会在生产者与broker两端可能丢失部分消息,kafka的生产者将累计消息发送,而不是一条消息就发送一次,所以当消息没有达到发送阈值生产者又异常退出,则消息丢失。
kafka 和rmq都是用的page cache,而不是堆内存,所以应用退出后操作系统会保证数据写回磁盘。
rocketmq 主要针对的是topic 数据,而kafka 则已经扩展至stream.
rocketmq 对每一条消息都要设置key与tag ,没有Key与tag的消息容易出现不可预期的问题。
rocketmq consumer 有两种方式,一种是pull consumer,一种是push consumer
pull 为主动拉取,可以拉取指定offset和message queue 的消息, 适合补充消费。Pull模式为严格排序方式。
push 为被动推,又可分为多线程乱序方式与严格排序方式,严格排序方式无论多少线程,都会变成单线程模式。