lygyh9985825 发表于 2017-12-8 21:24:25

RabbitMQ延迟队列

rabbitmq延迟队列
  rabbitmq实现延迟队列用了rabbitmq-delayed-message-exchange插件,需要提前安装,并启用。
原理
  其原理是通过Exchange来实现延迟功能,即在Exchange中根据各个message的x-delay头设置延迟时间,时间到达后才发送到对应的queue,进而被queue消费。
实现
  其实现方法为:

[*]正常我们申明一个Exchange只需要指定其类型(direct,fanout,topic等)即可,而声明延迟Exchange需要指定type为x-delayed-message,并通过参数x-delay-type指定其Exchange的类型(direct,fanout,topic等)。其实现如下:
  java   Map<String, Object> params = new HashMap<>();   params.put(&quot;x-delay-type&quot;, &quot;direct&quot;);   channel.exchangeDeclare(exchangeName, &quot;x-delayed-message&quot;, false, false, params);

[*]  声明好Exchange之后,绑定任意队列即可
[*]  发送消息的时候需要额外添加header,x-delay,用于设置延迟时间,单位:ms。实现如下:
  java   int delayMs = 5000;   String msg1 = &quot;delay message &quot; + delayMs;   Map<String, Object> headers = new HashMap<>();   headers.put(&quot;x-delay&quot;, delayMs);   AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().headers(headers).build();   channel.basicPublish(exchangeName, &quot;&quot;, props, msg1.getBytes(&quot;utf-8&quot;));
性能影响
  普通的Exchange收到message后直接推到queue,而延迟队列需要判断是否到达延迟时间,不到延迟时间的需要保存在表中,时间到了再捞出来推送,这些判断和操作导致效率不如普通的Exchange,所以如果不需要的话,就不要用延迟队列。
参考
  Github of rabbitmq-delayed-message-exchange
页: [1]
查看完整版本: RabbitMQ延迟队列