Kafka 与 ActiveMQ 的完整性保证?

问题描述 投票:0回答:2

我发现比较 Apache Kafka 和 ActiveMQ(以及类似的消息队列产品)的信息从来都不清楚每个解决方案的完整性属性(尤其是一致性)。

使用 Kafka,即使出现故障,您也可以保证不会丢失消息。使用“LazyPersistence”选项您会失去这种保证吗?

“无丢失”是指即使在重新启动后出现故障,消息也可供客户端使用 - 理想情况下,所有消息都以正确的顺序到达客户端。

ActiveMQ(“经典”或 Artemis)是否保证在失败时不会丢失消息?有什么配置选项可以保证这一点吗?如果“经典”与阿耳忒弥斯的答案有所不同,那就很高兴知道。

apache-kafka activemq activemq-artemis
2个回答
1
投票

任何解决方案都没有合理或实用的方法来“不丢失消息”。

Kafka 的方法是数据到达服务器后就进行复制。正如@Jonas 提到的,存在总吞吐量的权衡。 Kafka 的生产者通常是开箱即用的异步,因此可以合理地预期进程(容器重新启动)或网络中断将导致生产应用程序端发生可观察到的消息丢失。此外,由于进程或服务器端 Kafka 故障,LazyPersistence 可能会导致合理可观察到的消息丢失。

ActiveMQ 的方法是使用操作系统系统调用 fsync() 将数据同步到磁盘,这应该会导致写入磁盘。当您将其与 RAID 存储结合使用时,您将获得最实际的数据不丢失保证。

但是,有一种与持久性无关的替代模式可以实现更高程度的保证。一些金融交易系统和国防应用程序使用它。

通常称为“扇出”。 ActiveMQ 在其客户端中包含扇出传输。工作原理如下:

  1. Producer 向 3 个服务器发送消息(它们应尽可能相互隔离和分开)。
  2. 消费者最多收到 3 条消息。
  3. 第一条消息通过“wins”,消费者应用程序会丢弃其他 2 条消息。

通过这种方法,您可以完全跳过持久性,因为您有 3 条独立的路线,并且所有 3 条路线都失败的几率很低。 (在事件生产者网络离线的情况下,有改善生产者端QOS的策略)。

消费者可以选择处理第一条消息(快速)或需要至少 2 条消息来处理并验证请求是否合法(安全,但延迟更高)。


0
投票

使用Kafka,即使出现故障,您也可以保证不会丢失消息;我猜你会失去使用“LazyPersistence”选项的保证,对吗?

这是一个很大的话题。

保证消息不丢失

这取决于一些事情。首先,您可以配置保留 - 在特定时间段之后,消息丢失对您来说“很好”。您可能会考虑无限保留,但也要注意您有足够的存储空间,也许您需要主题的压缩

即使出现故障;我猜你会失去使用“LazyPersistence”选项的保证,对吗?

Kafka 是一个
分布式系统

,分布式系统通常更多地依赖于分布式复制而不是同步磁盘写入。即使您将“同步”写入磁盘 - 磁盘也可能死亡并丢失。您想要在多大程度上使用分布式复制(例如 3 个或 6 个副本?)和同步异步磁盘写入取决于您的需求 - 但它在吞吐量方面也有权衡。例如。 AWS Aurora 是一个使用 6 个副本的分布式数据库。

© www.soinside.com 2019 - 2024. All rights reserved.