消息队列(二)初识 RabbitMQ 消息队列

本贴最后更新于 2210 天前,其中的信息可能已经渤澥桑田

原文地址 https://www.heayan.com/articles/2018/03/10/1520707858300.html

RabbitMQ 介绍

RabbitMQ 是一个在 AMQP 协议标准基础上完成的,可复用的企业消息系统。他遵循 Mozila Public License 开源协议。采用 Erlang 实现的工业级的消息队列(MQ)服务器。
RabbitMQ 官方网站:http://www.rabbitmq.com
AMQP(高级消息队列协议)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是 API(例如 JMS),AMQP 客户端能够无视消息的来源任意发送和接收信息。AMQP 的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件(MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过简化发送的 AMQ 实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一部分,形成了在线路层协议顶端的一个层级:AMQP 模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。

RabbitMQ 整体架构

image

RabbitMQ 架构-运行原理

image

RabbitMQ 重要术语

1.Server(borker):接受客户端连接,实现 AMQP 消息队列和路由功能的进程。
2.Virtual Host:其实是一个虚拟概念,类似于权限控制组,一个 Virtual Host 里面可以有若干个 Exchange 和 Queue,但是权限控制的最小粒度是 Virtual Host。
3.Exchange:接受生产者发送的消息,并根据 Binding 规则将消息路由给服务器中的队列。ExchangeType 决定了 Exchange 路由消息的行为。例如,在 RabbitMQ 中,ExchangeType 有 Direct、Fanout 和 Topic 三种,不同的 Exchange 路由的行为是不一样的。
4.Message Queue:消息队列,用于存储还未被消费者消费的消息。
5.Message:由 Header 和 Body 组成,Header 是由生产者添加的各种属性的集合,包括 Message 是否被持久化、由哪个 Message Queue 接受、优先级是多少等。而 Body 是真正需要传输的 APP 数据。
6.BindingKey:所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来,绑定关键字成为 BindingKey。

Exchange 分类

Direct Exchange——直接式交换器模型

Direct Exchange 直接交互式处理路由键。需要将一个队列(Queues)绑定到交换机(Exchange)上,要求该消息与一个特定的路由键完全匹配,这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键为“dog”,则只有标记为“dog”的消息才被转发,不会转发 dog.puppy,也不会转发 dog.guard,只会转发 dog。
image

Fanout Exchange——广播式交换器模型

Fanout Exchange 广播式路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息,都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout 交换机转发消息时最快的。
image

Topic Exchange——主题式交换器模型

Topic Exchange主题式交换器。通过消息的路由关键字和绑定关键字的匹配模式,将消息路由到被绑定的队列中。这种路由器类型可以被用来支持经典的发布/订阅消息传输模型——使用主题名字空间作为消息寻址模式,将消息传递给那些部分或者全部匹配主题模式的多个消费者。主题交换器类型的工作方式如下:绑定关键字用零个或多个标记构成,每个标记之间用“.”字符分割。绑定关键字必须用这种形式明确说明,并支持通配符:“*”匹配一个词组,“#”匹配零个或多个词组。因此绑定关键字“*.stock.#”匹配路由关键字“usd.stock”和“eur.stock.db”,但是不匹配“stock.nasdaq”。

image

RabbitMQ 常用配置介绍

一般情况下,RabbitMQ 的默认配置就足够了。如果希望特殊设置的话,有两个途径。
一个是环境变量的配置文件 rabbitmq-env.conf;
一个是配置信息的配置文件 rabbitmq.config;
注意,这两个文件默认是没有的,如果需要必须自己创建。

1、rabbitmq-env.conf

这个文件位置是确定和不能改变的,位于/etc/rabbitmq 目录下(这个目录需要自己创建)。
RABBITMQ_NODE_IP_ADDRESS:指定 ip 地址
RABBITMQ_NODE_PORT:指定端口号,默认 5672
RABBITMQ_CONFFIG_FILE:配置文件的路径,注意配置文件后缀必须是.config
RABBITMQ_LOG_BASE:日志文件路径

2、rabbitmq.config

这个是一个标准的 erlang 配置文件。它必须符合 derlang 配置文件的标准。Erlang tuple,结构为{Key,Value},Key 为 atom 类型,Value 为一个 term,其中几个关键参数为:
(1)tcp_listerners 设置 rabbitmq 的监听端口,默认为[5672]。
(2)disk_free_limit 磁盘低水平线,若磁盘容量低于指定值则停止接受数据。
(3)vm_memory_high_watermark,设置内存低水位线,若低于该水位线,则开启流控机制,默认是 0.4,即内存总量的 40%。

rabbitmq.config 配置示例

[
    {rabbit,[
        {tcp_listeners,[{"127.0.0.1",5672}]},
        {ssl_listeners,[{"127.0.0.1",5671}]},
        {ssl_options,[{cacertfile,"/usr/local/etc/rabbitmq/ssl/testca/cacert.pem"},
                    {certfile,"/user/local/etc/rabbitmq/ssl/server/cert.pem"},
                    {keyfile,"/use/local/etc/rabbitmq/ssl/server//key.pem"},
                    {verify,verify_none},
                    {fail_if_no_peer_cert,false}]}
    ]}
].

RabbitMQ 命令

  1. /etc/init.d/rabbitmq-server start|stop|restart|reload
  2. rabbitmqctl add_vhost vhostname 创建 Vhost
  3. rabbitmqctl delete_vhost vhostname 删除 Vhost
  4. rabbitmqctl list_vhost 遍历所有虚拟主机信息
  5. rabbitmqctl add_user username password 添加用户名、密码
  6. rabbitmqctl change_password username password 修改用户密码
  7. rabbitmqctl set_permissions -p v_host user ".""."".*"绑定权限,并且具备读写的权限
  8. rabbitmqctl list_queues 显示所有队列

版权所有,转载必须标识原文地址

  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 395 关注
  • 消息队列
    40 引用 • 52 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...