# 《分布式IM系统》大后端平台-好友服务-第04节:异步更新好友微服务数据的设计和实现
作者:冰河
星球: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/17Fv1jt5q (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本节难度:★★☆☆☆
- 本节重点:更新用户基本信息时异步更新好友微服务相关的数据,掌握跨微服务的异步处理事件的落地方案与实现技巧,掌握在DDD领域架构模式下,不同微服务之间的数据异步交互方案,并能够将其灵活应用到自身实际项目中。
- 课程视频:https://t.zsxq.com/17Fv1jt5q (opens new window)
大家好,我是冰河~~
在分布式IM即时通讯系统中,有这样一种场景:用户在更新自己的基本信息时,例如修改了自己的昵称和头像,需要更新好友关系中关于自己的昵称和头像,并且用户微服务和还有微服务是两个不同的微服务,也就是运行在JVM中的两个不同的服务实例,那如何实现用户更新基本信息时,一起更新好友关系中的信息呢?
# 一、前言
其实,了解过分布式事务,或者学习过《分布式Seckill秒杀系统 (opens new window)》的小伙伴都知道,一个微服务在更新数据时,需要同步更新另一个微服务的数据,这是一种典型的分布式事务问题。但是,我们结合分布式IM即时通讯系统的场景进行思考,真的有必要一定保证用户微服务的数据和好友关系数据的强一致吗?其实,用户微服务的数据更新后,没必要保证用户微服务的数据和好友微服务的数据强一致,这种场景下,可以允许最终一致。
# 二、本节诉求
实现更新用户基本信息数据时,异步更新好友微服务相关的数据,掌握跨微服务的异步处理事件的落地方案与实现技巧,掌握在DDD领域架构模式下,不同微服务之间的数据异步交互方案,并能够将其灵活应用到自身实际项目中。
# 三、流程设计
当用户微服务更新数据时,异步更新好友微服务的流程如图4-1所示。
可以看到,整个流程本质上就是生产者和消费者模式,用户微服务作为生产者,当用户微服务更新完自身数据后,会发送更新事件到分布式消息中间件。而好友微服务作为消费者,监听分布式消息中间件中的数据,当接收到数据时,就会更新自身服务的数据。并且数据在用户微服务和好友微服务之间交互时,会以统一的事件模型进行交互。
# 四、编码实现
编码实现的过程中,我们可以分成实现事件模型、实现消息生产者和实现消息消费者三个方面进行讲解。
# 4.1 实现事件模型
User2FriendEvent类表示用户微服务向分布式消息中间件投递数据的基础事件模型类,用户微服务向消息中间件投递消息,还有微服务订阅接收消息中间件中的数据,都是以User2FriendEvent类的对象进行交互。
源码详见:bh-im-platform-common工程下的io.binghe.im.platform.common.model.event.User2FriendEvent。
public class User2FriendEvent extends IMBaseEvent {
//昵称
private String nickName;
//头像
private String headImg;
public User2FriendEvent() {
}
public User2FriendEvent(Long id, String nickName, String headImg, String destination) {
super(id, destination);
this.nickName = nickName;
this.headImg = headImg;
}
/*******************省略其他代码*****************/
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看完整文章
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码