【消息队列】为什么要使用消息队列、消息队列优缺点??

本文首发于微信公众号【坂本先生】

原文地址:https://mp.weixin.qq.com/s/XjfuMdLZALH7h7JNXrpIpA

一、为什么使用消息队列

核心的有3个:解耦、异步、削峰

(1)解耦

传统模式:

传统模式的缺点:

  • 系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!

中间件模式:

中间件模式的的优点:

  • 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。

(2)异步

传统模式:

传统模式的缺点:

  • 一些非必要的业务逻辑以同步的方式运行,太耗费时间。

中间件模式:

中间件模式的的优点:

  • 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度

(3)削峰

传统模式

传统模式的缺点:

  • 并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常

中间件模式:

中间件模式的的优点:

  • 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。

二、消息队列优缺点

  • 系统可用性降低:如果消息队列运行崩溃会直接导致系统故障,可以这么说:“系统的复杂程度和其可用性成负相关”
  • 系统复杂程度增高:需要解决很多问题,例如数据一致性,消息重复消费问题,消息可靠性传输问题

三 、结论

消息队列虽然好,能够帮助我们处理:解耦,异步,削峰问题,但是也会造成系统可用性降低,并提高系统复杂程度。因此我们需要谨慎引入,当然不得不用的时候也得用,最好的方式就是先找一种消息队列自己写一些demo程序来体验一下消息队列,这样今后在遇到响应的业务需求时就能自行判断了

原文地址:https://www.cnblogs.com/hwtblog/p/12078373.html

时间: 2024-10-07 19:58:17

【消息队列】为什么要使用消息队列、消息队列优缺点??的相关文章

消息队列_RabbitMQ-0002.深入MQ生产者/信道/交换机/队列/消费者?

形象说明: 比喻: RabbitMQ提供的消息投递服务类似于现实生活中的快递公司,双11我们可能会买很多东西,自然会陆续收到很多寄自淘宝店主由快递公司发来的快件,但是可能很多时候买回来的东西并不合心意,自然会陆续通过快递公司退回快件,所以回归到架构,这里的快件就相当于消息,我们相当于应用程序,淘宝店主相当于服务器,而快递公司相当于路由器,应用程序可以发送和接收消息,服务器也可以发送和接收消息,所以当应用程序连接到RabbitMQ时,就必须做一个决定:我是发送还是接收哪? 现实: 生产者(Prod

消息队列入门(一)关于消息队列

什么是消息队列 消息是指在两个独立的系统间传递的数据,这两个系统可以是两台计算机,也可以是两个进程. 消息可以非常简单,可以是简单的字符串,也可以是保存了数据持久化的各种类型的文档集合. 队列是在消息的传输过程中的通道,是保存消息的容器,根据不同的情形,可以有先进先出,优先级队列等区别 . 为什么使用消息队列 个人觉得消息队列主要的意义是解耦和异步处理,以及在高并发场景下平滑短时间内大量的服务请求. 消息队列不仅被用于系统内部组件之间的通信,同时也被用于系统跟其它服务之间的交互. 消息队列的使用

UCOS中的消息队列并不是真正意义上的队列

UCOS中的消息队列并不是真正意义上的队列,它只是发送了想要发送数据的指针,这个时候,如果发送多个同一个变量的不同数据,那么数据就相当于被覆盖了. 解决办法: 定义一个缓存数组buffer[i]; 更改变量i的数值,就可以实现一个变相的FIFO,因为每次发送的变量的指针是不同的. i++; i %= bufsize; buffer[ ( i + bufsize - 1 ) % bufsize ]; //此处是取的上一个数据,当前数据直接取buffer[i]即可.

系统学习消息队列分享(六) 如何确保消息不会丢失?

对于刚刚接触消息队列的同学,最常遇到的问题,也是最头痛的问题就是丢消息了.对于大部分业务系统来说,丢消息意味着数据丢失,是完全无法接受的. 其实,现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,完全可以做到在消息传递过程中,即使发生网络中断或者硬件故障,也能确保消息的可靠传递,不丢消息. 绝大部分丢消息的原因都是由于开发者不熟悉消息队列,没有正确使用和配置消息队列导致的.虽然不同的消息队列提供的 API 不一样,相关的配置项也不同,但是在保证消息可靠传递这块儿,它们的实现原理是一样的

消息队列技术终结者(四)—消息消费者以何种方式接收消息

消息消费者可以同步接收消息,也可以异步接收消息,一般而言,采用异步的方式接受消息优于采用同步的方式接受消息,体现在:        1.异步方式创建的网络流量比较小,单向推送消息并使之通过管道进入消息监听器.管道操作支持将多条消息聚合为一个网络调用.        2.异步方式使用线程比较少.异步方式在消息接收者不活动期间不使用线程.同步方式的消息接收者在接收调用期间内使用线程,结果线程可能会长时间保持空闲,尤其是该调用中指定了阻塞超时.        3.使用异步方式可以规避阻塞服务器上运行的

【原创】源码角度分析Android的消息机制系列(一)——Android消息机制概述

ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.为什么需要Android的消息机制 因为Android系统不允许在子线程中去访问UI,即Android系统不允许在子线程中更新UI. 为什么不允许在子线程中更新UI呢?因为Android的控件不是线程安全的.既然是非线程安全的,那么若在多个子线程中并发访问,UI控制可能会处于一种不可预期的状态.有的读者可能会说,为什么不对UI控件加锁呢?加锁会降低UI访问的效率,因为加锁之后,若想要运行这段synchronized的代码,线程要先拿到

分布式异步消息框架构建笔记4——分布是消息路由

上一篇实现了消息的自动路由,这边写了一个小测试,大家可以猜一下运行输出结果是什么? public class RouterTest { public static void DoRouterTest() { var contextA = Context.Creat("A"); var contextB = Context.Creat("B"); contextA.RegServiceClass(typeof (MyClassA)); contextB.RegServ

(转)ActiveMQ消息特性:Advisory Message(通知消息)

简单的说就是实现了ActiveMQ的broker上各种操作的记录跟踪和通知. 使用这个功能,你可以实时的知道broker上 创建或销毁了连接, 添加或删除了生存者或消费者, 添加或删除了主题或队列, 有消息发送和接收, 什么时候有慢消费者, 什么时候有快生产者 什么时候什么消息被丢弃 什么时候broker被添加到集群(主从或是网络连接) 这个机制是ActiveMQ对JMS协议的重要补充,也是基于JMS实现的ActiveMQ的可管理性的一部分.多个ActiveMQ的相互协调和互操作的基础设置. 使

ZeroMQ接口函数之 :zmq_msg_copy - 把一个消息的内容复制到另一个消息中

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_copy zmq_msg_copy(3)   ØMQ Manual - ØMQ/3.2.5 Name zmq_msg_copy - 把一个消息的内容复制到另一个消息中 Synopsis int zmq_msg_copy (zmq_msg_t *dest, zmq_msg_t *src); Description zmq_msg_copy()函数会将src指定的消息对象中的内容复制到dest指定的消息对象

MFC 消息映射表和虚函数实现消息映射到底谁的效率高

深入浅出MFC对于虚函数实现方式的缺点,它指出:虚函数耗费大量内存,系统最终将被这些额外负担拖垮.    但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~?    书中提到,虚函数表中的每一个项目都是一个函数指针,价值4字节,如果基类的虚函数表有100项 (MFC里面的消息数量是否在这个数量级?),经过十层继承,开支散叶,总共需要耗费多少内存?    我粗略地算了下,不知道这种计算方法是否正确,4Byte*100项=400Byte.如果CCmdTarget中定义100个消