Multiple advertised listeners

当在生产环境中部署 Pulsar 集群时,broker 可能需要针对不同网络环境提供多个可访问的地址。 例如,当 Pulsar 集群部署在某个 Kubernetes 中时,如果从其他的 Kubernetes 中访问该 Pulsar 集群,则需要为每个外部客户端分配一个可访问的 broker URL。 同时需要确保,同一个 Kubernetes 集群中的客户端,仍需要能够通过内部的网络连接到 Pulsar 集群。

Advertised 监听器

为确保客户端能够从内部或外部网络连接到 Pulsar 集群,Pulsar 在 broker 配置文件中引入了两个配置项:advertisedListenersinternalListenerName,保证 broker 支持多个 Advertised 监听器,也实现了内部和外部网络流量之间的隔离。

  • advertisedListeners:用于指定多个 Advertised 监听器。 在负载管理器和 bundle owner 数据中,broker 将此监听器用作唯一标识符。 advertisedListeners 格式如下:<listener_name>:pulsar://<host>:<port>, <listener_name>:pulsar+ssl://<host>:<port>。 比如,你可以设置 advertisedListenersadvertisedListeners=internal:pulsar://192.168.1.11:6660,internal:pulsar+ssl://192.168.1.11:6651

  • internalListenerName:用于指定 broker 使用的内部服务的 URL。 你可以选择 advertisedListeners 中某一个监听器的名称作为 internalListenerName 的值。 如果没有指定 internalListenerName,则 broker 默认使用 Advertised 监听器列表中的第一个监听器作为 internalListenerName 的值。

设置 advertisedListeners 后,只要网络可用,客户端就可以选择一个监听器作为服务的 URL,用于连接到 broker。 但如果客户端在同一个 topic 上创建 producer 和 consumer,则客户端必须先发送查询请求到 broker,获取 owner broker,再连接到此 owner broker 上发布或消费消息。 因此,必须确保客户端可以通过使用的监听器名称获取服务的 URL。 保证客户端的操作简单、安全。

使用多个 Advertised 监听器

Pulsar 客户端使用多个 Advertised 监听器需要以下两步。

  1. 在 broker 配置文件配置多个 Advertised 监听器。
  1. advertisedListeners={listenerName}:pulsar://xxxx:6650,
  2. {listenerName}:pulsar+ssl://xxxx:6651
  1. 为客户端指定监听器名称。
  1. PulsarClient client = PulsarClient.builder()
  2. .serviceUrl("pulsar://xxxx:6650")
  3. .listenerName("external")
  4. .build();