gpt4 book ai didi

java - 如何以稳健的方式处理kafka发布失败

转载 作者:IT王子 更新时间:2023-10-29 05:55:48 24 4
gpt4 key购买 nike

我正在使用 Kafka,我们有一个构建容错系统的用例,在该系统中甚至不应遗漏任何一条消息。所以这是问题所在:如果由于任何原因(ZooKeeper 宕机、Kafka 代理宕机等)发布到 Kafka 失败,我们如何才能稳健地处理这些消息并在事情再次备份后重播它们。正如我所说,我们甚至不能承受单个消息失败。另一个用例是我们还需要知道在任何给定时间点有多少消息由于任何原因而未能发布到 Kafka,例如计数器功能,现在这些消息需要再次重新发布。

解决方案之一是将这些消息推送到某个数据库(例如 Cassandra,其中写入速度非常快,但我们还需要计数器功能,我猜 Cassandra 计数器功能不是那么好,我们不想使用它。)它可以处理这种负载,还可以为我们提供非常准确的计数器设施。

这个问题更多是从架构的角度出发,然后是使用哪种技术来实现这一点。

PS:我们处理一些像 3000TPS 这样的地方。因此,当系统开始失败时,那些失败的消息会在很短的时间内快速增长。我们正在使用基于 Java 的框架。

感谢您的帮助!

最佳答案

Kafka之所以以分布式、容错的方式构建,就是为了像你这样处理问题,核心组件的多次故障应该避免服务中断。为避免 Zookeeper 宕机,请至少部署 3 个 Zookeeper 实例(如果这是在 AWS 中,则将它们部署在可用区域之间)。为避免代理失败,部署多个代理,并确保您在生产者 bootstrap.servers 属性中指定多个代理。为确保 Kafka 集群已将您的消息写入持久庄园,请确保在生产者中设置了 acks=all 属性。这将在所有同步副本确认消息的接收时确认客户端写入(以吞吐量为代价)。您还可以设置排队限制,以确保如果对代理的写入开始备份,您可以捕获异常并处理它并可能重试。

使用 Cassandra(另一个经过深思熟虑的分布式容错系统)来“暂存”您的写入似乎并没有为您的架构增加任何可靠性,但确实增加了复杂性,而且 Cassandra 并不是为了成为一个消息队列的消息队列,我会避免这种情况。

正确配置后,Kafka 应该可以处理您所有的消息写入并提供适当的保证。

关于java - 如何以稳健的方式处理kafka发布失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40183133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com