MQ的优劣势及RabbitMQ相关概念

news2024/12/24 8:53:50

一,MQ

1,MQ 的概念

MQ 全称 Message Queue(消息队列),是用来存储消息数据的容器(是一个中间件),一般用于分布式系统间的通信;MQ主要介于生产者和消费者之间,生产者将数据发送给消息队列,队列将这些消息数据进行存储,消费者从消息队列中取出消息数据进行消费。

 2,分布式系统之间通信的两种方式

2.1 两个通信的系统之间直接进行调用

如下图所示,A和B系统之间的通信方式就是直接进行调用,A需要B的数据的话需要调用相应接口,B给A返回相应数据,B调用A的数据时也是同理;

2.2 借用第三方中间件进行间接调用

 

 大部分分布式系统采用的就是第二种方式使用MQ这样一个消息队列中间件进行间接调用,这里的发送方称为生产者(生产消息),接收方称为消费者(消费消息)!

3,MQ的优势

3.1 应用解耦

假设有这样一个场景,一个用户购买了一件商品,购买商品的时候需要访问订单系统,这个订单系统直接和库存系统、物流系统和支付系统相关联,各个系统之间的关联系统如下:

 这个系统的主要业务逻辑是这样的:一个用户在购买商品时,首先访问订单系统,此时订单系统会分别访问库存、物流以及支付系统,只有这三个系统全部响应完成且响应正确的时候订单系统的页面才会正确返回给用户!

假设此时有一个系统响应错误,订单系统就会发生错误或者现在的需要新家一个系统时也不是很方便需要在订单系统中新增有关新系统的业务代码,如果此时介入一个中间件MQ用来存放订单系统给其他系统发送的消息数据时,问题就会迎刃而解;

引入消息队列这样的中间件,作为订单系统就不需要关心其他相关的三个系统的执行了,而且新加入一个系统时也不会直接和订单系统相关,新加入的系统只需要从MQ中拿取消息数据进行消费即可,此时整个系统之间的耦合度就会大大降低!

3.2 异步提速

未加入 MQ 之前的响应速度如图所示:

 总的花费时间是存入数据库的5ms+300ms = 305ms

加入 MQ 之后的响应速度如图所示:

 总的花费时间是存入数据库的5ms+20ms = 25ms

引入 MQ 之后采用的是异步的方式,订单系统将消息数据发送给MQ之后就直接给用户返回了,而库存、物流以及支付系统分别从 MQ 中拿出消息数据进行消费,这一步站在订单系统的角度是不关心的,三个系统也是并发的去消费消息的,这一过程是异步的,所以 MQ 的另一大优势也体现在异步提速上!

3.3 削峰填谷

假设此时有大量请求,每秒5000访问量访问A系统,但是A系统的处理能力是每秒1000的访问量,此时A系统就会崩溃,未加入 MQ 之前:

 加入 MQ 之后:

 使用了 MQ 之后,限制消费消息的速度为1000,这样一来,高峰期产生的数据势必会被积压在 MQ 中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。使用MQ后,可以提高系统稳定性。

4,MQ的劣势

1,系统可用性降低

系统引入的外部依赖越多,系统稳定性越差。一旦 MQ 宕机,就会对业务造成影响。如何保证MQ的高可用?

2,系统复杂度提高

MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。 如何 保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?

3,一致性问题

A 系统处理完业务,通过 MQ 给B、C、D三个系统发消息数据,如果 B 系统、C 系统处理成功,D 系统处理失败。如何保证消息数据处理的一致性?
引入了 MQ 势必会使得系统之间的调用变得更复杂,规则变得更多,对于上述问题 MQ 是怎么解决的后续再详细告知!

二,RabbitMQ 

1,RabbitMQ 的概念

AMQP,即 Advanced Message Queuing Protocol (高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

2,RabbitMQ 模型架构及相关概念

  • Broker接收和分发消息的应用,RabbitMQ Server就是 Message Broker;
  • Virtual host出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost 创建 exchange/queue 等;
  • Connectionpublisher/consumer 和 broker 之间的 TCP 连接;
  • Channel如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的 channel 进行通讯,AMQP method 包含了channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销;
  • Exchangemessage 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast);
  • Queue消息最终被送到这里等待 consumer 取走;
  • Bindingexchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key。Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lwip-2.1.3自带的httpd网页服务器使用教程(一)从SD卡读取网页文件并显示

概述 本教程使用的单片机是STM32F103ZE,有线网口芯片为ENC28J60。 本教程里面的网页由于需要兼容Windows XP系统的IE8浏览器,所以采用HTML 4.01编写,不使用任何前端框架。笔者使用的网页设计软件是Adobe Dreamweaver CS3。 开发板PCB文件是公…

推荐Selenium 自动化测试实战

你将获得 深入 Selenium 源码、原理、封装、技巧; unittest、pytest、DDT、POM 迭代测试方法; 大型项目分布式测试解决方案; Jenkins 持续集成和交付。 演示地址:www.runruncode.com/portal/article/index/id/19451/cid/85.html 课…

【无线通信专题】NFC基本原理

NFC定义 NFC(Near Field Communication)近场通信。 NFC早期应用 NFC最开始的应用主要用于金融领域,POS机(reader)通过非接触的方式与银行卡(带NFC接口的卡片)进行交互得到银行卡信息并完成支付。因为NFC的通信距离比较近,所以安全性较高。 后来随着手机支付的流行。…

使用STM32实现 蓝牙插座

硬件介绍 蓝牙模块HC-01,其实之前就用过,使用起来非常简单 继电器模块, (VCC 3.3V)当左侧IN输入低电平时,右侧的ON 和 COM会导通,左上的绿灯会亮,此处充当插座的角色 项目需求 通过蓝牙的串口发送open打开…

JMeter 中 3 种参数值的传递

目录 前言: (一) 从 CSV 文件读取要批量输入的变量 (二) 利用 Cookie 进行值的传递 (三) 利用正则匹配提取上一个接口的返回数据作为下个请求的输入 前言: 在JMeter中,参数值的传递是非常重要的,因为它允许你在测试过程中动态…

Spring 如何解决 Bean 的循环依赖(循环引用)

Component public class A {Autowiredprivate B b;}Component public class B {Autowiredprivate A a;}上面的情况就是 循环依赖 Bean的创建初始化过程如下 如果不采取措施,那么循环依赖就会进入死循环 但 Spring 已经帮我们解决了大部分循环依赖问题 具体是如何解…

RabbitMQ的使用详解

一、什么是MQ 1、什么是MQ MQ(message queue),本质是个队列,FIFO先入先出。只不过队列中放的是message,是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游…

EMC案例-接地环路对传导骚扰测试的影响

EMC测试案例分析——接地环路对传导骚扰测试的影响 本文主要就接地环路对传导骚扰测试的影响进行简要举例分析,为我们以后的测试方法提供参考。 Part 1 现象描述 某电子设备在进行传导骚扰测试时,在3MHz左右的频率点出现了超限的情况,其测…

ELK-日志服务【es-安装使用】

目录 【1】安装-配置elasticsearch(01、02、03相同) 端口 【2】安装-配置-启动-Kibana 【3】浏览器访问测试(10.0.0.21:5601) 【4】使用kibana创建、更新、删除es索引、文档 【5】组es集群(投票选举机制&#xf…

用户体验在APP开发中的关键性作用

在 APP开发过程中,如何设计才能让用户感到满意,是非常重要的一点, APP开发公司需要不断地学习新的 APP设计知识,因为只有这样才能设计出令人印象深刻的 APP。对于用户来说,产品的用户体验在很大程度上决定了产品的竞争…

引入头文件#include <iostream>的时候发生了什么?

<iostream> namespace std {extern istream cin;extern ostream cout;extern ostream cerr;extern ostream clog;extern wistream wcin;extern wostream wcout;extern wostream wcerr;extern wostream wclog;};cin是什么&#xff1f; cin extern istream cin; The objec…

elasticsearch集群部署搭建(一)

elasticsearch集群部署搭建&#xff08;一&#xff09; 部署信息JDK安装下载es安装包部署安装创建用户&#xff08;三台机器都执行&#xff09;解压安装包&#xff08;选择一台机器执行&#xff09;修改配置文件&#xff08;三台机器都执行&#xff09; 拷贝分发注册系统服务服…

微信小程序监听页面跳转API

// 放在app.js 里面的onshow生命周期里面wx.onAppRoute((res) > {console.log(路由跳转,res})})

基于B/S架构SaaS服务的实验室信息系统(LIS)

实验室信息系统LIS源码 实验室信息系统&#xff08;Laboratory Information System&#xff09;&#xff0c;简称LIS&#xff0c;是一个全面基于网络化应用&#xff0c;能够帮助用户按照规范内容和规范流程进行多角色、多层次检验信息及资源管理的系统。通过条码管理系统从HIS…

Java并发编程第一弹

1、线程的创建 创建线程的方式有两种&#xff0c; 第一种是通过继承 Thread 类&#xff0c;重写run 方法&#xff1b;第二种是通过实现 Runnable 接口 通过源码发现&#xff0c;创建线程只有一种方式那就是构造 Thread 类&#xff0c;而实现线程的执行单元则有两种方式&…

将node服务打包成可执行文件-PKG

背景 有时我们需要写一些node的服务或者是工具&#xff0c;但这些工具&服务可以运行的前提条件是当前环境需要安装好node&#xff0c;有时候我们把这些工具&服务发送给别人&#xff0c;在别人的电脑中未必有安装好的node版本&#xff0c;即便有也可能不是期望的指定的…

CMU 15-445 -- Join Algorithms - 09

CMU 15-445 -- Join Algorithms - 09 引言Join AlgorithmsJoin Operator OutputI/O Cost AnalysisNested Loop JoinSimple Nested Loop JoinBlock Nested Loop JoinIndex Nested Loop Join小结 Sort-Merge Join小结&#xff1a; Hash JoinBasic Hash Join AlgorithmGrace Hash …

如何获取铁粉

忽然发现我的铁粉从100变成了540&#xff0c;分享下我的经验&#xff0c;我觉得可能是我的机器人经常互动的问题&#xff0c;结合自己的看法和平台大佬的想法一些进行了梳理&#xff1a; 在当今社交媒体时代&#xff0c;吸引和保留铁粉&#xff08;忠实粉丝&#xff09;对于个…

Robocom2021 初赛

收录一下Robocom初赛的屌题&#xff0c;调了我一个多小时&#xff0c;是我菜了 题目详情 - 7-3 打怪升级 (pintia.cn) 题意&#xff1a; Code&#xff1a; #include<bits/stdc.h> using namespace std;int n, m, a, b, c, d, q, p; int f[1005][1005];const int N 2…

Vector - CANoe - 测试报告设置

file:///C:/Program%20Files/Vector%20CANoe%2015/Help01/CANoeCANalyzerHTML5/CANoeCANalyzer.htm#Topics/CANoeCANalyzer/Windows/TestConfigurations/TCConfigTC.htm 前面有过介绍&#xff0c;我们常用的测试报告还是以XML/HTML格式来生成测试报告&#xff0c;而对于XML/HTM…