Golang Event Bus 最佳实践:使用 NSQite 实现松耦合架构

打印 上一主题 下一主题

主题 1941|帖子 1941|积分 5823

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Go Event Bus 最佳实践:使用 NSQite 实现松耦合架构

什么是 Event Bus?

Event Bus(变乱总线)是一种消息传递模式,它允许应用步伐的不同组件通过发布/订阅机制进行通讯,而不必要直接相互依靠。这种模式特别适合实现松耦合的架构设计。
为什么必要 Event Bus?


  • 解耦:组件之间不必要直接依靠,通过变乱进行通讯
  • 可扩展性:新功能可以通过订阅现有变乱轻松添加
  • 可维护性:代码更轻易理解和维护
  • 异步处理:支持异步消息处理,进步系统响应性
最佳实践案例:用户注册通知系统

配景

假设我们正在开发一个电商系统,当新用户注册时,必要:

  • 发送接待邮件
  • 创建用户积分账户
  • 推送系统通知
  • 纪录用户举动日志
传统实现方式会导致注册服务与这些功能强耦合,代码难以维护。
使用 NSQite 解决方案

  1. // 定义事件结构
  2. type UserRegisteredEvent struct {
  3.     UserID   string
  4.     Username string
  5.     Email    string
  6.     Time     time.Time
  7. }
  8. // 邮件服务处理器
  9. type EmailHandler struct{}
  10. func (h *EmailHandler) HandleMessage(message *EventMessage[UserRegisteredEvent]) error {
  11.     event := message.Body
  12.     // 发送欢迎邮件
  13.     return sendWelcomeEmail(event.Email)
  14. }
  15. // 积分服务处理器
  16. type PointsHandler struct{}
  17. func (h *PointsHandler) HandleMessage(message *EventMessage[UserRegisteredEvent]) error {
  18.     event := message.Body
  19.     // 创建用户积分账户
  20.     return createUserPoints(event.UserID)
  21. }
  22. // 注册服务
  23. const topic = "user.registered"
  24. var  publisher = NewPublisher[UserRegisteredEvent]()
  25. func RegisterUser(username, email string) error {
  26.     // 创建用户
  27.     userID := createUser(username, email)
  28.     // 发布用户注册事件
  29.     event := UserRegisteredEvent{
  30.         UserID:   userID,
  31.         Username: username,
  32.         Email:    email,
  33.         Time:     time.Now(),
  34.     }
  35.     return publisher.Publish(topic, event)
  36. }
  37. // 主程序
  38. func main() {
  39.     // 初始化邮件订阅者
  40.     const emailChannel = "email"
  41.     emailSub := NewSubscriber(topic, emailChannel)
  42.     emailSub.AddConcurrentHandlers(&EmailHandler{}, 2)
  43.     // 初始化积分订阅者
  44.     const pointsChannel = "points"
  45.     pointsSub := NewSubscriber(topic, pointsChannel)
  46.     pointsSub.AddConcurrentHandlers(&PointsHandler{}, 2)
  47.     // 注册新用户
  48.     RegisterUser("testuser", "test@example.com")
  49. }
复制代码
代码阐明


  • 我们定义了一个 user.registered Topic
  • 创建了两个 Channel:email 和 points
  • 每个 Channel 都有独立的订阅者,可以设置不同的并发度
  • 当发布消息时,消息会被复制到全部 Channel
  • 每个 Channel 的订阅者会独立处理消息,互不影响
上风


  • 解耦:注册服务不必要知道具体的通知逻辑
  • 可扩展:添加新的通知方式只需新增消费者
  • 可靠性:NSQite 保证消息至少投递一次
  • 性能:支持并发处理,进步系统吞吐量
总结

NSQite Event Bus 设计原理

NSQite 由变乱总线和事务消息队列两部分组成,其中设计参考了 NSQ 的设计理念,变乱总线适用于单体架构,事务消息队列适适用于项目初期,你可能不必要像 NSQ、Pulsar 这样的大型消息队列系统。
采用 Topic 和 Channel 的二级消息分发机制:

  • Topic(主题):消息的分类,一个 Topic 可以包罗多个 Channel
  • Channel(通道):消息会被复制到全部 Channel
  • Subscriber(订阅者):订阅者可以启动并发协程,尽快处理 channel 中的消息
这种设计的核心上风:


  • 消息可被多类型消费者并行处理
  • 各 Channel 可独立设置并发度
  • 支持广播和点对点通讯
  • 实现简单的负载均衡
使用 github.com/ixugo/nsqite 实现 Event Bus 模式,可以帮助我们构建更加灵活、可维护的系统架构。如果你觉得这个项目对你有帮助,接待给个 Star 支持!
   项目地址:https://github.com/ixugo/nsqite

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表