欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

rabbitmq 简介

程序员文章站 2022-07-12 12:50:33
...

RabbitMQ可以做什么?

RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,可用于在分布式系统中存储转发消息,主要有以下的技术亮点:

  • 可靠性
  • 灵活的路由
  • 集群部署
  • 高可用的队列消息
  • 可视化的管理工具

RabbitMQ主要用于系统间的双向解耦,当生产者(productor)产生大量的数据时,消费者(consumer)无法快速的消费信息,那么就需要一个类似于中间件的代理服务器,用来处理和保存这些数据,RabbitMQ就扮演了这个角色。

如何使用RabbitMQ

  • Erlang语言包
  • RabbitMQ安装包

基本概念

1.Broker

用来处理数据的消息队列服务器实体

2.虚拟主机(vhost)

由RabbitMQ服务器创建的虚拟消息主机,拥有自己的权限机制,一个broker里可以开设多个vhost,用于不同用户的权限隔离,vhost之间是也完全隔离的。

3.生产者(productor)

产生用于消息通信的数据

4.信道(channel)

消息通道,在AMQP中可以建立多个channel,每个channel代表一个会话任务。

5.交换机(exchange)

(1)接受消息,转发消息到绑定的队列,总共有四种类型的交换器:direct,fanout,topic,headers。
  • direct:转发消息到routing-key指定的队列
  • fanout:转发消息到所有绑定的队列,类似于一种广播发送的方式。
  • topic:按照规则转发消息,这种规则多为模式匹配,也显得更加灵活
(2).交换器在RabbitMQ中是一个存在的实体,不能改变,如有需要只能删除重建。
(3).topic类型的交换器利用匹配规则分析消息的routing-key属性。
(4).属性
  • 持久性:声明时durable属性为true
  • 自动删除:绑定的queue删除也跟着删除
  • 惰性:不会自动创建

6.队列(queue)

(1).队列是RabbitMQ的内部对象,存储消息
(2).可以动态的增加消费者,队列将接受到的消息以轮询(round-robin)的方式均匀的分配给多个消费者
(3).队列的属性
  • 持久性:如果启用,队列将会在server重启之前有效
  • 自动删除:消费者停止使用之后就会自动删除
  • 惰性:不会自动创建
  • 排他性:如果启用,队列只能被声明它的消费者使用。

7.绑定(binding)

表示交换机和队列之间的关系,在进行绑定时,带有一个额外的参数binding-key,来和routing-key相匹配。

8.消费者(consumer)

监听消息队列来进行消息数据的读取

9.高可用性(HA)

(1).在consumer处理完消息后,会发送消息ACK,通知通知RabbitMQ消息已被处理,可以从内存删除。如果消费者因宕机或链接失败等原因没有发送ACK,则RabbitMQ会将消息重新发送给其他监听在队列的下一个消费者。
channel.basicConsume(queuename, noAck=false, consumer);
  • 1
(2).消息和队列的持久化
(3).镜像队列,实现不同节点之间的元数据和消息同步

RPC之nova专题

在Openstack中,每一个Nova服务初始化时会创建两个队列,一个名为“NODE-TYPE.NODE-ID”,另一个名为“NODE-TYPE”,NODE-TYPE是指服务的类型,NODE-ID指节点名称。

1.nova中实现exchange的种类

  • direct:初始化中,各个模块对每一条系统消息自动生成多个队列放入RabbitMQ服务器中,队列中绑定的binding-key要与routing-key匹配
  • topic:各个模块也会自动生成两个队列放入RabbitMQ服务器中。

2.nova中调用RPC的方式

  • RPC.CALL:用于请求和响应方式
  • RPC.CAST:只是提供单向请求

3.nova中模块的逻辑功能

  • Invoker:向消息队列中发送系统请求信息,如Nova-API和Nova-Scheduler,通过RPC.CALL和RPC.CAST两个进程发送系统请求消息。
  • Worker:从消息队列中获取Invoker模块发送的系统请求消息以及向Invoker模块回复系统响应消息,如Nova-Compute、Nova-Volume和Nova-Network,对RPC.CALL做出响应。

4.nova中的exchange domain

  • direct exchange domain: Topic消息生产者(Nova-API或者Nova-Scheduler)与Topic交换器生成逻辑连接,通过PRC.CALL或者RPC.CAST进程将系统请求消息发往Topic交换器。交换器根据不同的routing-key将系统请求消息转发到不同的类型的消息队列。Topic消息消费者探测到新消息已进入响应队列,立即从队列中接收消息并调用执行系统消息所请求的应用程序。

    • 点到点消息队列:Topic消息消费者应用程序接收RPC.CALL的远程调用请求,并在执行相关计算任务之后将结果以系统响应消息的方式通过Direct交换器反馈给Direct消息消费者。
    • 共享消息队列:Topic消息消费者应用程序只是接收RPC.CAST的远程调用请求来执行相关的计算任务,并没有响应消息反馈。
  • topic exchange domain: Direct交换域并不是独立运作,而是受限于Topic交换域中RPC.CALL的远程调用流程与结果,每一个RPC.CALL**一次Direct消息交换的运作。