消息中间件-RabbitMQ介绍

news2024/11/28 18:35:27

3037fe5224cb4449b5ed6c623d5dcffb.jpg一、基础知识

 

1. 什么是RabbitMQ

RabbitMQ是2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,简称MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法,由Erlang(专门针对于大数据高并发的语言)语言开发,可复用的企业消息系统,是当前最主流的消息中间件之一,具有可靠性、灵活的路由、消息集群简单、队列高可用、多种协议的支持、管理界面、跟踪机制以及插件机制。

 

 

2.什么是消息和队列

1.消息 就是数据,增删改查的数据。例如在员工管理系统中增删改查的数据

 

2.队列 指的是一端进数据一端出数据,例如C#中(Queue数据结构)

 

 

3.什么是消息队列

1.消息队列指:一端进消息,一端出消息

 

2.RabbitMQ就是实现了消息队列概念的一个组件,以面向对象的思想去理解,消息队列就是类,而RabbitMQ就是实例,当然不仅仅只有RabbitMQ,例如ActiveMQ,RocketMQ,Kafka,包括Redis也可以实现消息队列。

 

 

4.什么地方使用RabbitMQ

1.在常见的单体架构中,主要流程是用户UI操作发起Http请求>服务器处理>然后由服务器直接和数据库交互,最后同步反馈用户结果

 

 

 

2.在微服务架构中,例如下图中的员工管理系统,UI与微服务通信,主要是通过Http或者gRPC同步通信

 

 

 

 

问题分析

 

在上述2种情况下,我们发现在UI请求时都是同步操作 ,第2种架构虽然将整体服务按业务拆分成不同的微服务并且对应各自的数据库,但是在用户与微服务通信时,存在的问题依然没有解决,例如数据库的承载能力只能处理10w个请求,如果遇到高并发情况下,UI发起50w请求,那数据库是远远承载不了的,从而导致如下问题。

 

1.高并发请求导致系统性能下降响应慢,同时数据库承载风险加大

 

2.扩展性不强UI操作的交互对业务的依赖较大,导致用户体验下降

 

3.瞬时流量涌入巨大的话,服务器可能直接挂了

 

 

解决方案

 

 

 

为了解决性能瓶颈问题。我们需要将同步通信换成异步通信方式。因此就使用消息队列,用户在UI中操作直接写入RabbitMQ然后直接返回,剩下的业务操作由消息队列和各自的微服务来完成

RabbitMQ的优势

 

异步处理,响应快,增加了数据库(服务器的承载能力)

 

削峰,可以把流量的高峰分解到不同的时间段来处理

 

解耦(扩展性就更强),让UI和业务独立演化

 

高可用,处理器如果发生故障了,对其他的处理器没有影响

 

RabbitMQ的不足

 

增加了系统复杂性,不方便调试和开发,在使用RabbitMQ以前前端直接和服务交互,现在加了一层

 

即时性降低了,在某一程度上提升了用户操作体验,也降低了用户体验,但是避免不了,取长补短

 

更加依赖消息队列了

 

 

5.RabbitMQ组成概念

1.ConnectionFactory 为Connection的制造工厂。

 

2.Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。

 

3.Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。

 

4.Exchange(交换机) 我们通常认为生产者将消息投递到Queue中,实际上实际的情况是,生产者将消息发送到Exchange,由Exchange将消息路由到一个或多个Queue中(或者丢弃),而在RabbitMQ中的Exchange一共有4种策略,分别为:fanout(扇形)、direct(直连)、topic(主题)、headers(头部)

 

二、如何落地RabbitMQ

1.RabbitMQ环境安装

1.下载RabbitMQ

 

2.运行环境erlang

 

3.安装完成之后,加载RabbitMQ管理插件

 

rabbitmq-plugins enable rabbitmq_management

4.安装成功访问RabbitMQ管理后台http://localhost:15672

 

2.创建系统业务

1.分别创建考勤服务,请假服务,计算薪酬服务,邮件服务,短信服务消费者角色

 

2.创建员工管理网站用于模拟前端调用,主要充当生产者角色

 

3.在员工管理网站和每一个模拟微服务中通过nuget引入RabbitMQ.Client

 

4.在员工管理网站中创建模拟添加考勤的控制器并加入生产者代码

 

 //创建连接

 using (var connection = factory.CreateConnection())

 {

     //创建通道

     var channel = connection.CreateModel();

     //定义队列

     channel.QueueDeclare("CreateAttendance", false, false, false, null);

 

     string json = JsonConvert.SerializeObject(attendanceDto);

 

     //创建内容对象

     var properties = channel.CreateBasicProperties();

     //发送消息

     channel.BasicPublish(exchange: "",routingKey: "CreateAttendance",basicProperties: properties,body: Encoding.UTF8.GetBytes(json));

 }

 

5.在考勤微服务中创建接口,并在接口中加入消费者代码

 

var connection = factory.CreateConnection();

var channel = connection.CreateModel();   

//创建消费者事件

var consumer = new EventingBasicConsumer(channel);

consumer.Received += (model, ea) =>

{

    var body = ea.Body;

    // 1、逻辑代码,添加到数据库

    var message = Encoding.UTF8.GetString(body.ToArray());

    object json = JsonConvert.DeserializeObject(message);

    Console.WriteLine(" [x] 创建考勤信息 {0}", message);

};

//设置消费者属性

//p1.监听队列p2.消息确认ACK p3.消费者实例赋值

channel.BasicConsume(queue: "CreateAttendance",autoAck: false,consumer:consumer);

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

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

相关文章

Git 内容学习

一、Git 的理解 Git是一个分布式版本控制系统(Distributed Version Control System,简称 DVCS),用于对项目源代码进行管理和跟踪变更。分为两种类型的仓库:本地仓库和远程仓库。 二、Git 的工作流程 详解如下&#x…

【大学英语视听说上】压头韵收集 + 自然环境口语问答 + 口语考试练习

压头韵: 自然环境口语问答 Q1: Do you like wildlife? Why? Yes, I like wildlife because it represents the rich biodiversity of our planet. Wildlife plays crucial roles in ecosystem health and resilience, providing essential services like pollina…

【LeetCode刷题-栈与队列】--232.用栈实现队列

232.用栈实现队列 class MyQueue {Deque<Integer> inStack;Deque<Integer> outStack;public MyQueue() {inStack new ArrayDeque<Integer>();outStack new ArrayDeque<Integer>();}public void push(int x) {inStack.push(x);}public int pop() {if(…

Python基础入门例程36-NP36 谁的数字大(运算符)

最近的博文&#xff1a; Python基础入门例程35-NP35 朋友的年龄是否相等&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程34-NP34 除法与取模运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程33-NP33 乘法与幂运算&#xff08;运算符&#xff0…

【软考中级】软件设计师-下午题

下午题 试题一 黑洞&#xff1a;加工有输入无输出 白洞(奇迹)&#xff1a;加工有输出无输入 灰洞&#xff1a;数据流输入的加工不足以产生输出 结构化语言&#xff1a; IF *** THEN ELSE IF *** THEN ******* END IF END IF 数据流的父子图平衡&#xff0c;如果父子图平衡就不…

力扣每日一题100:相同的树

题目描述&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&…

网络编程套接字(2)——简单的TCP网络程序

文章目录 一.简单的TCP网络程序1.服务端创建套接字2.服务端绑定3.服务端监听4.服务端获取连接5.服务端处理请求6.客户端创建套接字7.客户端连接服务器8.客户端发起请求9.服务器测试10.单执行流服务器的弊端 二.多进程版的TCP网络程序1.捕捉SIGCHLD信号2.让孙子进程提供服务 三.…

树结构及其算法-二叉运算树

目录 树结构及其算法-二叉运算树 C代码 树结构及其算法-二叉运算树 二叉树的应用实际上相当广泛&#xff0c;例如表达式之间的转换。可以把中序表达式按运算符优先级的顺序建成一棵二叉运算树&#xff08;Binary Expression Tree&#xff0c;或称为二叉表达式树&#xff09;…

请求地址‘/operlog‘,发生未知异常

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是全栈工…

EtherCAT主站读取从站EEPROM抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1 抓包分析 1.1 报文总览 本文让主站去读取从站1字地址为0的EEPROM数据内容&#xff0c;主站读取从站EEPROM数据内容使用Wireshark抓包如下&#xff1a; 1.2 EEPROM读…

经典喝汽水问题

喝汽水&#xff0c;1瓶汽水1元&#xff0c;两个空瓶可以兑换1瓶汽水&#xff0c;给20元&#xff0c;可以喝到多少瓶汽水&#xff1f; 有两种解决方案 1.第一种 //喝汽水问题 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>int main() {int money 0;int empty 0…

Vue3后台管理系统框架之时间格式化封装

一般每条数据都会有创建时间或者更新时间 由于我们在数据库设置时间类型为datatime 如何把element plus 表格中的创建时间格式进行格式化&#xff1f; 如&#xff1a;2023-11-03T13:59:05.000Z修改为2023-11-03 21:59 修改为 YYYY-MM-DD HH:mm格式 export const formatDate…

使用 curator 连接 zookeeper 集群 Invalid config event received

dubbo整合zookeeper 如图&#xff0c;错误日志 2023-11-04 21:16:18.699 ERROR 7459 [main-EventThread] org.apache.curator.framework.imps.EnsembleTracker Caller0 at org.apache.curator.framework.imps.EnsembleTracker.processConfigData(EnsembleTracker.java…

更新一下数据集

UCI Machine Learning Repository UCI的数据集还是挺老牌的&#xff0c;最近换了地址&#xff0c;我就再记录一下。 左边是比较常见的数据集&#xff0c;比如Iris很经典&#xff0c;Heart Disease这也是&#xff0c;包括Wine&#xff0c;通常对于初学者学习比较好&#xff0c;…

WPF开源控件HandyControl——零基础教程

学习Handycontrol的过程中,为后边快速开发,写的零基础教程,尽量看完就可以实践! 参考教程 中文文档:欢迎使用HandyControl | HandyOrg Github代码:https://github.com/HandyOrg/HandyControl 使用教程:WPF-HandyControl安装和使用 - 掘金 安装配置教程 创建wpf项目 …

Zinx框架-游戏服务器开发002:框架学习-按照三层结构模式重构测试代码+Tcp数据适配+时间轮定时器

文章目录 1 Zinx框架总览2 三层模式的分析3 三层重构原有的功能 - 头文件3.1 通道层Stdin和Stdout类3.1.2 StdInChannel3.1.2 StdOutChannel 3.2 协议层CmdCheck和CmdMsg类3.2.1 CmdCheck单例模式3.2.1.1 单例模式3.2.1.2 * 命令识别类向业务层不同类别做分发 3.2.2 CmdMsg自定…

物理场仿真教程(一)——Ubuntu下Salome_meca 软件安装

一、什么是Salome_meca &#xff1f; Salome_meca 是一个开源的有限元分析软件套件&#xff0c;主要用于模拟和分析复杂的力学问题。它是 Salome 平台的一部分&#xff0c;Salome 是一个通用的集成化软件环境&#xff0c;用于建模、预处理、模拟和后处理各种复杂的工程和科学问…

IDA反编译apk修改数据后重新打包

1、需要的工具 apktool、ida、il2cppDumper、ApkSignTools 2、说明 如果是mono打包的&#xff0c;不管是apk还是exe&#xff0c;都可以直接拿到直接从包内拿到 Assembly-Csharp.dll&#xff0c;只要开发者没有对这个文件进行加密&#xff0c;都可以轻松用 ILSpy 或 dnSpy 进行…

ChinaSoft 论坛巡礼 | CCF-华为胡杨林基金-系统软件专项(海报)论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

[PHP]魔众文档管理系统 v4.3.0

魔众文档管理支持Markdown、图表、脑图、富文本&#xff0c;功能全面、安全稳定&#xff0c;支持标签、分类&#xff0c;可以更好的在线管理个人文档。 魔众文档管理系统发布v4.3.0版本&#xff0c;新功能和Bug修复累计8项&#xff0c;新增未分类无标签等特性&#xff0c;系统…