是否在Kafka和ActiveMQ中保证完整性?

问题描述

我发现将Apache Kafka和ActiveMQ(以及类似的消息队列产品)进行比较的信息永远不清楚每种解决方案的完整性(特别是一致性)。

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

“无损失”是指即使重新启动后失败,消息仍可用于客户端-理想情况下,所有消息均以正确的顺序到达客户端。

ActiveMQ(“经典”或Artemis)是否保证在失败时不会丢失消息?是否有任何可以保证的配置选项?如果“经典”与阿尔emi弥斯的答案有所不同,那真是太好了。

解决方法

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

这是一个大话题。

保证没有消息丢失

这取决于几件事。首先,您可以配置保留-在特定时间段内,对于您来说 fine 邮件丢失。您可能会考虑infinite retention,但要注意您有足够的存储空间,也许您需要对该主题进行压缩

即使存在故障;我猜您松开使用“ LazyPersistence”选项的保证,对吗?

Kafka是一个分布式系统,对于分布式系统来说,与同步磁盘写入相比,它更多地依赖分布式复制。即使您将 synchronous 写入磁盘,磁盘也可能会死掉并丢失。您要在何种程度上使用分布式复制(例如3或6个副本?)和同步异步磁盘写入取决于您的要求-但它还在吞吐量中具有权衡。例如。 AWS Aurora是使用6个副本的分布式数据库。

,

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

Kafka的方法是将数据复制到服务器后对其进行复制。正如@Jonas提到的,需要进行总吞吐量的权衡。 Kafka的生产者通常是开箱即用的异步设备,因此可以合理地预期一个过程(容器重新启动)或网络中断将导致生产者应用程序侧出现明显的消息丢失。另外,由于进程或服务器端Kafka故障,LazyPersistence可能导致合理可观察的消息丢失。

ActiveMQ的方法是使用OS系统调用fsync()将数据同步到磁盘,这应该导致写入磁盘。将其与RAID存储设备结合使用时,可以最切实地保证数据不会丢失。

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

通常称为“扇出”。 ActiveMQ的客户端中包含一个扇出传输。像这样工作:

  1. 生产者将消息发送到3台服务器(它们应尽可能隔离并彼此分开)。
  2. 消费者最多收到3条消息。
  3. 通过“获胜”获得的第一条消息,消费者应用删除了另外2条消息。

使用这种方法,您可以完全跳过持久性,因为您有3条独立的路由,而这3条故障的机率都很低。 (如果生产者的网络处于脱机状态,则有一些策略可以改善生产者端的QOS)。

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