【问题标题】:Does Kafka handle network failure better than RabbitMQ?Kafka 是否比 RabbitMQ 更好地处理网络故障?
【发布时间】:2015-09-17 17:08:47
【问题描述】:

我们遇到了来自 RabbitMQ 的以下问题,并且每个周末都手动重新启动服务器作为解决方法。

Network partition detected
Mnesia reports that this RabbitMQ cluster has experienced a network partition. This is a dangerous situation. RabbitMQ clusters should not be installed on networks which can experience partitions.

我们浏览过有关该主题的其他热门帖子,例如herehere

我们的网络不是很可靠,偶尔会出现故障,但是当它出现时,我预计 4 个节点的 RabbitMQ 集群中的 1 个会加入集群的其余部分 - 就像安装了 4 个 Tomcat 节点的情况一样服务器。

  1. 虽然单个分区上的节点继续独立运行,但这似乎不是一个节点故障的优雅恢复。
  2. 我们在使用任何rabbitmqctl 命令(如rabbitmqctl cluster_status)时运气不佳 - 它曾经偶尔导致rabbitmq 进程挂起,这需要对RabbitMQ 进程执行sudo kill。

我们正在评估迁移到 Kafka 或任何其他能够很好地处理消息分区的消息代理

任何关于不需要手动重启 RabbitMQ 或 Kafka 处理这种情况的能力的想法都非常感谢

【问题讨论】:

  • 您是否尝试过使用 federation(或 shovel )插件?而不是我的意思是集群。是否适合您的应用?
  • 不幸的是它不适合!

标签: rabbitmq apache-kafka


【解决方案1】:

我认为具有复制功能的 Kafka 应该能够很容易地处理网络分区,只要分区的代理数量低于主题的复制因子(也就是说,消费者和生产者总是可以达到至少 1 个代理他们正在操作的主题)。

为了避免在 Zookeeper 发现分区并将信息传播给生产者和消费者时客户端的背压,您可能需要设置较短的 ZK 心跳(是的,您需要 ZK,并且还需要一个集群,因为您绝对不需要)不希望你的整个 ZK 集群被分区)。

尽管警告:使用 kafka 代理集群会丢弃消息队列的 FIFO 方面,如果您期望生产者生成并由消费者读取的消息顺序相同,这可能会非常令人不安,您可以期待 RabbitMQ。

【讨论】:

  • 这很有见地,消息的顺序对我们来说并不重要——只有恢复——如果 Zookeeper 服务器宕机了怎么办? - Zoo Keeper 是否也有某种故障转移机制?
  • ZK 是健壮的,只要您至少有一台服务器在我没记错的情况下回答(我不能 100% 确定它是至少一个答案还是法定人数),因此需要有一个集群。重新连接时,分区的服务器将自动重新加入。如果需要,您可以将它们安装在 kafka 代理上,但我建议您使用另一个物理磁盘,以免破坏基于顺序 I/O 的 kafka 可伸缩性。
猜你喜欢
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多