kafka和Rocketmq如何保证消息投递可靠性

2022-09-07 08:35:52

kafka:

生产者ack参数

  • ack=0, 生产者在成功写入消息之前不会等待任何来自服务器的相应。如果出现问题生产者是感知不到的,消息就丢失了。不过因为生产者不需要等待服务器响应,所以它可以以网络能够支持的最大速度发送消息,从而达到很高的吞吐量。
  • ack=1,只要集群的首领节点收到消息,生产这就会收到一个来自服务器的成功响应。如果消息无法达到首领节点(比如首领节点崩溃,新的首领还没有被选举出来),生产者会收到一个错误响应,为了避免数据丢失,生产者会重发消息。但是,这样还有可能会导致数据丢失,如果收到写成功通知,此时首领节点还没来的及同步数据到follower节点,首领节点崩溃,就会导致数据丢失。
  • ack=-1, 只有当所有参与复制的节点都收到消息时,生产这会收到一个来自服务器的成功响应,这种模式是最安全的,它可以保证不止一个服务器收到消息。

刷盘参数

  • log.flush.interval.messages //多少条消息刷盘1次
  • log.flush.interval.ms //隔多长时间刷盘1次
  • log.flush.scheduler.interval.ms //周期性的刷盘。

RocketMq:

开启故障规避,broker主节点挂掉后,消息可以投递到其他broker。

broker主从节点配置为同步复制,同步刷盘(对性能有影响)。

参考文章:

https://www.jianshu.com/p/9a31538ea4b3

https://blog.csdn.net/u013128262/article/details/105290796

  • 作者:chuixue24
  • 原文链接:https://blog.csdn.net/chuixue24/article/details/115172030
    更新时间:2022-09-07 08:35:52