1、RabbitMQ是消息代理,难保流式中消息顺序。 Kafka是分布式流式系统。
2、RabbitMQ内置重试逻辑和死信交换器,Kafka把这些交给用户处理
1、消息顺序
(1)RabbitMQ:1)单个消费者,有序。2)多个消费者从同队列中读,难保顺序:比如读后可能放回(或重传)到队列中(如失败),另一个消费者可继续处理它。3)解决:可限制消费者并发数=1,保证有序性
(2)Kafka:用循环分区器(round-robin partitioner)消息放到相应分区上。生产者给每个消息设置分区键创建数据逻辑流(如来自同一设备,或同一租户消息)
来自相同流消息放到相同分区中,消费者组就可顺序处理
2、消息路由(Rabbit好)
RabbitMQ:主题交换器通过routing_key的特定头来路由消息。或头部(headers)交换器基于任意消息头来路由消息。
Kafka:不允许消费者过滤主题中消息。接受分区所有消息
3、消息时序(Rabbit好)
RabbitMQ提供多种能力,Kafka没有:
1)消息存活时间(TTL)
发布者设置TTL 或 根据队列策略来设置。
预期时间没处理,自动从队列移除(移到死信交换器上,之后消息都这样处理)
2)延迟/预定消息
通过插件延迟/预定消息,当插件在消息交换器上启用时,生产者发消息到RabbitMQ,生产者延迟RabbitMQ路由,来延迟消息时间
4、消息留存
RabbitMQ:消费后,删除
Kafka:1)只要没超时都保留。把消息当日志看待,不关心消费状态
2)不限次数消费,操作分区偏移“及时”往返处理
3)Kafka存储消息不影响性能(只节点足够)
5、容错处理(Rabbit好)
“重试,直到成功” 表面看没错,妥善处理:
1)瞬时故障—如网络连接,CPU负载,或者服务崩溃。重试ok
2)持久故障——bug或无效消息格式。重试不行
RabbitMQ提供交付重试和死信交换器(DLX)处理,开箱即用,重试计数及发到“人为干预”队列。
不阻塞,不影响整个系统:消费者处理或重试时,其他消费者可并发处理之后其他消息。
ps:提供了额外的可能模式视角:https://engineering.nanit.com/rabbitmq-retries-the-full-story-ca4cc6c5b493
总结:如何选择?
RabbitMQ:1)灵活路由规则;更简单 2)消息时序控制(控制消息过期或者消息延迟);3)容错高,消费者可能不成功场景。
选Kafka:1)严格消息顺序2)延长消息留存时间,包括过去消息重放可能; 3)提供高伸缩能力
https://zhuanlan.zhihu.com/p/161224418
网友评论