婚纱摄影

首页 > 正文

Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?

www.bjchun.com2019-09-29

前言

在许多Internet应用系统中,请求处理异步是提高系统性能的常用手段,而基于消息系统的异步处理具有高可靠性和高吞吐量,因此具有高并发请求的Internet系统相对较高。它被广泛使用。同时,这种方案也带来了调用链接处理的问题,因为大多数应用程序请求需要同步响应实时处理结果,并且由于请求的处理已被消息异步解耦,因此整个调用链接变为异步链接。此时,请求链接的发起者如何同步以获得响应结果需要额外的系统设计考虑因素。

为了更清楚地理解这个问题,小毛以当前正在进行的共用自行车的物联网系统为例,给出了图片描述,如图所示:

在上述系统流程中,终端设备和服务器通过MQTT协议连接,MQTT协议本质上是异步消息连接方式。因此,在服务应用程序(例如图中的订单系统)发起解锁请求后,IOT应用程序系统将通过物联网平台(此处为AWS IOT服务)向设备发起解锁下行链路消息。 MQTT协议,当IOT应用系统完成与IoT平台的交互时,该过程结束。因为IoT平台和锁定设备是由MQTT消息服务异步解耦的,当然,IoT平台将确保解锁消息可以通过一系列可靠的消息机制发送到指定设备的监听MQTT队列。至于锁定设备是否能够及时接收解锁的下行链路MQTT消息,它取决于锁定设备的当前移动网络状况。

锁定设备收到MQTT解锁消息后,触发硬件设备通过嵌入式软件系统完成解锁动作,然后需要通过MQTT上行消息将解锁结果反馈给服务器,以便服务器系统判断是否创建骑行订单并计算成本。此过程需要物联网平台监听指定锁定设备的相应MQTT上行链路消息队列。由于物联网平台需要与成千上万的设备连接,因此无法将每个锁定设备生成的MQTT上行链路消息直接转发到Iot。因此,应用系统IOT平台可以将一类设备MQTT消息转发到特定的服务消息队列,例如,解锁上行消息,并且可以将所有设备的MQTT解锁响应上行消息转发到Iot服务消息队列表示解锁响应。例如,“iot_upstream_lock_response”,因此Iot服务系统不需要关注底层设备的MQTT消息,并且可以以更有利于业务理解的方式处理解锁响应结果。

现在的问题是MQTT协议解锁了下行消息,上行消息完全在两个不同的异步网络链路中,并且链路的发起者此时需要等待解锁结果,但实际上同步链路已经是在Iot。应用系统将解锁消息发送到物联网平台后,它已经完成。因此,为了满足呼叫者的同步请求/响应需求,在IOT应用系统发出解锁消息之后需要额外的同步阻塞等待,并且监视解锁响应的Iot。关于解锁请求的上行消息的服务消息队列“iot_upstream_lock_response”,然后结束先前的同步阻塞等待逻辑,从而实现将实时解锁响应结果返回给服务调用者的同步调用效果。那么如何在上述过程中实现额外的同步阻止以及如何监听回调消息?在以下内容中,我们将与大家讨论具体的实施计划!

解决方案分析

上述问题是应用场景中的常见要求,其中消息服务用于异步解耦。由于异步调用链接很长,一般的解决方案是在调用链的开头和调用链的末尾执行同步阻塞。它由回调实现,如下图所示:

在上图中,在发送第一个异步消息之后,链接启动队列启动临时队列并同步阻止侦听临时队列的回调消息,并且在完成逻辑处理后需要调用链接的结束队列。队列正在侦听的临时队列,因为请求线程已经阻塞了侦听临时队列的状态,一旦收到回调消息,就可以终止阻塞执行,从而完成整个链接的同步响应。

虽然常见的消息中间件可以实现上述逻辑,例如,小代码兄弟用于通过临时队列实现基于RabbitMQ的消息链接同步调用的公司,但基于消息中间件的方式有点繁琐。对于常见的消息中间件,如RocketMQ和RabbitMQ,异步消息是其优点。如果以创建和销毁大量临时队列为代价实现消息调用链接的同步,则不仅在使用方面有麻烦,而且还会对消息中间件的稳定性产生一些不良影响。

因此,在上述IOT系统中,我们采用基于Redis的发布/订阅功能来实现异步消息链接的同步调用。由于Redis的高性能和Redis的应用场景,它非常适合频繁更改数据的场景。它可以在系统中用作NoSQL数据库,也支持分布式锁等功能,因此维护的性价比相对较高。高。接下来,我们将演示如何使用Redis的发布/订阅来实现基于Spring Boot开发框架的异步消息链接的同步回调!

Redis发布订阅机制

Redis本身可以通过发布和订阅机制实现某些消息队列功能。在Redis中,发布/订阅功能可以通过诸如subscribe/publish之类的命令来实现。原始物联网系统处理图如下:

如上图所示,在IOT应用程序发送异步MQTT消息后,由消息ID组成的密钥用作信道,请求线程保持信道的同步监控,直到解锁的上行消息为止。收到Iot服务消息队列的结果。消息队列的消费者将上行链路消息发布到也由消息requestId组成的同一信道,从而实现基于Redis发布订阅机制的异步消息系统同步呼叫效果。

Spring Boot代码实现

下面我们将展示如何基于Spring Boot实现代码。在创建Spring Boot项目之后,我们将介绍Spring Boot Redis集成依赖包,如下所示:

然后在项目的配置文件中添加Redis服务连接信息,如下所示:

此时,项目具有访问Redis的能力,然后我们将通过特定的代码实现来演示该功能。订阅侦听器代码如下:

热门浏览
热门排行榜
热门标签
日期归档