Skip to content

1.官方的简单架构图

Publisher - 生产者:发布消息到RabbitMQ中的Exchange

Consumer - 消费者:监听RabbitMQ中的Queue中的消息

Exchange - 交换机:和生产者建立连接并接收生产者的消息

Queue - 队列:Exchange会将消息分发到指定的Queue,Queue和消费者进行交互

Routes - 路由:交换机以什么样的策略将消息发布到Queue

2.RabbitMQ的完整架构图

核心概念:

  • Server :又称Broker接受客户端的连接,实现AMQP实体服务。安装rabbitmq-server
  • Connection :连接,应用程序与Broker的网络连接TCP/IP/三次握手和四次挥手
  • Channel :网络信道,几乎所有的操作都在Channel中进行,Channe|是进行消息读写的通道,客户端可以建立对各 Channel,每个Channel代表-个会话任务 。
  • Message :消息: 服务与应用程序之间传送的数据,Properties和body组成, Properties可是对消息进行修饰, 比 如消息的优先级,延迟等高级特性,Body则就 是消息体的内容。 Virtual Host虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个虚拟主机理由可以有若干个Exhange和 Queueu,同-个虚拟主机里面不能有相同名字的Exchange
  • Exchange :交换机,接受消息,根据路由键发送消息到绑定的队列。(==不具备消息存储的能力==)
  • Bindings : Exchange和Queue之间的虚拟连接,binding中可以保护多 个routing key.
  • Routing key :是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。
  • Queue :队列:也成为Message Queue,消息队列,保存消息并将它们转发给消费者

3.简介

RabbitMQ 是一个在 AMQP(Advanced Message Queuing Protocol )基础上实现的,可复用的企业消息系统。它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展。它支持多种客户端如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。它同时实现了一个Broker构架,这意味着消息在发送给客户端时先在中心队列排队,对路由(Routing)、负载均衡(Load balance)或者数据持久化都有很好的支持。

RabbitMQ 特点

  • 可靠性

  • 灵活的路由

  • 扩展性

  • 高可用性

  • 多种协议

  • 多语言客户端

  • 管理界面

  • 插件机制

  • 支持高性能的序列化转换, 异步化发送消息

  • 支持消息生产实例与消费实例的链接池化缓存化, 提升性能

  • 支持可靠性投递消息, 保障消息100%不丢失

  • 支持消费端的幂等操作, 避免消费端重复消费的问题

  • 支持迅速消息发送模式, 在一些日志收集/统计分析等需求下可以保证高性能, 高吞吐量

  • 支持延迟消息模式, 消息可以延迟发送, 指定延迟时间, 用于某些延迟检查, 服务限流场景

  • 支持事务消息, 器100%保障可靠性投递, 在金融行业单笔大金额操作时会有此类需求

  • 支持顺序消息, 保证消息送达消费端的先后顺序

  • 支持消息补偿, 重试, 以及快速定位异常/失败消息

  • 支持集群消息负载均衡, 保障消息落到具体SET集群的负载均衡

  • 支持消息路由策略, 指定某些消息路由到指定的SET集群

AMQP 介绍

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

什么是消息队列

MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

消息队列的使用场景是怎样的?

RabbitMQ 应用场景

对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalability);如果使用socket那么不同的模块的确可以部署到不同的机器上,但是还是有很多问题需要解决。比如:

1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何方式丢失?

2)如何降低发送者和接收者的耦合度?

3)如何让Priority高的接收者先接到数据?

4)如何做到load balance?有效均衡接收者的负载?

5)如何有效的将数据发送到相关的接收者?也就是说将接收者subscribe 不同的数据,如何做有效的filter。

6)如何做到可扩展,甚至将这个通信模块发到cluster上?

7)如何保证接收者接收到了完整,正确的数据?

AMDQ协议解决了以上的问题,而RabbitMQ实现了AMQP

RabbitMQ 概念介绍

  • Broker:简单来说就是消息队列服务器实体。
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
  • Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  • vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
  • producer:消息生产者,就是投递消息的程序。
  • consumer:消息消费者,就是接受消息的程序。
  • channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

RabbitMQ从整体上来看是一个典型的生产者消费者模型,主要负责接收、存储和转发消息

RabbitMQ 使用流程

AMQP模型中,消息在producer中产生,发送到MQ的exchange上,exchange根据配置的路由方式发到相应的Queue上,Queue又将消息发送给consumer,消息从queue到consumer有push和pull两种方式。消息队列的使用过程大概如下:

  1. 客户端连接到消息队列服务器,打开一个channel。
  2. 客户端声明一个exchange,并设置相关属性。
  3. 客户端声明一个queue,并设置相关属性。
  4. 客户端使用routing key,在exchange和queue之间建立好绑定关系。
  5. 客户端投递消息到exchange。

exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列

4.端口

4.1:AMQP默认端口(5672)

AMQP(高级消息队列协议)是一种网络协议,用于在应用程序之间传递消息,通常用于消息队列系统。在RabbitMQ中,AMQP协议是消息传递的核心协议,它定义了消息的格式、传递方法和消息队列的行为。下面是您提到的问题的解答:

  1. AMQP 协议是什么以及它在RabbitMQ中的重要性:
    • AMQP(Advanced Message Queuing Protocol)是一种网络协议,用于消息传递。它定义了消息的格式和传递规则,允许不同应用程序之间进行异步通信。在RabbitMQ中,AMQP是主要的通信协议,用于生产者将消息发送到队列,消费者从队列中接收消息,以及在消息代理(如RabbitMQ)中进行消息路由和处理。AMQP的重要性在于它提供了一种标准的方法,使不同的应用程序能够可靠地交换消息,从而构建强大的分布式系统。
  1. 为什么5672端口是默认端口:
    • 5672端口是AMQP协议的默认端口,通常用于与RabbitMQ建立非加密连接。这个端口之所以成为默认端口,是因为它是AMQP协议的标准端口号,开发者可以方便地配置其应用程序来连接到此端口,而无需手动指定端口号。当您创建一个与RabbitMQ的连接时,如果没有指定端口号,客户端库通常会默认使用5672端口。
  1. 如何通过5672端口与RabbitMQ建立非加密连接:
    • 为了通过5672端口与RabbitMQ建立非加密连接,您可以使用适当的AMQP客户端库。以下是通常的步骤:
      • 安装并配置适当的AMQP客户端库(例如,pika for Python、RabbitMQ Java Client等)。
      • 在您的应用程序中,创建一个AMQP连接对象,通常需要指定RabbitMQ服务器的主机名或IP地址、端口(5672)、虚拟主机、用户名和密码。
      • 创建一个通道(channel)来进行消息的发布和订阅。
      • 使用通道来发送和接收消息。
  1. 请注意,5672端口是非加密的,默认情况下消息在网络上传输时不会被加密。如果您需要加密连接,可以考虑使用5671端口,它通常用于AMQPS(AMQP over SSL/TLS)协议,这将提供加密的通信。加密连接需要配置证书等安全设置。

4.2:RabbitMQ管理界面端口(15672)

RabbitMQ管理界面是一个Web应用程序,用于管理和监控RabbitMQ消息代理。下面是有关RabbitMQ管理界面(通常运行在15672端口)的信息:

  1. 管理界面的作用和重要性:
    • RabbitMQ管理界面是一个用于管理和监控RabbitMQ服务器的用户界面。它对于RabbitMQ的管理和监控是非常重要的,因为它提供了易于使用的图形化界面,允许管理员执行以下任务:
      • 创建、删除和管理消息队列。
      • 查看和管理交换机(exchanges)和绑定(bindings)。
      • 查看当前连接到RabbitMQ的客户端应用程序。
      • 监视消息传递情况,包括消息发布和消费的速率。
      • 查看节点信息、集群状态和性能指标。
      • 设置用户权限和虚拟主机(virtual host)的配置。
  1. 如何通过15672端口访问RabbitMQ管理控制台:
    • 默认情况下,RabbitMQ管理界面运行在15672端口。要通过浏览器访问管理控制台,您需要确保RabbitMQ服务器正在运行,并且已经启用了管理插件。以下是访问管理控制台的步骤:
      • 打开Web浏览器,并输入以下URL:http://your-rabbitmq-server:15672/
      • 替换"your-rabbitmq-server"为实际运行RabbitMQ服务器的主机名或IP地址。
      • 您将被重定向到登录页面,输入您的RabbitMQ用户名和密码,通常是"guest"(默认用户名和密码)。
      • 登录后,您将能够访问RabbitMQ管理控制台。
  1. 管理界面提供的功能和监控选项:
    • RabbitMQ管理控制台提供了多种功能和监控选项,包括但不限于:
      • 队列和交换机的创建和删除。
      • 查看连接到服务器的客户端。
      • 查看队列中的消息数量、消费者数量以及消息的详细信息。
      • 查看节点的性能指标,例如内存使用情况和CPU利用率。
      • 配置虚拟主机、用户、权限和策略。
      • 查看集群状态和节点信息。
      • 查看日志和错误报告,以进行故障排除。

RabbitMQ管理界面是一个强大的工具,用于轻松管理和监控RabbitMQ服务器,以确保消息队列系统的正常运行。

4.3:Erlang Port Mapper Daemon(epmd)端口(4369)

Erlang Port Mapper Daemon(epmd)是Erlang编程语言中的一个重要组件,用于节点之间的通信。下面是有关epmd和其监听的端口4369的信息:

  1. epmd的作用,用于节点之间的通信:
    • epmd(Erlang Port Mapper Daemon)是一个独立的守护进程,它在Erlang分布式系统中扮演着关键的角色。它的主要作用是为Erlang节点提供服务发现和端口分配功能。当Erlang节点启动时,它需要在分布式系统中找到其他节点以便进行通信,epmd负责维护这些节点的注册信息。每个节点在启动时会向epmd注册,以及在需要与其他节点通信时,它会查询epmd获取目标节点的端口信息,从而建立通信连接。
  1. 这个端口为什么重要,但通常不由客户端应用程序使用:
    • 端口4369是epmd的默认监听端口。虽然它对Erlang节点之间的通信至关重要,但通常不由客户端应用程序直接使用。客户端应用程序通常通过Erlang虚拟机来与其他Erlang节点通信,而Erlang虚拟机会自动与epmd进行交互以获取目标节点的端口信息。因此,客户端应用程序通常不需要直接连接到4369端口。

总之,epmd是Erlang分布式系统中的重要组件,负责节点之间的服务发现和端口分配,从而支持分布式通信。尽管它监听着端口4369,但客户端应用程序通常不需要直接操作此端口,而是通过Erlang虚拟机来与其他节点通信,让Erlang运行时来处理与epmd的交互。

4.4:HTTPS端口(25672)

通常情况下,RabbitMQ的管理界面使用HTTP协议在15672端口上提供服务。端口25672通常用于AMQP over TLS(AMQPS),而不是RabbitMQ管理界面的HTTPS访问。如果您希望启用RabbitMQ管理界面的HTTPS访问,您需要进行一些额外的配置,而不是使用25672端口。

以下是关于RabbitMQ管理界面的HTTPS访问的信息:

  1. 为什么RabbitMQ管理界面提供HTTPS访问:
    • 启用HTTPS访问对RabbitMQ管理界面是一个安全性增强措施。HTTPS提供了数据传输的加密和身份验证,使得管理界面更安全,特别是在生产环境中。这有助于保护敏感信息,如用户名和密码,以及管理操作的数据,免受窃听和中间人攻击的威胁。
  1. 如何通过25672端口启用管理界面的HTTPS访问:
    • 默认情况下,RabbitMQ管理界面不会使用25672端口提供HTTPS访问。要启用HTTPS访问,您需要执行以下步骤:
      1. 获得有效的SSL/TLS证书:您需要获取一个有效的SSL/TLS证书,通常从可信的证书颁发机构(CA)获得。这个证书将用于加密HTTPS连接。
      2. 配置RabbitMQ:在RabbitMQ服务器上,您需要编辑RabbitMQ配置文件,通常是rabbitmq.config,并配置HTTPS监听端口和相关SSL/TLS选项。这个配置文件可能位于不同的位置,具体取决于您的RabbitMQ安装。
      3. 启用HTTPS监听:在配置文件中,指定要使用的SSL/TLS证书和私钥的路径,以及其他必要的配置,如端口号等。
      4. 重启RabbitMQ服务器:一旦配置完成,重新启动RabbitMQ服务器,使更改生效。
      5. 使用HTTPS URL:一旦配置完成,您可以通过HTTPS URL(通常是https://your-rabbitmq-server:custom-https-port/)访问RabbitMQ管理界面。