在群集和FT模式下,NATS流提供什么消息持久性保证?

问题描述

我正在寻找一种具有消息持久性保证的流服务器,即在服务器确认向生产者发布之前,保证生产者发布的消息可以持久存储的地方。

我的用例要求我们减少丢失任何产生的消息的可能性。生产者可以根据需要重播消息,但是他们需要确保ACKed消息能够持久保存,并由流服务器将其传递给消费者。

NATS Streaming服务器似乎在这些方面做了一些工作,但是clusteringfault tolerance的文档并未明确说明在每种情况下都提供了什么持久性保证。 producer integration上的文档确认服务器将同步或通过回调主动确认已发布的消息,但并不清楚ACK是否意味着该消息已持久存储。

有关存储配置的文档,特别是SQL options简要地提到了服务器的ACK意味着持久的存储保证,但是尚不清楚在群集和容错以及不同的持久性后端的情况下,它的适用性如何(文件sql)。

解决方法

NATS流将在发送回发布者ACK之前保留该消息。存储区的实现(文件存储区/ SQL)可能会使用一些缓存,但是无论如何,写入会在发回ACK之前进行同步(除非禁用)。

但是,在集群模式下,文件存储同步被禁用,因为我们依赖于将数据复制到集群的每个节点这一事实,因此一次丢失多个消息将需要多次失败。 (请注意,文件存储实现有一个选项,可以定期执行自动同步:请参见auto_sync here