尼恩说在前面
1.千万用户规模 IM 架构设计,请说出你的方案? 2.1000万长连接,如何建立和维护?
最新《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取,回复:领电子书
本文目录
- 尼恩说在前面
- 一、IM的重大价值
- 1、IM的广泛使用场景:
- 2、IM的巨大学习价值:
- 3、技术要点:
-1)、网络传输协议:
-2)、数据通信格式(协议)
-3)、如何保证实时消息的有序性、可用性
-4)、如何处理群发消息以及离线消息
-5)、如何进行消息持久化
-6)、如何避免数据中心级故障?
- 二:10万用户->100万用户->1000万用户 的架构演进
- 三:10万用户im架构
- 1. 多协议支持
- 2. 消息编解码设计
- 3. 用户管理与消息路由
- 4. 心跳机制
- 5. 高可用性设计:
- 6. 扩展性与容错性设计
- 7.10万用户im架构与实操
- 四:100万用户im架构
- 1、高扩展架构:功能的细粒度、分布式解耦
- 2、基于Rocketmq做异步消息推送
-1. 架构设计
-2. 消息生产
-3. 消息消费
-4. 消息持久化与顺序性
-5. 故障处理与重试机制
- 3、100万用户im架构总体架构
- 4、ConnectManager服务:用户代理服务器,用于客户端的连接
- 5、logic 业务逻辑 服务:主要业务处理模块
- 6、100万用户im架构中的跨node的会话路由
- 7、100万用户的数据存储架构
- 五:1000万用户im架构
- 1、高扩展架构:更进一步的 功能的细粒度解耦, 实现无限可扩展的架构
- 2、1000万用户im架构中的跨node的会话路由
- 3、如何避免数据中心级故障?
- 4、1000万用户的数据存储架构
- 说在最后:有问题找老架构取经
一、IM的重大价值
1、IM的广泛使用场景:
协作工具:如 Slack、Microsoft Teams 等,为团队提供即时消息、文件共享、视频会议等功能,提升工作效率。 企业管理系统(ERP、CRM):整合 IM 功能,方便员工快速交流、协作,以及与客户或合作伙伴沟通。
社交网络:如 Facebook、Twitter 等,可以通过 IM 功能让用户私下交流或创建群组讨论。 在线社区和论坛:提供用户之间的即时消息功能,增强互动性和用户粘性。
客户支持:如 Shopify、Amazon 等电商平台,通过 IM 实现客户与客服的实时沟通,解决售前咨询或售后服务问题。 买卖双方沟通:买家与卖家可以直接通过 IM 沟通,协商交易细节。
在线学习平台:如 Coursera、Udemy,师生之间可以通过 IM 进行实时交流,辅导和答疑。 校园管理系统:学校内部系统中,师生或学生之间可以通过 IM 进行联系,安排活动或布置作业。
远程医疗:患者与医生之间可以通过 IM 进行初步沟通,预约咨询或远程诊断。 医院管理系统:医院内部工作人员之间可以通过 IM 实时沟通,协调工作和安排。
多人在线游戏:如 MMORPG、MOBA 类游戏,通过 IM 实现玩家之间的实时沟通和策略讨论。 游戏社交平台:玩家之间可以通过 IM 进行交流、组队或分享游戏经验。
在线银行和支付系统:如支付宝、微信支付,通过 IM 功能实现用户与客服的沟通,解决支付问题或账户管理。 投资和交易平台:投资者之间或与金融顾问之间通过 IM 进行市场讨论和交易建议交流。
2、IM的巨大学习价值:
3、技术要点:
1)、网络传输协议:
UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂; HTTP协议属于扩展支持,数据传输量大; TCP协议如果有海量用户的需求。如何保证单机服务器高并发量,如何做到灵活,扩展的架构。
2)、数据通信格式(协议)
自定义二进制:信息体积小,占用带宽低,传输效率高,缺点是处理不同客户端之间的消息交互较复杂。 提供序列化和反序列化库的开源协议:protocol buffers, json, Thrift。是一种流行的通用数据格式,扩展相当方便,序列化和反序列化相当方便。 文本化协议:序列化,反序列化容易(库支持),可视化强;缺点:相对于二进制存储占用体积大
3)、如何保证实时消息的有序性、可用性
IM中消息的投递中要保证发送方发送顺序与接收方展现顺序一致。 IM中如何保证在线实时消息的可靠投递,即消息的不丢失和不重复。 TCP 自带TCP Keepalive 无法满足需求。
4)、如何处理群发消息以及离线消息
5)、如何进行消息持久化
6)、如何避免数据中心级故障?
二:10万用户->100万用户->1000万用户 的架构演进
10万用户 | 100万用户 | 1000万用户 | |
三:10万用户im架构 ,如何进行架构设计?
1. 多协议支持
TCP 通信: ChannelPipeline 配置:通过 Netty 的 ChannelPipeline
配置解码器(ProtobufDecoder)、编码器(ProtobufEncoder)和自定义的ChannelHandler
。TCP Server:通过 ServerBootstrap
启动 TCP 服务,绑定端口并监听连接。WebSocket 通信: HTTP 协议升级:首先通过 HTTP 进行握手,然后升级为 WebSocket 协议。 Netty 提供了 WebSocketServerProtocolHandler
来处理协议升级。消息处理:在升级为 WebSocket 后,使用 WebSocketFrame 来传递消息,再通过 Protobuf 进行编解码。 WebSocket Server:与 TCP 类似,使用 ServerBootstrap
启动并配置 WebSocket 服务。
2. 消息编解码设计
Protobuf 生成器:通过 .proto
文件定义消息结构,并使用protoc
编译生成相应的 Java 类。Protobuf 编解码: ProtobufDecoder:将收到的二进制数据解码为 Protobuf 消息对象。 ProtobufEncoder:将消息对象编码为二进制格式,准备发送。
3. 用户管理与消息路由
用户连接管理: 使用数据结构(如 ConcurrentHashMap
)来管理用户的连接映射,跟踪每个用户的Channel
实例。使用redis 来管理 user 和node 的映射关系,跟踪每个用户的 node 实例。 多设备支持:如果一个用户可以有多个设备在线,需要设计一个映射来跟踪每个设备的连接。 消息路由与分发: 实现消息的路由逻辑,根据接收者的 ID 查找对应的 Channel
并将消息发送。支持单播、组播(群聊)和广播消息。
4. 心跳机制
TCP 心跳:通过 Netty 的 IdleStateHandler
检测连接的空闲状态,如果超过一定时间没有读写操作,可以发送心跳包或断开连接。WebSocket 心跳:使用 WebSocket 的 PING/PONG 帧来维持连接活跃状态。
5. 高可用性设计:
6. 扩展性与容错性设计
分布式架构: im 服务实例可以水平扩展,设计 Router 服务,实现im 服务实例 直接的 负载均衡。 负载均衡架构:
7. 10万用户im架构与实操
四:100万用户im架构,如何进行升级?
1、高扩展架构:功能的细粒度、分布式解耦
管理用户的长连接,处理 TCP 和 WebSocket 连接的建立与断开。 维护用户的在线状态,管理链接的 heartbeat 心跳。 连接管理服务可以组成集群,每个连接管理节点可以维护一部分用户的连接(分片管理),并通过一个注册中心(如 ZooKeeper)来协调和管理节点间的负载。
消息处理服务 用户认证服务 群组管理 聊天记录管理 消息过滤等。
2、基于Rocketmq做异步消息推送
1. 架构设计
生产者-消费者模型:IM 系统的消息生产者(如发送消息的客户端或服务)将消息推送到 Rocketmq主题中,消费者(如消息接收者的客户端或服务)从 Rocketmq中拉取消息进行处理。 分区与副本:Rocketmq主题可以分为多个分区,分区内的消息是有序的;同时,为了实现高可用性,每个分区可以有多个副本,分布在不同的 Rocketmqbroker 上。
2. 消息生产
消息队列设计:根据业务需求,设计 Rocketmq主题的分区策略。例如,可以按照用户 ID 或聊天会话 ID 来进行分区,以保证相关消息的有序性。 消息格式:设计消息的序列化格式(如 JSON、Avro、Protobuf),并确保消息内容包括必要的元数据,如消息 ID、时间戳、发送者和接收者 ID。
3. 消息消费
消费者组:接收消息的消费者可以被组织为一个消费者组,Rocketmq会将主题的分区分配给消费者组内的不同消费者,确保每个分区的消息只被一个消费者处理,避免重复消费。 消费确认与偏移量管理:消费者在处理消息后,需要提交消费偏移量(Offset)到 Kafka,以便在重启或故障恢复时从正确的位置继续消费。可以选择自动提交(自动提交可能有消息丢失的风险)或手动提交(需要在消息处理完成后手动提交,保证消息处理的准确性)。
4. 消息持久化与顺序性
消息持久化:Rocketmq自带持久化机制,消息可以保留一定时间(可配置),即使消费者临时不可用,消息也不会丢失。 消息顺序:如果需要保证消息的顺序性,可以将相关消息(如同一会话中的消息)发送到同一分区中。
5. 故障处理与重试机制
消息重试:在消息处理失败时,可以将消息重新放回 Rocketmq队列或记录到专用的失败队列,进行后续重试或人工处理。 幂等性处理:在消费端实现幂等性逻辑,确保消息即使被多次处理也不会引发不一致问题。
3、100万用户im架构总体架构
4、ConnectManager服务:用户代理服务器,用于客户端的连接
ConnectManager
服务,`ConnectManager 发送消息到 rocketmq 。ConnectManager
,ConnectManager 会转发到 rocketmq , logic 业务逻辑处理心跳包。MQ
的消息处理完成后, 处理结果发送到 rocketmq ,ConnectManager 再将其转发到对应的客户端。5、logic 业务逻辑 服务:主要业务处理模块
6、100万用户im架构中的跨node的会话路由
7、100万用户的数据存储架构
存储平台
大数据平台
五:1000万用户im架构,如何再造升天?
1、高扩展架构:更进一步的 功能的细粒度解耦, 实现无限可扩展的架构
消息处理服务 消息过滤等。
用户认证服务
群组管理
聊天记录管理
风控等等。
消费者组:接收消息的消费者可以被组织为一个消费者组,Rocketmq会将主题的分区分配给消费者组内的不同消费者,确保每个分区的消息只被一个消费者处理,避免重复消费。 消费确认与偏移量管理:消费者在处理消息后,需要提交消费偏移量(Offset)到 Kafka,以便在重启或故障恢复时从正确的位置继续消费。可以选择自动提交(自动提交可能有消息丢失的风险)或手动提交(需要在消息处理完成后手动提交,保证消息处理的准确性)。
2、1000万用户im架构中的跨node的会话路由
为每个节点创建一个独立的Topic,确保消息可以定向发送到正确的节点。 考虑使用分区(Partition)来提高并发处理能力。
可以根据会话ID或其他业务标识符,来确定node 对应的topic。 配置Producer 以发送消息到正确的Topic。
每个node 节点上的Consumer订阅对应的Topic。 根据业务需求配置并发数量和消费策略。
3、如何避免数据中心级故障?
异地多活(Active-Active) 架构设计原则
全局分布式架构:将 IM 系统部署在多个地理位置不同的数据中心,每个数据中心都能够独立处理用户的连接和消息,但所有数据中心之间需要实现高效的数据同步和一致性保障。 数据分区与路由:可以根据用户的地理位置将其连接路由到离用户最近的数据中心,减少网络延迟。同时,系统需要能够处理跨数据中心的消息传递。 高可用性和容错性:任何一个数据中心的故障不应该影响整体服务的可用性,其他数据中心应当能够无缝接管业务。
异地多活(Active-Active) 数据同步机制
消息队列同步:使用分布式消息队列(Rocketmq)在数据中心之间传递消息。每个数据中心的消息队列, 设置sync-Storage 微服务,负责将本地消息复制到其他数据中心,保证消息的一致性。 数据库同步: 使用分布式数据库(如 Cassandra、CockroachDB)或数据库复制技术(如 MySQL 的 GTID 复制、主从复制)来实现数据同步。 这里采用了方式1:每个数据中心 设置sync-Storage 微服务,负责将本地消息复制到其他数据中心,保证消息的一致性。
4、1000万用户的数据存储架构
存储平台
大数据平台
说在最后:有问题找老架构取经
被裁之后, 空窗1年/空窗2年, 如何 起死回生 ?
案例1:42岁被裁2年,天快塌了,急救1个月,拿到开发经理offer,起死回生
案例2:35岁被裁6个月, 职业绝望,转架构急救上岸,DDD和3高项目太重要了
案例3:失业15个月,学习40天拿offer, 绝境翻盘,如何实现?
被裁之后,100W 年薪 到手, 如何 人生逆袭?
100W案例,100W年薪的底层逻辑是什么? 如何实现年薪百万? 如何远离 中年危机?
其他 历史逆袭案例,包含AI、大数据、golang、Java 等
实现职业转型,极速上岸
关注职业救助站公众号,获取每天职业干货
助您实现职业转型、职业升级、极速上岸
---------------------------------
实现架构转型,再无中年危机
关注技术自由圈公众号,获取每天技术千货
一起成为牛逼的未来超级架构师
几十篇架构笔记、5000页面试宝典、20个技术圣经
请加尼恩个人微信 免费拿走
暗号,请在 公众号后台 发送消息:领电子书
如有收获,请点击底部的"在看"和"赞",谢谢