一个事件总线的实现,主要包含三个角色:1、消息发布 2、消息队列 3、消息派送
消息队列可以有多种选择,redis,kafka,rocketMQ等,甚至是jdk blockQueue。
但作为一个工业级的设计,我们需要考虑几点:
1、高性能 2、高可用 3、平滑扩容 4、架构对开发者透明
1、2、3取决于你用什么消息队列,4 取决于你采用哪种设计模式进行解耦
经过对比,这里采用了kafka作为我们的事件总线的关键核心部件,下面着重谈下设计模式进行解耦:
这里说的解耦,指的是普通程序员使用事件总线的时候,他们是不需要关心事件总线采用的是什么消息服务器,他们只面向接口编程,并不关心细节。同理,这也为事件总线日后升级提供了便利,也就是说,日后从kafka更换成更好的消息服务器,业务系统是不需要做任何的修改,透明切换。
具体到代码层设计,采用观察者模式作为消息派发的基础,最为合适不过。熟悉spring的朋友应该知道,spring其实内置了一套观察者模式的支持,我们就无需自己重新写了,但需要定义一些自己的抽象接口去整合一下, 具体接口设计如下:
消息事件:EventObject <--- AppMsg
事件监听器:EventListener <--- AppMsgEventListener
事件发布器:AppEventPublisher
抽象消费者:Consumer
以上就是一个事件总线最基础的雏形,事件总线在互联网系统中举足轻重,各系统之间的解耦,异步消息推送,发送邮件,短信,日志大规模采集,分布式最终一致性事务等都需要用到。