阅读 360
RabbitMQ消息中间件详解(一)

RabbitMQ消息中间件详解(一)

RabbitMQ介绍

RabbitMQ是使用Erlang语言来编写的,基于AMQP协议,是跨平台、跨语言的一个消息代理和队列服务器。
高性能的原因:Erlang语言,面向并发的编程语言。使用于交换机领域,进行数据交互的性能十分优秀。有与原生Socket一样的延迟。

AMQP介绍

基本概念

AMQP:Advanced Message Queuing Protocol(高级消息队列协议)。基于二进制的协议。一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

协议模型

image.png

核心概念

  • Server:又称Broker,接受客户端的连接,实现AMQP实体服务。
  • Connection:连接,应用程序与Broker的网络连接。
  • Channel:网络信道,几乎所有操作都在Channel中进行,是进行消息读写的通道。客户端可建立多个Channel,每个代表一个会话任务。
  • Message:消息,服务器和应用程序之间传递的数据。由PropertiesBody组成。Properties可以对消息进行修饰,如消息的优先级、延迟等高级特性,Body是消息体的内容。
  • Virtual Host:虚拟地址,用于逻辑隔离,最上层的消息路由(划分具体的服务)。一个Virtual Host可以有若干个ExchangeQueue,但同一个Virtual Host不能有相同名称ExchangeQueue
  • Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列,可对消息进行过滤。
  • BindingExchangeQueue之间的虚拟连接,binding中可以包含routing key

- Routing key:一个路由规则,虚拟机用它来确定如何路由一个特定消息。(交换路由)

  • Queue:又称为Message Queue,消息队列,保存消息并将它们转发给消费者。

RabbitMQ的架构

架构图

image.png image.png

  • Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
  • Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
  • Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
  • Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
  • Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。

消息发布接收流程:

  • 发送消息

    1. 生产者和Broker建立TCP连接。
    2. 生产者和Broker建立通道。
    3. 生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
    4. Exchange将消息转发到指定的Queue(队列)
  • 接收消息

    1. 消费者和Broker建立TCP连接 。
    2. 消费者和Broker建立通道。
    3. 消费者监听指定的Queue(队列)
    4. 当有消息到达QueueBroker默认将消息推送给消费者。
    5. 消费者接收到消息。

消息流转

image.png 生产者生产出Message并投递到Exchange上。
一个Exchange可以绑定多个Message Queue,它根据路由策略(routing key)路由到指定的队列。
最后由消费端去监听队列。

RabbitMQ安装与使用

安装(rpm方式):

下载对应版本的ErlangRabbitMQ

  • 安装erlangimage.png
  • 安装socat密钥:
    要先安装socat再安装rabbitmq,不然会报错。
  • 安装rabbitmqimage.png

修改配置文件

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app 默认端口号5672 image.png

修改loopback_users:(保留guest也可)
image.png

RabbitMQ基本命令

关于服务的操作:

  • 服务启动:rabbitmqctl start_app / rabbitmq-server start &
    这里有用到主机名,可以通过vim /etc/hostname来配置。 image.png 可以看到rabbitmq已经启动:
    • 查看服务是否启动 lsof -i:5672 image.png
  • 服务停止:rabbitmqctl stop_app / rabbitmq-server stop
  • 服务重启:service rabbitmq-server restart
  • 节点状态:rabbitmqctl status
  • 启动管理控制台:
    • 管理插件:rabbitmq-plugins enable rabbitmq_management
    • 控制台访问地址:http://192.168.58.129:15672

如果既修改过配置文件,又开启了插件,但是还访问失败,可以看下是不是没有关闭防火墙。

firewalld的基本使用

  • 启动: systemctl start firewalld
  • 关闭: systemctl stop firewalld
  • 查看状态: systemctl status firewalld
  • 开机禁用: systemctl disable firewalld
  • 开机启用: systemctl enable firewalld

image.png

关于用户的操作:

  • 添加用户:rabbitmqctl add_user username password
  • 列出所有用户:rabbitmqctl list_users
  • 删除用户:rabbitmqctl delete_user username
  • 清除用户权限:rabbitmqctl clear_permissions -p vhostpath username
  • 列出用户权限:rabbitmqctl list_user_permissions username
  • 修改密码:rabbitmqctl change_password username newpassword
  • 设置用户权限:rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*"

关于虚拟主机的操作:

  • 创建虚拟主机:rabbitmqctl add_vhost vhostpath
  • 列出所有虚拟主机:rabbitmqctl list_vhost
  • 列出虚拟主机上所有权限:rabbitmqctl list_permissions -p vhostpath
  • 删除虚拟主机:rabbitmqctl delete_vhost vhostpath

关于消息队列的操作:

  • 查看所有队列信息:rabbitmqctl list_queues
  • 清除队列里的消息:rabbitmqctl -p vhostpath purge_queue blue

RabbitMq高级命令

  • rabbitmqctl reset:移除所有数据,要在rabbitmqctl stop_app之后使用。
  • 组成集群命令:rabbitmqctl join_cluster <clusternode> [--ram] (ram内存级别存储,disc磁盘)
  • 查看集群状态:rabbitmqctl cluster_status
  • 修改集群节点的存储形式:rabbitmqctl change_cluster_node_type disc | ram
  • 忘记(摘除)节点:rabbitmqctl forget_cluster_node [--offline] (offline服务不启动的情况下)
  • 修改节点名称:rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2 ...]
文章分类
后端
文章标签