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

  • 1)用户聊天消息的离线存储环节:因为IM消息的发送属于高吞吐场景,直接操作DB可能会让DB崩溃,所有离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地存储到DB中
  • 2)用户的行为数据收集环节:因为用户的聊天消息和指令等,可以用于大数据分析,而且基于国家监管要求也是必须要存储一段时间的,所以此类数据的收集同样可以用于MQ消息队列,再由单独部署的消费者存储到DB中;
    1. 用户的操作日志收集环节: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即时通讯系统的用途相关推荐

  1. MQ消息队列中间件:

    MQ消息队列中间件: 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应. 异步通讯:就像发信息,不需要马上回复. 同步调用的优点: 时效性较强,可以立即得到结果 同步调用的问题: ...

  2. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  3. 消息队列中间件 Message Queue 简称:MQ

    一.什么是消息队列? 消息队列,一般我们会简称它为MQ(Message Queue) 队列是一种先进先出的数据结构. 现有常用的开源消息中间件有Kafka.CMQ.JBoss Messaging.JO ...

  4. MQ消息队列详解、四大MQ的优缺点分析

    MQ消息队列详解.四大MQ的优缺点分析 前言 面试题切入 面试官心理分析 面试题剖析 ①为什么要使用MQ 系统解耦 异步调用 流量削峰 消息队列的优缺点 四大主流MQ(kafka.ActiveMQ.R ...

  5. python消息队列中间件_常见的消息队列中间件介绍

    题目 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 什么是消息队列 在正式介绍和对比Kafka. ...

  6. 阿里云ACE共创空间——MQ消息队列产品测试

    一.产品背景 消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询.定时(延时)消息.资源统计.监控报警等一系列消息云服务,是企业级互联网架 ...

  7. MQ消息队列产品测试

    2019独角兽企业重金招聘Python工程师标准>>> 一.产品背景 消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询 ...

  8. MQ消息队列的使用场景

    一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,Rabbit ...

  9. 浅谈消息队列及常见的分布式消息队列中间件

    背景 分布式消息队列中间件是是大型分布式系统不可缺少的中间件,通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理消息前不需要等待接收此消息.所以消息队列主要解决应用耦合.异步消 ...

  10. MQ消息队列使用场景

    一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,Rabbit ...

最新文章

  1. Codeforces 460E Roland and Rose(暴力)
  2. 安全预警:勒索软件正成为制马人的新方向
  3. hashcode()方法和equals()方法
  4. [2-SAT]【学习笔记】【未完】
  5. 技术盘点:2022 年容器、Serverless、可观测、服务网格有哪些值得关注的趋势?
  6. 天鹅给癞蛤蟆的回信[转贴]
  7. hadoop NameNode HA 和ResouceManager HA
  8. 对于最近爆火的区块链,投资人怎么看? | 聚焦
  9. 成员/方法/属性/私有
  10. java_version干什么的_java类中serialVersionUID的作用及其使用
  11. APP UI自动化测试:框架选择、环境搭建、脚本编写……全总结
  12. 用python做计算器(超级版)
  13. git clone 的--single-branch和--depth参数
  14. 使用Python从头实现一个神经网络
  15. 【回眸】牛客网刷刷刷!嵌入式软件中也会遇到的嵌入式硬件,通讯,通讯协议专题(一)
  16. 【WebFace260M】《WebFace260M:A Benchmark Unveiling the Power of Million-Scale Deep Face Recognition》
  17. kafka服务端版本号0.10.2,客户端版本号2.0 如何发送消息
  18. 离散数学-传递闭包的代码计算
  19. SQL Server 2012笔记分享-35:配置客户端网络协议
  20. Oracle作业第四章

热门文章

  1. C语言统计素数并求和
  2. Excel多级下拉菜单的制作
  3. 将数据与OpenLayers结合在一起
  4. PID控制算法原理学习
  5. matplotlib:plot 3d ,plot_surface
  6. 第二章 01 节 常用信号及其基本特征
  7. 英语计算机考研复试专业翻译题库,计算机专业英语题题库.doc
  8. lodop php 快递单_Lodop打印模板 - 让Web打印易起来~~ – 基于ThinkPHP和Bootstrap的极速后台开发框架...
  9. android expandablelistview横向,完美实现ExpandableListView二级分栏效果
  10. 注册岩土工程师计算机专业的能考吗,岩土工程师报考条件