消息队列:
类似一个消息系统,读写流式,消息顺序性保障,已及回溯消费的能力
功能项 | Kafka(1.1.0版本) | RabbitMQ(3.6.10版本) |
---|---|---|
优先级队列 | 不支持 | 支持。 建议优先级大小设置在0-10之间。 |
延迟队列 | 不支持 | 支持 |
死信队列 | 不支持 | 支持 |
重试队列 | 不支持 | 不支持。 RabbitMQ中可以参考延迟队列实现一个重试队列,二次封装比较简单。 如果要在Kafka中实现重试队列,首先得实现延迟队列的功能,相对比较复杂。 |
消费模式 | 推模式 | 推模式+拉模式,业务中更多的是用推模式 |
广播消费 | 支持。 Kafka对于广播消费的支持相对而言更加正统。 |
支持。 但力度较Kafka弱。 |
消息回溯 | 支持。 Kafka支持按照offset和timestamp两种维度进行消息回溯。 |
不支持。 RabbitMQ中消息一旦被确认消费就会被标记删除。 |
消息堆积 | 支持 | 支持。 一般情况下,内存堆积达到特定阈值时会影响其性能,但这不是绝对的。 如果考虑到吞吐这因素,Kafka的堆积效率比RabbitMQ总体上要高很多。 |
持久化 | 支持 | 支持 |
消息追踪 | 不支持。 消息追踪可以通过外部系统来支持,但是支持粒度没有内置的细腻。 |
支持。 RabbitMQ中可以采用Firehose或者rabbitmq_tracing插件实现。 不过开启rabbitmq_tracing插件件会大幅影响性能,不建议生产环境开启, 反倒是可以使用Firehose与外部链路系统结合提供高细腻度的消息追踪支持。 |
消息过滤 | 客户端级别的支持。 Java一般在拦截器中过滤,PHP没有。 |
不支持。 但是二次封装一下也非常简单。 |
多租户 | 不支持 | 支持 |
多协议支持 | 只支持定义协议,目前几个主流版本间存在兼容性问题。 | RabbitMQ本身就是AMQP协议的实现,同时支持MQTT、STOMP等协议。 |
跨语言支持 | 采用Scala和Java编写,支持多种语言的客户端。 | 采用Erlang编写,支持多种语言的客户端。 |
流量控制 | 支持client和user级别,通过主动设置可将流控作用于生产者或消费者。 | RabbitMQ的流控基于Credit-Based算法,是内部被动触发的保护机制,作用于生产者层面。 |
消息顺序性 | 支持单分区(partition)级别的顺序性。 | 顺序性的条件比较苛刻,需要单线程发送、单线程消费并且不采用延迟队列、 优先级队列等一些高级功能,从某种意义上来说不算支持顺序性。 |
安全机制 | (TLS/SSL、SASL)身份认证和(读写)权限控制 | 与Kafka相似 |
幂等性 | 支持单个生产者单分区单会话的幂等性。 | 不支持 |
事务性消息 | 支持 | 支持 |
- kafka producer == rabbitmq producer
- kafka topic == rabbitmq exchange
- kafka consumer group == rabbitmq queue
- kafka consumer == rabbitmq consumer