# 《分布式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;
    }
    /*******************省略其他代码*****************/
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 查看完整文章

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