我的Rabbitmq学习笔记
Rabbitmq学习笔记
Ribbitmq概括
概念
消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
看场景理解mq
如果商品服务和订单服务是两个不同的微服务,在下单的过程中订单服务需要调用商品服务进行扣库存操作。按照传统的方式,下单过程要等到调用完毕之后才能返回下单成功,如果网络产生波动等原因使得商品服务扣库存延迟或者失败,会带来较差的用户体验,如果在高并发的场景下,这样的处理显然是不合适的,那怎么进行优化呢?这就需要消息队列登场了。
消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中,当网络畅通的时候在将消息转发给相应的应用程序或者服务,当然前提是这些服务订阅了该队列。如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度
Windows环境安装
rabbitMQ是Erlang语言开发的所以先下载
双击安装完成后
-
配置环境变量
系统变量 ERLANG_HOME D:\java\erl-24.0 环境变量 %ERLANG_HOME%\bin
-
windows打开cmd控制台输入cmd,测试输入erl出现一下内容
Eshell V12.0 (abort with ^G) 1>
-
下载RabbitMQ
Rabbitmq: https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.4/rabbitmq-server-3.9.4.exe
-
双击安装
-
安装完成后,开始安装RabbitMQ-Plugins插件
先cd D:\java\RabbitMQ Server\rabbitmq_server-3.9.4\sbin
然后运行命令:rabbitmq-plugins enable rabbitmq_management
出现一下画面成功
Enabling plugins on node rabbit@WNDN-750: rabbitmq_management The following plugins have been configured: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch Applying plugin configuration to rabbit@WNDN-750... The following plugins have been enabled: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch started 3 plugins.
-
执行rabbitmqctl status,出现以下内容,说明成功
```java Status of node rabbit@WNDN-750 ... OS PID: 14016 OS: Windows Uptime (seconds): 185 Is under maintenance?: false RabbitMQ version: 3.9.4 Node name: rabbit@WNDN-750 Erlang configuration: Erlang/OTP 24 [erts-12.0] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] Erlang processes: 402 used, 1048576 limit Scheduler run queue: 1 Cluster heartbeat timeout (net_ticktime): 60 ............... ```
-
运行 D:\java\RabbitMQ Server\rabbitmq_server-3.9.4\sbin\rabbitmq-server.bat
等几秒钟,在浏览器访问http://localhost:15672/,并通过默认用户guest进行登录,密码也是guest,登录后的页面
successful……
Linux环境安装
Docker installation
(1)yum 包更新到最新
> yum update
(2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
> yum install -y yum-utils device-mapper-persistent-data lvm2
(3)设置yum源为阿里云
> yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)安装docker
> yum install docker-ce -y
(5)安装后查看docker版本
> docker -v
(6) 安装加速镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://0wrdwnn6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
(7) 获取rabbit镜像:
> docker pull rabbitmq:management
(8)创建并运行容器
> docker run -di --name myrabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management
(9)查看日志
> docker logs -f myrabbit
(10)查看服务
> docker ps -a
(11)关闭容器
> docker be9df4f0292e stop
Other commands
# 启动docker:
systemctl start docker
# 停止docker:
systemctl stop docker
# 重启docker:
systemctl restart docker
# 查看docker状态:
systemctl status docker
# 开机启动:
systemctl enable docker
systemctl unenable docker
# 查看docker概要信息
docker info
# 查看docker帮助文档
docker --help
rabbitmq修改密码
- 在所有应用中找到rabbitMQ command promot程序并单击单开。
- 在打开的命令窗口中输入rabbitmqctl add_user test 123456后回车,test为新增登录账户,123456为账户密码
- 然后再敲入rabbitmqctl set_user_tags test administrator后回车。
- 再给test账户设置 操作主机的权限。敲入rabbitmqctl set_permissions -p / test “.“ “.“ “.*”
- 回到登录页面,用账户名为test,密码为123456进行登录就ok了。
Ribbitmq队列
消息队列协议
AMQP:(全称:Advanced Message Queuing Protocol) 是高级消息队列协议。由摩根大通集团联合其他公司共同设计。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。
特性:
1:分布式事务支持。
2:消息的持久化支持。
3:高性能和高可靠的消息处理优势。
面试题:为什么ribbitmq不使用http协议
- 因为http协议请求头很复杂,包含了cookies,数据的加密解密,状态码等附加功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,他其实就负责数据传递,存储,分发就可以了,一定要追求的是高性能,尽量简洁,快速
- 大部分情况下http都是短连接,在交互过程中可能因为服务器宕机中断以后就不会进行持久化,就会会照成请求的丢失,这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期获取消息得过程,出现问题和故障要对数据或消息进行持久化等,目的就是为了保障数据得高可靠和稳健的运行
消息队列持久化
RabbitMQ在两种情况下会将消息写入磁盘:
- 消息本身在
publish
的时候就要求消息写入磁盘; 内存紧张
需要将部分内存中的消息转移到磁盘;
消息队列消费策略
MQ消息队列有如下几个角色
1:生产者
2:存储消息
3:消费者
那么生产者生成消息以后,MQ进行存储,消费者是如何获取消息的呢?一般获取数据的方式无外乎推(push)或者拉(pull)两种方式,典型的git就有推拉机制,我们发送的http请求就是一种典型的拉取数据库数据返回的过程。而消息队列MQ是一种推送的过程,而这些推机制会适用到很多的业务场景也有很多对应推机制策略。
场景1
比如我在APP上下了一个订单,我们的系统和服务很多,我们如何得知这个消息被那个系统或者那些服务或者系统进行消费,那这个时候就需要一个分发的策略。这就需要消费策略。或者称之为消费的方法论。
场景2
在发送消息的过程中可能会出现异常,或者网络的抖动,故障等等因为造成消息的无法消费,比如用户在下订单,消费MQ接受,订单系统出现故障,导致用户支付失败,那么这个时候就需要消息中间件就必须支持消息重试机制策略。也就是支持:出现问题和故障的情况下,消息不丢失还可以进行重发。
消息队列高可用和高可靠
什么是高可用机制
高可用是指产品在规定的条件和规定的时刻或者时间内处于可执行规定功能状态的能力。
当业务量增加时,请求也过大,一台消息中间件的服务器会触及硬件(CPU、内存、磁盘)的极限,一台消息中 间件的服务器已经无法满足业务的需求,所以消息中间件必须支持集群部署,来达到高可用的目的。
什么是高可靠
在高并发应用场景中,如果不能保证系统的高可靠,那造成的隐患和损失是非常严重的。
保证中间件消息的可靠性尼?可从两个方面考虑
-
消息的传输:通过协议来保证系统间数据解析的正确性。
-
消息的存储可靠:通过持久化来保证消息的可靠性。
反正终归三句话:
1:要么消息共享,
2:要么消息同步
3:要么元数据共享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)