当前位置: 首页 > article >正文

消息队列(一)消息队列的工作流程

什么是消息队列

首先,代入一个场景,我现在做一个多系统的集成,分别有系统A、B、C、D四个系统,A系统因为使用产生了业务数据,B、C、D需要使用这些数据做相关的业务处理和运算,最基本的做法就是通过接口通信,即A根据数据的变化情况通过调用B、C、D的接口,向它们推送产生的数据。

但是此种解决方案的问题也比较明显,首先就是系统间的耦合加重,扩展性较差,A 系统产生一条比较关键的数据,另外的系统都需要 A 系统将这个数据发送过来,就需要A进行定向的开发接口,对于系统间也需要考虑容错(发送失败?重发机制等等);如果此时新增了E系统需要数据,或者D系统不需要了,A系统就需要进行开发绑定;

在这种情况下,如果在A和BCD之间有一个第三方,A负责将数据交给第三方,而BCD甚至后面新增的E,都可以按需去第三方去取或者不去取,消除了A和其他系统的耦合,此外也减少了A的程序变更成本。这个第三方就是消息队列(MQ)。

消息队列的优缺点

优点

消息队列的优势主要有三点:就是解耦异步削峰

解耦已经在上文中体现了,通过第三方的MQ组件,能够降低集成系统间的耦合,减少不必要的定向API代码,使其扩展性得到保证。

关于异步主要体现在当一组数据变化,需要多处写入时,耗时则是时间的顺序加和,体验较差,而引入消息队列,则可以在一处完成后即刻响应。

 消息队列的另一个优势就是缓冲,在系统使用的高峰期,每秒并发请求数量是非常巨大的,此时数据层的并发能力受限于数据库,未必能够满足这种级别的并发,而数据又不能暂停等待数据库写入,此时,消息队列就可以居中起到缓冲消峰的作用。

请求或数据先进入到队列中暂存,由数据库逐步写入,而不影响正常的使用。 

缺点

和系统设计中引入其他组件一样,引入新组件后,系统的复杂度就会变高,系统的设计和开发成本也会隐式增长;主要体现在,引入消息队列后, 需要新增策略保证消费机制的完整(防重复、数据一致性、消息顺序性等) 。

另一个缺点就是系统的可用性受限,引入消息队列后,消息队列组件本身的稳定性也会传递到当前的系统中(例如:消息队列崩溃,系统的部分功能也将瘫痪)。

而使用消息队列的技术要点就是尽量取规避和解决引入消息队列所带来的负面影响。 

常用消息队列组件的比对

单机吞吐量topic 数量对吞吐量的影响时效性可用性消息可靠性功能支持
ActiveMQ万级,比 RocketMQ、Kafka 低一个数量级topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降ms 级高,基于主从架构实现高可用有较低的概率丢失数据MQ 领域的功能极其完备
RabbitMQ同 ActiveMQ在同等机器下,topic 数量增加时,吞吐量会受到影响,但具体影响程度需要根据实际情况确定(注:原始信息中关于此点描述为 Kafka 的情况,这里进行了调整)微秒级,这是 RabbitMQ 的一大特点,延迟最低同 ActiveMQ基本不丢基于 Erlang 开发,并发能力很强,性能极好,延时很低
RocketMQ10 万级,支撑高吞吐这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic,topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降ms 级非常高,分布式架构经过参数优化配置,可以做到 0 丢失MQ 功能较为完善,还是分布式的,扩展性好
Kafka10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景在同等机器下,topic 数量过多时,吞吐量会大幅度下降,如果要支撑大规模的 topic,需要增加更多的机器资源延迟在 ms 级以内非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用同 RocketMQ功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

http://www.kler.cn/a/453076.html

相关文章:

  • 鸿蒙之路的坑
  • Java开发经验——数据库开发经验
  • 海外招聘丨 苏黎世联邦理工学院—机器学习在社会和政治科学中的应用博士后
  • Cesium材质——Material
  • JVM实战—2.JVM内存设置与对象分配流转
  • 基于OpenCV和Python的人脸识别系统_django
  • 地理数据库Telepg面试内容整理-基础技术栈
  • 重温设计模式----装饰模式
  • SSE(Server-Sent Events)返回n ,前端接收数据时被错误的截断【如何避免SSE消息中的换行符或回车符被解释为事件消息的结束】
  • Halcon 的标定
  • 如何识别钓鱼邮件和诈骗网站?(附网络安全意识培训PPT资料)
  • hhdb客户端介绍(54)
  • 数据结构基本认识与必要知识点准备工作
  • 大型语言模型(LLMs)演化树 Large Language Models
  • Wux weapp 组件库的 bug—— wux-picker选择器组件无法正确初始化到选定的value
  • 基于TP5框架的家具购物小程序的设计与实现【附源码、文档】
  • HTTP,续~
  • 记一次Vue3中使用vue-awesome-swiper遇到的坑
  • vscode写python,遇到问题:ModuleNotFoundError: No module named ‘pillow‘(已解决 避坑)
  • 前端案例---自定义鼠标右键菜单
  • HTML 新手易犯的标签属性设置错误
  • sentinel学习笔记6-限流降级(上)
  • 创建线程的四种方式
  • 大数据技术原理与应用期末复习-代码
  • 深度学习camp-第J5周:DenseNet+SE-Net实战
  • 定位方式:css