RabbitMQ的延迟队列
一段时间以来,人们一直在寻找通过RabbitMQ实现延迟消息传递的方法。到目前为止,公认的解决方案是混合使用消息TTL和James Carr 在此处提出的 死信交换。一段时间以来,我们一直在考虑为此提供现成的解决方案,并且在过去的一个月中,我们有时间将其实现为插件。输入 RabbitMQ延迟消息插件。
该延迟邮件插件的RabbitMQ增加了一个新的交换类型的RabbitMQ在那里通过交换路由信息可以,如果用户的动产这样做会推迟。让我们看看它是如何工作的。
安装插件
要安装插件,请转到我们的 社区插件页面, 并为RabbitMQ安装下载相应的.ez文件。将插件复制到RabbitMQ的plugin文件夹,然后通过运行以下命令启用它:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
启用插件后,我们就可以开始使用它了。
使用交易所
要使用延迟消息交换,您只需要声明一个提供"x-delayed-message"交换类型的交换,如下所示:
// ... elided code ...
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-delayed-type", "direct");
channel.exchangeDeclare("my-exchange", "x-delayed-message", true, false, args);
// ... more code ...
稍后,我们将解释"x-delayed-type"我们在交换声明中提供的特殊论点的含义 。
延迟讯息
要延迟消息,用户必须使用称为的特殊标头发布消息,该标头x-delay采用表示毫秒数的整数,该消息应被RabbitMQ延迟。值得注意的是,这里的延迟意味着:将消息路由到队列或其他交换机的延迟。
交易所没有消费者的概念。因此,一旦延迟到期,插件将尝试将消息路由到与交换机的路由规则和分配给消息的路由规则匹配的队列。请注意,如果消息无法路由到任何队列,则它将被丢弃,这是AMQP针对无法路由的消息所指定的。
这是一些示例代码,将x-delay标头添加到消息中并发布到我们的交易所。
// ... elided code ...
byte[] messageBodyBytes = "delayed payload".getBytes();
AMQP.BasicProperties.Builder props = new AMQP.BasicProperties.Builder();
headers = new HashMap<String, Object>();
headers.put("x-delay", 5000);
props.headers(headers);
channel.basicPublish("my-exchange", "", props.build(), messageBodyBytes);
在上一个示例中,该消息将延迟五秒钟,然后再由插件路由。该示例假定您已建立与RabbitMQ的连接并获得了一个频道。
灵活的路由
当我们在上面声明交换时,我们提供了一个x-delayed-type 设置为的参数direct。这样做是为了告诉交易所在路由消息,创建绑定等时我们希望它具有什么样的行为。在该示例中,我们的交换的行为类似于 直接交换,但是我们可以在其中传递主题,扇出或其他插件提供的自定义交换类型。通过这样做,我们不限制用户延迟消息插件提供什么样的路由行为。
检查消息是否延迟
一旦我们在消费者方收到一条消息,我们如何判断该消息是否被延迟?该插件将保留x-delay消息头,但将否定传递的值。因此,如果您发布的消息5000延迟了毫秒,则收到该消息的使用者将发现x-delay标头设置为-5000
原文地址:https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/

浙公网安备 33010602011771号