RabbitMQ简介

RabbitMQ:教程

RabbitMQ实战教程

1.什么是MQ?

  • 消息队列(Message Queue,简称MQ),从字面意思上看,其本质无非就是个队列,FIFO先入先出(排队买票,先到先得,买定离手),只不过队列中存放的内容是message而已。

  • 其主要用途:不同的进程Process/线程Thread之间通信。

    为什么会产生消息队列?有几个原因:
  • 不同进程(proess)之间传递消息时,两个进程之间耦合度过高,改动一个进程,引发必须修改另一个进程(或者说一个系统或者功能的改变,必然导致另外一个系统或者功能的改变),为了隔离这两个进程,这就需要在这两个进程之间隔离出一个单独的模块,在两个进程之间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;

  • 不同进程(proess)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且某一个进程接收的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;

  • 现在市面上的MQ框架还是非常之多的,比较流行的有RabbitMQ、ActiveMQ、ZeroMQ、kafka、以及阿里开源的RocketMQ。我这里暂时只介绍RabbitMQ。

2.RabbitMQ

2.1 RabbitMQ的简介
  • MQ为Message Queue,消息队列是应用程序和应用程序之间的通信方法。
  • RabbitMQ是一个开源的,在AMQP基础上完整的,可复用的企业消息系统。
  • 多种开发语言支持:Java、Python、Ruby、.NET、php、C/C++、node.js等。
  • 开发语言:Erlang - 面向并发的编程语言。

AMQP:消息队列的UI个协议。AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。

​ 其中:ActiveMQ是JMS消息服务器

​ Kafa是分布式订阅消息系统

3.RabbitMQ主要特性

  • 可伸缩性:集群服务

  • 消息持久化:从内存持久化消息到硬盘,再从硬盘加载到内存

4.消息使用及展示

​ RabbitMQ的作用:作为一个中间件存储消息

  • 一对一消息分发:
单机消费
功能A
MQ中间件
功能B/消费者
  • 一对多消息分发(多系统消费):
消费
消费
消费
消费
功能A
MQ中间件
系统1 - 功能B
系统2 - 功能B
系统3 - 功能B
系统... - 功能B
  • 多对多处理消息(分布式分发-消费):
分发消息
分发消息
分发消息
分发消息
消费
消费
消费
消费
系统1
MQ中间件
系统2
系统3
系统...
系统1 - 功能
系统2 - 功能
系统3 - 功能
系统... - 功能
  • 特殊/常见场景(消息推送、异步通知):
推送消息
推送消息
推送消息
推送消息
集群系统
处理事务
消息入MQ
至A1服务器/商户地址
至A2服务器/商户地址
至A3服务器/商户地址
至A4服务器/商户地址
  • 常见场景:日志划分
type:info
type:debug
type:warn
type:error
集群系统A
处理事务
集群系统B
集群系统...
常规日志
警告日志
警告日志

基于消息通信的RPC调用 之 RabbitMQ分析

一、openstack Nova的服务间通信机制

Openstack Nova中是由许多组件构成的。而不同的服务之间,都是通过RPC来实现通信。同时,由于采用的是AMQP协议,因此组件之间具有很强的松耦合性。表现在:

(1)、客户端(发布者)无需知道服务器(订阅者)的具体位置

(2)、服务器无需和客户端同步运行。当客户端发起RPC调用,服务器可能并未运行。

(3)、远程调用的随机均衡性。当客户端发起RPC调用时,服务器不止一个。此时,可以随机选择一个服务器来处理消息。

二、Nova远程调用的方式

(1)、两种远程调用方式------rpc.call和rpc.cast。

(2)、rpc.call方式是指request/response方式。当客户端向服务器端发起RPC调用时,还需获取服务器端的响应(有返回值的远程过程调用)。

(3)、rpc.cast方式是指客户端发起RPC调用后,不需要获取服务器端的响应(不带返回值的远程过程调用)

(4)、处理rpc.call方式的远程调用,Nova采用两种消息交换方式:答案交换方式(direct exchange)和话题交换方式(topic exchange)方式。其中话题交换方式主要用于客户端发起远程调用(rpc.call和rpc.cast),答案交换方式主要用于服务器端返回rpc.call调用的结果。

(5)、Nova定义了话题/答案订阅者、话题/答案发布者以及话题/答案交换器等部件。各个部件的结构图如下所示:

https://i-blog.csdnimg.cn/blog_migrate/960eb911ae120e6b0dd4f9c0bd0c3181.png

Invoker是指RPC调用的发起方,而Woker是指RPC调用的执行方。

a、一个主题交换器可以关联多个队列,而一个直接交换器只能关联一个队列。

在直接交换器中,发布者、交换器、队列和消费者都是唯一的。消费者和发布者之间建立了一个专门的通路,就是"直接"的意义。

b、一个主题交换器可以关联多个队列,而每个队列都关联一个主题。主题交换器中,共有topic和topic.host两种类型的主题。

topic.host类型的主题是指订阅者直接点名需要哪台服务器进行响应。例如:当收到关闭虚拟机请求时,Nova-scheduler会调用虚拟机所在主机的Nova-compute来关闭相应虚拟机。

topic类型的主题是指发布者不指定响应的服务器,而是指定消息的主题。此时,交换器将会随机选择一个消费者处理RPC请求。

显然topic类型的主题可以方便实现负载均衡。例如:在openstack中可以创建多个scheduler节点。当客户端发送创建虚拟机的请求时,会随机选择一个scheduler节点处理该请求。

三、各个部件详细说明

1、Topic Publisher(话题发布者或者会话发布者):

​ 话题发布者的出现主要是rpc.call和rpc.cast函数调用被执行的时候。一个话题发布者实例主要是用来把一个消息推送至消息系统中。 每个会话发布者都是一直在链路上进行收听,当消息传输完毕的时候(比如rpc.cast)或者接收到响应之后(rpc.call),会话发布者的生命周期就结束了。

2、Direct Consumer(直接消费者/订阅者或者答案接收方):

​ 当且仅当rpc.call操作被执行的时候,一个Direct Consumer就被唤起。一个实例化的答案接收方就会接收来自队列的响应消息。与会话发布者类似,生命周期是消息传输影响的。在队列中的消息,是通过一个UUID标识符进行区别的。这些UUID信息会在会话发起者发起会话就封装进去的。

3、Topic Consumer(话题消费者/订阅者或者会话接收方):

​ 当Worker被实例化的时候,话题消费者就开始工作了。会话接收方的工作主要是从队列中接受消息,并将消息中的指令转化为相应的行动。一个会话接收方一直链接在相同的topic交换链路上,不管是通过共享的队列或者是独立排斥性的队列。

每个Worker有两个会话接收方,一个面向rpc.cast操作(连接到一个共享的消息队列,消息交换的标志是topic)

另一个会话接收方用于rpc.call的(连接到一个排斥性、独立的交换通道,交换的时候,消息交换的标志topic.host)

4、Direct Publisher(直接发送方或答案发布者):

​ 当且仅当rpc.call请求到达workers之后,答案发送方就开始工作了。答案发送方的主要工作就是将Worker所做的工作的结果发送给会话接收方。答案发送方连接到一个基于答案的交换。交换之间的识别,主要通过进来的消息。

5、Topic Exchange(话题交换器):

​ 这种交换主要基于一张依赖虚拟主机上下文的路由表,类型决定路由策略。例如:基于话题的交换或者基于答案的交换,会采用不同的策略。一个消息转发器中,针对一个topic的交换,也只有一个话题交换器。

6、Direct Exchange(答案交换器):

​ 答案交换器主要是依赖rpc.call操作的。当rpc.call操作被调用的时候,答案交换器的路由表就产生了。在一个消息转发器的生命周期中,会有许多这种交换器。每个答案交换器都是为一个rpc.call服务。

四、总结

Nova定义的rpc.call和rpc.cast两种远程调用方式中,rpc.call比较复杂。简单介绍下rpc.call方式远程调用的流程。

1、客户端通过主题发布者向主题交换器发送RPC消息。主题交换器根据消息的类型,将消息保存在相应的队列中。

2、服务器端的主题消费者从队列中接收并处理RPC消息。

3、服务器端的主题消费者处理完消息以后,通过直接发布者将消息发送给客户端。

4、客户端通过直接消费者接收服务器返回的RPC结果。

rpc.call远程调用的流程如图:

https://i-blog.csdnimg.cn/blog_migrate/406e409a4c633831460853fd14dab2ef.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ是一个开源的消息中间件,用于在应用程序之间传递消息。它使用AMQP(高级消息队列协议)作为消息传递的标准协议。在实际应用中,可以使用RabbitMQ来实现消息的生产和消费。 要实现一个RabbitMQ实战demo,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Erlang和RabbitMQ。你可以使用命令`rabbitmq-server -detached`来启动RabbitMQ服务,并使用`rabbitmqctl status`来查看服务状态。如果需要关闭服务,可以使用`rabbitmqctl stop`命令。 2. 在你的应用程序中,添加RabbitMQ的配置信息。你可以在应用的配置文件中添加以下内容: ``` spring.application.name=springboot-rabbitmq spring.rabbitmq.host=192.168.217.128 spring.rabbitmq.port=5672 spring.rabbitmq.username=developer spring.rabbitmq.password=dev123456 spring.rabbitmq.virtual-host=/ spring.rabbitmq.listener.direct.acknowledge-mode=manual ``` 其中,`spring.rabbitmq.host`是RabbitMQ的IP地址,`spring.rabbitmq.port`是RabbitMQ的端口号,`spring.rabbitmq.username`和`spring.rabbitmq.password`是RabbitMQ的用户名和密码,`spring.rabbitmq.virtual-host`是RabbitMQ的虚拟主机,`spring.rabbitmq.listener.direct.acknowledge-mode`是消息的确认模式。 3. 在你的应用程序中,编写生产者和消费者的代码。生产者负责发送消息到RabbitMQ,消费者负责接收并处理消息。你可以根据你的需求来编写相应的代码逻辑。 4. 运行你的应用程序,并测试RabbitMQ的功能。你可以通过发送消息到RabbitMQ来测试生产者的功能,然后通过消费者来接收并处理这些消息。 这是一个简单的RabbitMQ实战demo的步骤,你可以根据你的具体需求来进行相应的修改和扩展。希望对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [RabbitMQ 实战](https://blog.csdn.net/weixin_58026642/article/details/121486694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [《RabbitMQ 实战指南》第一章 RabbitMQ 简介](https://blog.csdn.net/qq_45593575/article/details/122155110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值