rabbitMq

AMQP

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

(应用层协议,开放标准,与实现无关)

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

RabbitMQ 是一个可靠且成熟的消息传递和流代理,易于部署在云环境、本地和本地计算机上。它目前被全球数百万人使用。

AMQP定义网络协议和代理服务如下

一套确定的消息交换功能,也就是“高级消息交换协议模型” 路由、存储、消息交换

AMQP模型

术语

连接(Connection):一个网络连接,比如TCP/IP套接字连接。

会话(Session):端点之间的命名对话。在一个会话上下文中,保证“恰好传递一次”。

信道(Channel):多路复用连接中的一条独立的双向数据流通道。为会话提供物理传输介质。

客户端(Client):AMQP连接或者会话的发起者。AMQP是非对称的,客户端生产和消费消息,服务器存储和路由这些消息。

服务器(Server):接受客户端连接,实现AMQP消息队列和路由功能的进程。也称为“消息代理”。

交换器(Exchange):服务器中的实体,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

交换器类型(Exchange Type):基于不同路由语义的交换器类。

消息队列(Message Queue):一个命名实体,用来保存消息直到发送给消费者。

绑定器(Binding):消息队列和交换器之间的关联。

绑定器关键字(Binding Key):绑定的名称。一些交换器类型可能使用这个名称作为定义绑定器路由行为的模式。

路由关键字(Routing Key):一个消息头,交换器可以用这个消息头决定如何路由某条消息。

持久存储(Durable):一种服务器资源,当服务器重启时,保存的消息数据不会丢失。

临时存储(Transient):一种服务器资源,当服务器重启时,保存的消息数据会丢失。

持久化(Persistent):服务器将消息保存在可靠磁盘存储中,当服务器重启时,消息不会丢失。

非持久化(Non-Persistent):服务器将消息保存在内存中,当服务器重启时,消息可能丢失。

虚拟主机(Virtual Host):一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。客户端应用程序在登录到服务器之后,可以选择一个虚拟主机。

主题:通常指发布消息;AMQP规范用一种或多种交换器来实现主题。

许可证

自 2007 年首次发布以来,RabbitMQ 是免费和开源软件。此外,Broadcom 还提供一系列商业产品。

RabbitMQ 在 Apache 许可证 2.0 和 Mozilla 公共许可证 2 下获得双重许可。您可以随心所欲地使用和修改 RabbitMQ。

github

RabbitMQ · GitHub

rabbitmq-server 

 rabbitmq-java-client 

rabbitmq-website 

安装

最新版本是 RabbitMQ 的 3.13.3

 docker 镜像:hub.docker.com

# latest RabbitMQ 3.13
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management

RabbitMQ 服务器

 Erlang 版本要求:  Erlang 和         .26.x   25.x

Installing on Windows | RabbitMQ

rabbitmq-server-generic-unix-3.13.3.tar.xzicon-default.png?t=N7T8https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.3/rabbitmq-server-generic-unix-3.13.3.tar.xz

CLI 工具

RabbitMQ 节点通常使用 PowerShell 中的 CLI 工具进行管理、检查和操作。

在 Windows 上,与其他平台相比,CLI 工具具有后缀。例如,在 Windows 上被调用为 ..batrabbitmqctlrabbitmqctl.bat

要了解各种 RabbitMQ CLI 工具提供的命令,请使用以下命令:help

# lists commands provided by rabbitmqctl.bat
rabbitmqctl.bat help

# lists commands provided by rabbitmq-diagnostics.bat
rabbitmq-diagnostics.bat help

# ...you guessed it!
rabbitmq-plugins.bat help

管理 RabbitMQ 节点

管理服务

可以在“开始”菜单中找到指向 RabbitMQ 目录的链接。

还有一个指向命令提示符窗口的链接,该窗口 将在 sbin 目录的“开始”菜单中启动。这是 运行命令行工具的最便捷方式。

请注意,CLI 工具必须对目标 RabbitMQ 节点进行身份验证

停止节点

要停止代理或检查其状态,请使用 in(以管理员身份)。rabbitmqctl.batsbin

rabbitmqctl.bat stop

检查节点状态

以下 CLI 命令运行基本运行状况检查,并显示有关节点的一些信息(如果节点正在运行)。

# A basic health check of both the node and CLI tool connectivity/authentication
rabbitmqctl.bat status

为了让它工作, 必须满足两个条件:

  • 节点必须正在运行
  • rabbitmqctl.bat必须能够向节点进行身份验证

1、发布者、交换机、队列、消费者都可以有多个。同时因为 AMQP 是一个网络协议,所以这个过程中的发布者,消费者,消息代理 可以分别存在于不同的设备上。

2、发布者发布消息时可以给消息指定各种消息属性(Message Meta-data)。有些属性有可能会被消息代理(Brokers)使用,然而其他的属性则是完全不透明的,它们只能被接收消息的应用所使用。

3、从安全角度考虑,网络是不可靠的,又或是消费者在处理消息的过程中意外挂掉,这样没有处理成功的消息就会丢失。基于此原因,AMQP 模块包含了一个消息确认(Message Acknowledgements)机制:当一个消息从队列中投递给消费者后,不会立即从队列中删除,直到它收到来自消费者的确认回执(Acknowledgement)后,才完全从队列中删除。

4、在某些情况下,例如当一个消息无法被成功路由时(无法从交换机分发到队列),消息或许会被返回给发布者并被丢弃。或者,如果消息代理执行了延期操作,消息会被放入一个所谓的死信队列中。此时,消息发布者可以选择某些参数来处理这些特殊情况。

Exchange交换机

交换机是用来发送消息的 AMQP 实体。

交换机拿到一个消息之后将它路由给一个或零个队列。

它使用哪种路由算法是由交换机类型和绑定(Bindings)规则所决定的。

交换机类型

Direct Exchange(直连交换机) (Empty String) and amq.direct

Fanout Exchange(扇形交换机) amq.fanout

Topic Exchange(主题交换机) amq.topic

Headers Exchange(头交换机) amq.match(and amq.headers in rabbitMQ)

除交换机类型外,在声明交换机时还可以附带其它属性,分别是:

Name

Durability (消息代理重启后,交换机是否还存在)

Auto-delete (当所有与之绑定的队列都完成了对此交换机的使用后,删除它)

Aruguments (依赖代理本身)

交换机状态

持久(durable)、暂存(transient)。

durable交换机消息代理重启后依旧存在

暂存的交换机则不会(它们需要在代理再次上线后重新被声明)

并不是所有的应用场景都需要持久化的交换机。

默认交换机

默认交换机(default exchange)实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机(direct exchange)。

它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

队列教程(Queue tutorials)

1. "Hello World!"  

编写程序以发送和接收来自命名队列的消息

Sending

We'll call our message publisher (sender) Send and our message consumer (receiver) Recv. The publisher will connect to RabbitMQ, send a single message, then exit.

rabbitmq-tutorials/java/Send.java at main · rabbitmq/rabbitmq-tutorials · GitHub

Send.java

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;

// 设置类并命名队列:

public class Send {
  private final static String QUEUE_NAME = "hello";
  public static void main(String[] argv) throws Exception {
      ...
  }
}

//创建与服务器的连接:
x
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {

}

//要发送,我们必须声明一个队列供我们发送到;然后我们可以发布一条消息 到队列中,所有这些都在 try-with-resources 语句中

channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");

/**全部send代码**/

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.nio.charset.StandardCharsets;

public class Send {

    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

接收

们的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值