RabbitMQ。 第 1 部分:简介。 Erlang、AMQP

下午好,哈布尔! 我想分享一本我设法收集的教科书参考书 RabbitMQ 并浓缩成简短的建议和结论。

目录

  • RabbitMQ。 第 1 部分:简介。 Erlang、AMQP 和 RPC
  • RabbitMQ。 第 2 部分:了解交换
  • RabbitMQ。 第 3 部分:了解队列和绑定
  • RabbitMQ。 第 4 部分:了解消息和帧是什么
  • RabbitMQ。 第 5 部分:发布和消费消息性能
  • RabbitMQ。 第 6 部分:Federation 和 Shovel 模块概述
  • RabbitMQ。 第 7 部分. 有关 Connection 和 Chanel 的详细信息
  • RabbitMQ。 第 8 部分..NET 中的 RabbitMQ
  • RabbitMQ。 第 9 部分. 监控

简单介绍一下AMQP

AMQP(高级消息队列协议)是一种用于在系统组件之间传输消息的开放协议。 基本思想是,各个子系统(或独立应用程序)可以通过 AMQP 代理以任意方式交换消息,该代理执行路由、可能保证交付、分发数据流并订阅所需的消息类型。

协议 AMQP 引入三个概念:

RabbitMQ。 第 1 部分:简介。 Erlang、AMQP

  • exchange (交换点或交换)- 消息被发送到它。 兑换点 分发消息 在一个或多个队列中。 她 将消息路由到队列 基于创建的链接(binding)在他和队列之间
  • queue (队列)- 磁盘或 RAM 中的数据结构 存储消息链接并提供消息副本 consumers (对消费者)
  • binding (具有约束力)- 一条规则 告诉交换点这些消息应该进入哪个队列

协议运行在顶层 TCP / IP协议.

简单介绍一下Erlang

该项目的源代码位于存储库中 GitHub上。 建筑学 RabbitMQ 服务器 基于 Erlang 和梁。

Erlang 公司开发的 Ericsson 在 1980 世纪 99,999 年代中期,作为分布式、容错、实时系统,适用于需要 XNUMX% 正常运行时间的应用程序。 Erlang 用于各种行业和现代应用,例如 WhatsApp。 您可以在文章中阅读更多内容 WhatsApp 架构,Facebook 以 19 亿美元收购

简单介绍一下RabbitMQ

的RabbitMQ 是一个开源消息代理。 它按照协议的所有基本原则路由消息 空气质量计划 描述于 规格. RabbitMQ 实施和补充协议 AMQP.

消息传递模型的主要思想 RabbitMQ 就是这样 producer (发布者)不直接将消息发送到队列。 事实上,通常情况下,发布者甚至根本不知道消息是否会被传递到任何队列。

相反,发布者只能将消息发送到交换器。 一方面,交换器接收来自发布者的消息,另一方面,它将它们发送到队列。 交换必须确切地知道如何处理它收到的消息。 是否应该将其添加到特定队列中? 是否应该将其添加到多个队列中? 或者应该忽略该消息。

RabbitMQ。 第 1 部分:简介。 Erlang、AMQP

简短的工作 RabbitMQ 可以描述如下:

  1. 发布者向特定交易所发送消息
  2. 交换机收到一条消息后,根据它与队列之间的绑定规则将其路由到一个或多个队列
  3. 队列存储对此消息的引用。 消息本身存储在 RAM 或磁盘上
  4. 一旦消费者准备好从队列接收消息,服务器就会通过链接创建消息的副本并发送
  5. 消费者收到消息并向broker发送确认
  6. 代理收到确认后,会从队列中删除消息的副本。 然后从 RAM 和磁盘中删除

RPC的

过程 RPC(远程过程调用) 几乎所有与原子核相互作用的基础 RabbitMQ。 例如,关于客户条款的初步讨论 RabbitMQ,展示一定的过程 RPC。 一旦这个序列完成, RabbitMQ 将准备好接受客户端的请求:

RabbitMQ。 第 1 部分:简介。 Erlang、AMQP

规范中也有 AMQP 客户端和服务器都可以发出命令。 这意味着客户端正在等待与服务器通信。 命令是类和方法。 例如, Connection.Start – 方法调用 StartConnection.

连接和通道

对于客户端和服务器之间的此类信息交换, 频道。 通道创建于 具体连接。 每个通道都与其他通道隔离。 在同步情况下,在收到响应之前不可能执行下一个命令。

为了能够并行发送命令,您必须打开多个通道。 每个通道创建一个单独的 Erlang 过程。 一个连接可以有多个通道()。 对于每个通道,内存中都有特定的结构和对象。 因此,连接内的通道越多, RabbitMQ 使用更多内存 来管理这样的连接。

RabbitMQ。 第 1 部分:简介。 Erlang、AMQP

使用创建连接和通道的简单示例 RabbitMQ.客户端:

// ...
private void TryConnect()
{
    var factory = new ConnectionFactory() 
    {
        HostName = "host_name",
        UserName = "user_name",
        Password = "p@ssword",
        // Включение автоматичекого восстановления
        // соединения после сбоев сети 
        AutomaticRecoveryEnabled = true
    };
    _connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
    _channel = _connection.CreateModel();
    // other options 
}

强烈建议不要为每个操作打开一个新连接,因为这样 会导致高昂的成本。 通道也应该是持久的,但是许多协议错误会导致通道关闭,因此通道的生命周期可能比连接的生命周期短。

RabbitMQ用在哪里?

在微服务的背景下,协议 AMQP 及其实施 RabbitMQ 经常用于 异步交互 服务之间。

在上下文中 IIOT 协议 AMQP 及其实施 RabbitMQ 用于服务器(服务器-服务器)之间的数据交换。 也可以使用插件 MQTT 插件 RabbitMQ 这是协议的一个实现 MQTT 用于在低速、高延迟环境中在传感器和服务器之间传输数据(支持的协议的完整列表列于 项目网站).

在下一篇文章中,我们将开始更详细地了解交易所。

引用

来源: habr.com

添加评论