# 《分布式IM系统》大后端平台-用户服务-第05节:领域事件的发送与接收设计和实现

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
课程视频:https://t.zsxq.com/17ZdVfS4c (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本节难度:★★☆☆☆
  • 本节重点:对大后端平台中用户微服务领域事件的设计发送与接收进行设计和实现,掌握异步处理领域事件的落地方案与实现技巧,掌握在DDD领域架构模式下,采用Cola框架与RocketMQ发送并接收领域事件的方法,并能够将其灵活应用到自身实际项目中。
  • 课程视频:https://t.zsxq.com/17ZdVfS4c (opens new window)

大家好,我是冰河~~

在大后端平台的用户微服务中,修改完用户信息,对外发布一个领域事件,修改用户信息的方法立即返回。由单独的领域服务监听对应的事件,接收到事件后,去更新分布式缓存中的数据,即能够提升系统的稳定性,又能够极大的提升数据的处理性能。

# 一、前言

在前面的文章中,我们已经实现了大后端平台中,用户微服务的主要功能。在修改用户信息时,修改完数据库数据,我们预留了如何修改分布式缓存中数据的扩展点。这里,根据具体场景可以有多种实现方案。

例如:

  • 先修改数据库,再同步修改缓存。
  • 先修改数据库,再异步修改缓存。
  • 先修改缓存,再同步修改数据库。
  • 先修改缓存,再异步修改数据库。
  • 订阅数据库binlog,异步修改缓存。
  • 先修改数据库,再发布事件,单独服务订阅事件更新缓存。
  • 先修改缓存,再发布事件,单独服务订阅事件更新数据库。

每种方案的选型可以参考《分布式Seckill秒杀系统》 (opens new window) 的实现。这里,我们还是以先修改数据库。再发布事件,单独服务订阅事件更新缓存的方式实现。

# 二、本节诉求

对大后端平台中用户微服务领域事件的设计发送与接收进行设计和实现,掌握异步处理领域事件的落地方案与实现技巧,掌握在DDD领域架构模式下,采用Cola框架与RocketMQ发送并接收领域事件的方法,并能够将其灵活应用到自身实际项目中。

# 三、流程设计

在用户微服务中,当领域层执行完修改数据库中用户信息的逻辑后,可以对外发布一个领域事件,由应用层订阅相关的领域事件,当应用层接收到领域事件后,异步处理分布式缓存中的数据,整体流程如图5-1所示。


可以看到,更新完用户数据库中的数据后,领域层会将事件封装成对应的事件模型发布出去,至于是发布到Cola,还是发布到RocketMQ,完全由配置决定,后续不需要修改代码即可实现。而应用层会监听并接收Cola或者RocketMQ中的事件,并更新分布式缓存中的用户数据。

同时,不管是将事件发布到Cola还是发布到RocketMQ,统一实现了对应的事件模型,而不必单独为每种事件的发布方式单独设计事件模型,体现了事件模型在设计上的通用性和高度可扩展性。

# 四、编码实现

具体实现步骤如下所示。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码