RabbitMQ

2023-09-16 22:31:40

1.初识MQ

1.1.同步和异步通讯

微服务间通讯有同步和异步两种方式:

同步通讯:就像打电话,需要实时响应。

异步通讯:就像发邮件,不需要马上回复。

两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。

1.1.1.同步通讯

我们之前学习的Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题:

总结:

同步调用的优点:

  • 时效性较强,可以立即得到结果

同步调用的问题:

  • 耦合度高

  • 性能和吞吐能力下降

  • 有额外的资源消耗

  • 有级联失败问题

1.1.2.异步通讯

异步调用常见实现就是事件驱动模式

我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。

在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。

订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。

为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)经纪人。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。

Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。

好处:

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速

  • 故障隔离:服务没有直接调用,不存在级联失败问题

  • 调用间没有阻塞,不会造成无效的资源占用

  • 耦合度极低,每个服务都可以灵活插拔,可替换

  • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

缺点:

  • 架构复杂了,业务没有明显的流程线,不好管理

  • 需要依赖于Broker的可靠、安全、性能

好在现在开源软件或云平台上 Broker 的软件是非常成熟的,比较常见的一种就是我们今天要学习的MQ技术。

1.2.技术对比:

MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

比较常见的MQ实现:

  • ActiveMQ

  • RabbitMQ

  • RocketMQ

  • Kafka

几种常见MQ的对比:

RabbitMQ ActiveMQ RocketMQ Kafka
公司/社区 Rabbit Apache 阿里 Apache
开发语言 Erlang Java Java Scala&Java
协议支持 AMQP,XMPP,SMTP,STOMP OpenWire,STOMP,REST,XMPP,AMQP 自定义协议 自定义协议
可用性 一般
单机吞吐量 一般 非常高
消息延迟 微秒级 毫秒级 毫秒级 毫秒以内
消息可靠性 一般 一般

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延迟:RabbitMQ、Kafka

2.快速入门

2.1.安装RabbitMQ

安装RabbitMQ,参考课前资料:

在Linux中运行时,加载rabbitmq镜像,然后运行时设置端口号及用户名密码

docker run \
-e RABBITMQ_DEFAULT_USER=yrh \
-e RABBITMQ_DEFAULT_PASS=123456 \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management

yrh为用户名,123456即为密码

15672为登录端口,5672则为通信端口。登录进入如下界面

 

MQ的基本结构:

RabbitMQ中的一些角色:

  • publisher:生产者

  • consumer:消费者

  • exchange个:交换机,负责消息路由

  • queue:队列,存储消息

  • virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离

2.2.RabbitMQ消息模型

RabbitMQ官方提供了5个不同的Demo示例,对应了不同的消息模型:

2.4.入门案例

简单队列模式的模型图:

官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:

  • publisher:消息发布者,将消息发送到队列queue

  • queue:消息队列,负责接受并缓存消息

  • consumer:订阅队列,处理队列中的消息

2.4.1.publisher实现

思路:

  • 建立连接

  • 创建Channel

  • 声明队列

  • 发送消息

  • 关闭连接和channel

代码实现:

package cn.itcast.mq.helloworld;
​
import com.rabbitmq.client.Channel;
import com.rabbitm
更多推荐

全国职业技能大赛云计算--高职组赛题卷②(容器云)

全国职业技能大赛云计算--高职组赛题卷②(容器云)第二场次题目:容器云平台部署与运维任务1DockerCE及私有仓库安装任务(5分)任务2基于容器的web应用系统部署任务(15分)任务3基于容器的持续集成部署任务(15分)任务4Kubernetes容器云平台部署与运维(15分,本任务只公布考试范围,不公布赛题)需要环境

全国职业技能大赛云计算--高职组赛题卷⑤(私有云)

全国职业技能大赛云计算--高职组赛题卷⑤(私有云)第一场次题目:OpenStack平台部署与运维任务1基础运维任务(5分)任务2OpenStack搭建任务(15分)任务3OpenStack云平台运维(15分)任务4OpenStack云平台运维开发(15分,本任务只公布考试范围,不公布赛题)需要环境私信博主!!!第一场次

人工智能是否有风险

批判性思考人工智能这一挑战经常由人工智能的支持者提出:如果一个机器人足够聪明,与自然人完全没有区别,那么它拥有公民权利难道不是道德和正确的吗?“杀死”这样的生物岂不是有错?我的回答是,这样的生物不能被赋予公民权利,并且消除它本身并没有错。回答通常是这样的:“这难道不是人类自我在说话吗?这就是基于基质的歧视,不是吗?”不

虹科案例 | Zuellig Pharma和ELPRO通过符合GDP标准的温度监测和高效的温度数据管理为未来发展奠定基础

在本案例研究中,您将了解ZuelligPharma实施了温度监测解决方案,以一致的数据结构获取各国和各种运输方式的数据;通过将温度数据上传到其数据库管理系统,显著提高了其效率;并建立了为未来管理决策提供数据增值使用的基础。项目合作伙伴ZuelligPharma是亚洲最大的医疗保健服务集团之一。该公司提供世界级的分销、数

【入门篇】ClickHouse最优秀的开源列式存储数据库

文章目录一、什么是ClickHouse?OLAP场景的关键特征列式数据库更适合OLAP场景的原因输入/输出CPU1.1ClickHouse的定义与发展历程1.2ClickHouse的版本介绍二、ClickHouse的主要特性2.1高性能的列式存储2.2实时的分析查询2.3高度可扩展性2.4数据压缩2.5SQL支持2.6

[npm] npx 介绍与使用说明

[npm]npx介绍与使用说明npm的由来npx是什么?npx特点npx的特点项目安装包的使用全局安装包的避免指定工具包版本--no-install参数和--ignore-existing参数使用不同版本的node-p参数-c参数实战应用执行GitHub源码npm的由来说到npm就离不开社区文化,那什么是社区文化?社区

【C++】构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 中 不能调用 构造函数 )

文章目录一、匿名对象生命周期1、匿名对象生命周期说明2、代码示例-匿名对象生命周期二、构造函数中调用构造函数1、构造函数中不能调用构造函数2、代码示例-构造函数中调用构造函数构造函数初始化列表总结:初始化列表可以为类的成员变量提供初始值;初始化列表可以调用类的成员变量类型的构造函数进行成员变量初始化操作;初始化列表可以

蓝桥杯 题库 简单 每日十题 day3

01约数个数题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。1200000有多少个约数(只计算正约数)。解题思路枚举,从1开始一直到1200000本身都作为1200000的除数,如果可以整除,则是它的约数#include<iostream>usingnamespacestd;intmai

【C++】构造函数初始化列表 ① ( 类对象作为成员变量时的构造函数问题 | 构造函数初始化列表语法规则 )

文章目录一、类对象作为成员变量时的构造函数问题1、问题描述2、错误代码示例二、构造函数初始化列表1、构造函数初始化列表语法规则2、代码示例-构造函数初始化列表语法规则一、类对象作为成员变量时的构造函数问题1、问题描述如果一个类A的对象作为另外一个类B的成员变量时,在以下场景会报错:为类A定义有参的构造函数,那么A的无参

《重构改善代码设计》

文章目录1.重构的原则2.代码的坏味道3.第一组重构3.1.提炼函数3.2.内联函数3.3.提炼变量3.4.内联变量3.5.修改函数名称3.6.封装变量3.7.变量改名3.8.引入参数对象3.9.函数组合成类3.10.函数组合成变换3.11.拆分阶段4.封装4.1.封装记录4.2.封装集合4.3.以对象取代基本类型4.

redis 初识与入门

1.什么是RedisRedis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。Redis提供了多种数据类型来支持不同的业务场景,比如String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)

热文推荐