RabbitMQ 入门系列(四)

2020-07-17 12:12:57 浏览数 (1)

RabbitMQ 入门系列(一)讲了基本概念。RabbitMQ 入门系列(二)讲了简单入门使用。RabbitMQ 入门系列(三)讲了交换器的不同类型。本文将会讲述 RPC 以及延迟队列的实现。

01

RPC

RPC 是什么?Remote Procedure Call,远程过程调用,比如某个服务器调用另一个远程服务器上的函数或方法获取其结果,当然这种类似需求毫无疑问是可以用我们熟悉的 REST 来实现的。

使用 RabbitMQ 如何实现 RPC 的功能:

如上图所示,客户端发起请求到一个 rpc 队列,并指定一个 correlationId 作为该请求的唯一标识,且通过 reply_to 指定一个 callback 队列接收请求处理结果(这里的 callback 并不是指 node 中的回掉函数,注意区别)。服务端通过订阅指定的 rpc 队列接收到请求然后进行处理,处理完之后将结果发送到 reply_to 指定的 callback 队列中,客户端通过订阅 callback 队列获取请求结果,并通过 correlationId 对应不同的请求。

客户端示例(rpc_client.js):

服务端示例(rpc_server.js):

上述就是一个简单的 RPC 示例。

02

延时队列

某些场景下我们并不希望生产者投递消息后,消费者立即就接收到消息,而是延迟一段时间,比如某个订单提交后十五分钟内未支付则自动取消这种情况就可以用延时队列。

RabbitMQ 本身并没有直接支持延时队列这个功能,我们需要简单的拐个弯间接实现:

具体流程如上图所示,生产者先将消息投递到一个死信队列中,消息在死信队列中延时,并指定 deadLetterExchange 也就是消息延时结束后重新分发到的交换器,以及 deadLetterRoutingKey,重新分发后的交换器据此将消息分发到另一个队列,消费者订阅此队列以接受消息。

交换器与队列一定是一起出现的,即使我们使用了默认交换器,在代码中无感,也要牢记它的存在。同样上图所示在延时队列中使用的两个交换器都可以为默认交换器,只要我们定义不同的绑定规则即可。

消费者接收消息示例(receive.js):

生产者投递消息示例(send.js):

03

结语

本文通过两个示例简单的讲述了 RPC 与延时队列的实现,不知道怎么回事,感觉貌似大家对 RabbitMQ 的热情并不高,入门系列暂时写这么多吧,以后想到会继续添加。最近准备离职了也比较忙。

0 人点赞