跟着Machinery学习消息队列(三)

647 阅读1分钟

介绍

本篇我们先来介绍一下Machinery一个重要的接口---Broker。故名思义,这个接口是用来实现消息的接收和发送。Machinery提供了很多种实现方式,如amqp,redis,eager,grpcpubsub,sqs等。这里,我们简单介绍amqp的实现方式

Broker接口

broker.png

amqp实现

amqp broker结构

如下图,Broker继承了common.Broker。common.Broker是对Broker接口的一个默认空实现。这种设计在java中很常见。这样设计的好处之一是,如果后续对Broker接口新增一个方法,就不需要对所有的实现类,都去实现一遍,只需要commonn.Broker和需要覆盖的实现类去实现这个方法即可。 broker_impl_amqp_class.png

延迟队列的实现

如果问一下大家,amqp如何实现延迟队列?我想一般都会通过延迟消息+死信队列进行实现。我们来看一下Machinery是如何实现的。

1.设置延迟消息

如下图,在消息中设置ETA为一个未来的一个时间点,就会当作延迟消息来进行处理。 broker_impl_amqp_publish.png

2.发送延迟消息

如下图,Machinery会对消息和消息队列设置过期时间,当消息过期了,会发送到指定的死信队列,而处理过期消息的死信队列正好就是我们正常处理消息的队列。 broker_impl_amqp_delay.png

结束语

本篇主要简单地分析了一下amqp是如何实现延迟队列的。下一篇我们会简述一下Machinery是如何通过redis来实现消息队列的。

链接

上一篇---machinery的实现机制

下一篇---如何用redis来实现消息队列