我有一个应用程序在特定主题下向 Pulsar 生成消息,并在完成后关闭应用程序;同时,不存在阅读该主题的消费者。
过了一段时间,当我创建一个消费者,想把写入的数据读出来的时候,我发现我写的主题被Pulsar删除了,所有的数据都丢失了。
如何禁用 Pulsar 中非活动主题的自动删除?
我有一个应用程序在特定主题下向 Pulsar 生成消息,并在完成后关闭应用程序;同时,不存在阅读该主题的消费者。
过了一段时间,当我创建一个消费者,想把写入的数据读出来的时候,我发现我写的主题被Pulsar删除了,所有的数据都丢失了。
如何禁用 Pulsar 中非活动主题的自动删除?
通常,有两种方法可以实现这一点。
pulsar-admin
在命名空间级别将其设置为无限。 pulsar-admin namespaces set-retention my-tenant/my-ns \
--size 1T \
--time -1
brokerDeleteInactiveTopicsEnabled=false
的conf/broker.conf
删除。建议同时设置以上两个设置以进行正确控制。
如果您使用 Consumer 客户端界面或 REST API 在主题上创建订阅,则会保留消息,直到它们被确认。订阅积压中未确认的消息将永远不会被删除,除非您配置一个生存时间 (TTL),它会在一段时间后自动确认该消息。
不在订阅中或已确认的消息将根据保留策略保留在主题中。您可以指定要按大小或时间保留的消息。
如果你想使用一个 Pulsar 主题,比如一个保存所有消息直到它们被确认的队列,这听起来像是你想要做的,你只需要使用带有命名订阅的消费者客户端接口。然后,当您的应用程序处于非活动状态时,您的所有消息都将保留在主题中。并且由于该主题仍有消息,因此不会自动删除(尽管您可以禁用该行为,如 yjshen 的答案中所述)。