Go中Pub/Sub模式通过接口抽象行为,用map[string][]chan interface{}管理主题与订阅通道,各订阅者独占channel实现并发安全,并提供Subscribe等方法。
在 Go 语言中实现发布-订阅(Pub/Sub)模式,核心是用接口抽象消息的发布与订阅行为,借助通道(channel)和 goroutine 实现异步解耦,避免对象间直接依赖。
先设计一个轻量、可扩展的 EventBus 接口,隐藏内部实现细节:
发布时不应阻塞调用方,尤其当某个订阅者 channel 满或未及时读取时。推荐做法是启动 goroutine 异步发送,并配合 select + default 避免阻塞:
长期运行的服务需防止内存泄漏。可通过返回取消函数(cancel func())来移除 channel:
比如用户服务发布 "user.registered" 事件,邮件、积分、风控模块各自订阅:
erface{}, 10),启动 goroutine 消费并发送欢迎信不复杂但容易忽略:真正的解耦不只靠 channel,更在于定义清晰的主题命名规范(如 "domain.action")、错误处理策略(消息丢失是否可接受)、以及是否需要持久化或重试——这些决定了你的 Pub/Sub 是玩具还是生产级。