Post

高效消息处理系统设计

大部分的后端系统依赖于大量的消息处理实现各种功能服务,架构高效的消息处理系统是非常有必要的。这里笔者简单记录下日常开发常用的高效消息处理系统的设计思路。

设计消息处理系统时,我们要明确三个角色:

  • 消息生产者:产生消息的对象(接收到来自网络中的数据包,解析适配成系统内部消息,这种角色称为消息生产者)
  • 消息消费者:消费消息的对象,也就是service。接受消息提供服务。
  • 消息分发者:第三方存在,通常消息生产者和消息消费者在系统内不互相可见,所以需要第三方来进行消息的分发。这种第三方通常是全局存在的,全局唯一的,消费者和生产者都可以直接访问到其内存。

妥善处理这三个角色的动作是一个高效消息处理系统的基础,根据笔者的经验,将这三者的作用发挥好,设计出来的消息处理系统的性能不会差。

重点是消息的分发者,消息分发者的分发效率决定消息处理系统的性能。系统内存在大量的不同服务,比如登录服务、认证服务、场景服务等等,笔者建议对于每一个服务使用一个单独的消息分发者。这样消息分发者的职责可以不只只是转发消息,还可以对服务提供对象进行管理。消息分发着需要对外开放的接口是Publish。

1
2
3
type ServiceManager interface {
    func Publish(msg Message) error
}

消息产生者调用Publish方法将消息发布到消息分发者,消息分发者会根据消息的类型将消息分发给对应的服务。服务进行消息处理。

消息消费者如何接受到消息呢?首先消息的执行和分发不能在同一个线程中,这样会导致消息的分发和执行效率低下。所以对于service,笔者的建议是每个service使用一个独立的任务队列,供消息分发者将消息投递到任务队列中。如何实现任务队列?可以查看笔者之前的博客。

看到这里,一个较为成熟的分布式消息处理系统的设计就完成了。service和dispatcher可以独立部署,所以可以是分布式的,也可以同时存在在一个内存中,看读者自己的需求。

这样设计的消息处理系统的好处是:

  • 系统各部分的解耦合性高,独立工作,互不影响;
  • 节点化,可以弹性伸缩;
This post is licensed under CC BY 4.0 by the author.