如何避免在 Apache Pulsar 中自动删除非活动主题

How to avoid the automatic deleting of inactive topics in Apache Pulsar

我有一个应用程序在特定主题下向 Pulsar 生成消息,并在完成后关闭该应用程序;同时,不存在阅读该主题的消费者。

过了一段时间,当我创建一个consumer,想把写入的数据读出来时,发现我写的topic被Pulsar删除了,所有数据都丢失了。

如何禁用 Pulsar 中不活动主题的自动删除?

一般来说,有两种方法可以实现。

  • 首先,retention policies 将数据保留至少 X 小时(直到 Y GB),您可以通过 pulsar-admin 在名称空间级别将其设置为无限。
  pulsar-admin namespaces set-retention my-tenant/my-ns \
  --size 1T \
  --time -1
  • 其次,在 conf/broker.conf 中手动设置 brokerDeleteInactiveTopicsEnabled=false 也可以禁止删除非活动主题。

建议同时设置以上两个设置,以便更好的控制。

如果您使用消费者客户端界面或 REST API 创建主题订阅,消息将一直保留到确认为止。订阅积压中未确认的消息将永远不会被删除,除非您配置生存时间 (TTL),它会在一段时间后自动确认消息。

不在订阅中或已被确认的消息将保留在基于 retention policy 的主题中。您可以指定按大小或时间保留的消息。

如果你想使用一个 Pulsar 主题,比如一个队列来保存所有消息,直到它们被确认,这听起来像你正在尝试做的,你只需要使用带有命名 subscription.然后,当您的应用程序处于非活动状态时,您的所有消息都将保留在主题中。并且因为该主题仍然有消息,它不会被自动删除(尽管您可以禁用该行为,如 yjshen 的回答中所述)。