(4)RabbitMQ和Kafka显著差异(2)

2020-11-16  本文已影响0人  hedgehog1112

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

上一篇 下一篇

猜你喜欢

热点阅读