失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 分析-MQ消息队列中间件-在IM即时通讯系统的用途

分析-MQ消息队列中间件-在IM即时通讯系统的用途

时间:2023-11-09 21:29:07

相关推荐

分析-MQ消息队列中间件-在IM即时通讯系统的用途

MQ消息队列在IM即时通讯的用途

1)用户聊天消息的离线存储环节:因为IM消息的发送属于高吞吐场景,直接操作DB可能会让DB崩溃,所有离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地存储到DB中;2)用户的行为数据收集环节:因为用户的聊天消息和指令等,可以用于大数据分析,而且基于国家监管要求也是必须要存储一段时间的,所以此类数据的收集同样可以用于MQ消息队列,再由单独部署的消费者存储到DB中; 用户的操作日志收集环节:log这种数据价值不高,但关键时刻又非常有用,而且数据量又很大,要想存储起来难度很高,这时就轮到Linkedin公司开源的Kafka出场了;

典型的消息队列原理图

MQ消息队列的典型应用场景

MQ消息队列广泛应用在中大型分布式系统中,主要使用的场景包括:异步处理 , 应用解耦 , 流量削峰和即时通讯四个场景.

1.异步处理

场景介绍:典型的IM即时通讯系统中, 用户注册成功后需要发送注册邮件 / 注册通知短信

传统解决方案:

1)串行的方式:即将注册信息写入数据库成功后、发送注册邮件、再发送注册短信。以上三个任务全部完成后,返回给客户端;

2)并行方式:即将注册信息写入数据库成功后,发送注册邮件的同时,同时发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。

分析:假设每个业务节点耗时50ms,则串行方式耗时150ms,并行方式耗时100ms. 假设CPU每秒钟吞吐量是100次,串行方式CPU每秒请求1000/150=7次,并行化的方式请求次数是1000/100=10次.

可以看到传统的解决方案的系统性能(并发量\吞吐量\响应时间)会有瓶颈

引入消息队列

将不是必须的业务逻辑,进行异步处理. 使用消息队列进行改造之后,用户的响应时间=注册信息写入数据库的时间50ms+(发送注册邮件+发送注册短信)写入消息队列的时间ms,系统的吞吐量提升到20QPS,比串行提高了3倍.

2.应用解耦

场景说明:典型的电商购物平台,用户下单之后,订单系统需要通知库存系统

传统解决方法

订单系统 调用 库存系统接口—如果库存系统无法访问,则订单库存更改将失败,从未导致订单失败------订单系统和库存系统存在耦合

引入消息队列

订单系统: 下单之后完成持久化处理,将消息写入消息队列,返回下单成功

库存系统: 订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。

下单之后,订单系统就不用管后续操作了,订单系统实现了和库存系统的应用解耦

3.流量削峰

场景介绍:流量削峰在大型秒杀活动中使用广泛,秒杀活动因为流量过大导致流量暴增应用挂掉.

引入消息队列:使用消息队列可以 控制活动的人数 + 缓解短时间内高流量压垮应用

用户的请求被服务器接收后,首先

4.日志处理

是什么?:日志处理是指将消息队列用在日志处理中,比如Linkedin这种大型职业社交应用架构中Kafka的应用(Kafka就是Linkedin开发并开源的),解决大量日志传输的问题。

日志采集客户端–写入—>kafka消息队列<–订阅消费—日志处理应用

日志采集客户端:负责日志数据采集,定时写入Kafka队列;Kafka消息队列:负责日志数据的接收,存储和转发;日志处理应用:订阅并消费kafka队列中的日志数据。

5.即时消息通讯

即时消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的即时消息通讯场景。比如实现点对点消息队列或者IM聊天室等

(但Jack Jiang认为,在中大型IM系统中,MQ并不适合这么用,具体的讨论请见:《请教可以使用MQ消息队列中间件做即时通讯系统吗?》)。不建议

点对点通讯:客户端A和客户端B使用同一队列,进行消息通讯;聊天室通讯:客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。

单纯从技术上看,IM系统的所有数据路径无非就是3种情况:1)消息从A客户端 -> 经由服务器->再转发给B客户端:即C to S to C;2)消息从A客户端直发服务端:即C to S;2)消息从服务器直发A客户端:即S to C。而消息中间件里的订阅模式:即生产者推送消息到MQ、再由消费者从MQ读取,理论上是完全可以实现上面所说的3种消息传递路径的,如果要实现IM消息的生产和消费,基本上就是一个用户对应一个队列,而大量用户存在的情况下就是大量的队列产生,而每个队列的消息流转其实很少,试想一个人聊天时能发出多少消息?。但存在一个问题的:本身MQ被设计来的目的是处理大量的消息的,也即是通常的应用场景下,不会有多少队列存在,但每个队列每秒都要满负荷处理大量的消息,而假设你来开发MQ中间的话,你也能想到:你最大的优化目标是将每个队列的消息处理吞吐做到最大化,而不应该把处理大量的队列连接、断开、重连这些事情做为MQ存在的意义。综上:我的个人意见是,没有行不行,而是合不合适,所以就看你怎么选择了。有的人因为IM系统很小,为了省事或偷懒,也真就是用MQ来实现的,但除非你老板懂技术,不然谁管你。

推荐消息队列

总的来说,RabbitMQ 和 Kafka 都是十分优秀的分布式的消息代理服务,只要合理部署,基本上可以满足生产条件下的任何需求。

如果觉得《分析-MQ消息队列中间件-在IM即时通讯系统的用途》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。