Go客户端连接Pulsar集群必须正确配置serviceUrl(如pulsar://localhost:6650或pulsar+ssl://...)和认证方式(如TokenAuth),且Topic需符合persistent://tenant/namespace/topic格式,Consumer订阅类型应根据扩容需求选Shared或KeyShared,推荐用pulsarctl替代pulsar-admin进行集群管理。

Go client 连接 Pulsar 集群必须指定 serviceUrl 和认证方式
不配 serviceUrl 或配错协议(比如用 http:// 代替 pulsar://),PulsarClient 初始化直接 panic,错误信息通常是 failed to create client: failed to connect to broker。本地开发用 standalone 模式时,URL 是 pulsar://localhost:6650;生产环境通常走 TLS,得用 pulsar+ssl:// 并配证书路径。
如果集群启用了 Token 认证(常见于云厂商托管 Pulsar),必须显式传入 TokenAuth:
auth := auth.NewAuthenticationToken("eyJhbGciOiJIUzI1NiJ9...")<br>client, err := pulsar.NewClient(pulsar.ClientOptions{<br> URL: "pulsar+ssl://pulsar.example.com:6651",<br> Authentication: auth,<br>})
-
serviceUrl必须指向 Broker 的 pulsar 协议端口(默认 6650/6651),不是 Admin API 的 HTTP 端口(8080) - Token 字符串不能带
Bearer前缀,否则认证失败 - 自签名证书环境下需设置
TLSAllowInsecureConnection: true,但生产禁用
Topic 名称格式决定消息存储行为和租户隔离粒度
Pulsar 的 topic 全名是 persistent://tenant/namespace/topic 或 non-persistent://...。漏写 persistent:// 前缀会导致消息只存在内存、重启即丢;写错 tenant 或 namespace 会报 Topic not found 或权限拒绝。
Kratos 服务里发消息时,topic 必须与集群已创建的租户/命名空间匹配。例如:
producer := client.CreateProducer(pulsar.ProducerOptions{<br> Topic: "persistent://default/public/my-event",<br>})
-
default是租户名,public是 namespace 名,两者需提前用pulsarctl或 Admin API 创建 - 生产环境建议按业务域划分 tenant(如
order、user),避免 namespace 冲突 - 非持久化 topic(
non-persistent://)仅用于低延迟内部通信,不可靠,别用在关键链路
Consumer 订阅模式选错会导致消息丢失或重复消费
Go client 创建 consumer 时,SubscriptionType 参数决定消息分发逻辑。默认是 pulsar.Exclusive,但 Kratos 微服务常需水平扩缩容,这时必须用 pulsar.Shared 或 pulsar.KeyShared。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
示例:
consumer, err := client.Subscribe(pulsar.ConsumerOptions{<br> Topic: "persistent://default/public/order-created",<br> SubscriptionName: "order-processor-v1",<br> Type: pulsar.Shared, // 关键:允许多个实例共享订阅<br>})
-
Exclusive:单 consumer 独占,扩容后新实例收不到消息 -
Shared:消息轮询分发,但不保证顺序,适合幂等处理场景 -
KeyShared:按 message key 分组保序,要求 producer 设置Key,否则退化为 Shared - 订阅名
subscriptionName是消费位点标识,改名等于新建订阅,历史消息重放
pulsarctl 替代 pulsar-admin 管理集群更轻量可靠
Java 版 pulsar-admin 启动慢、报错模糊,Go 项目里推荐用 pulsarctl。它二进制小、无 JVM 依赖,命令响应快,且错误提示直接指向 REST API 返回码。
常用操作:
# 列出所有 topic<br>pulsarctl topics list --tenant default --namespace public<br><br># 创建 namespace(需先有 tenant)<br>pulsarctl namespaces create default/public<br><br># 查看 subscription 消费进度<br>pulsarctl subscriptions stats default/public/my-topic my-subscription
- 首次使用前必须配置
~/.pulsar/config,填webServiceURL: http://pulsar-broker:8080 - 权限控制依赖集群是否开启 Authentication,未启用时所有操作默认通过
-
pulsarctl不支持动态调整 topic 分区数,分区数只能建 topic 时指定
真正麻烦的是 BookKeeper 存储层的水位监控和 ledger 清理——这部分没法靠 client 或 pulsarctl 自动完成,得盯紧 bookie 磁盘和 ZooKeeper 节点状态。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










