google的api key调用次数是多少_Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?...

8fd4c123c7fa28f14a5ad570c9e66fe5.png

前言

在很多互联网应用系统中,请求处理异步化是提升系统性能一种常用的手段,而基于消息系统的异步处理由于具备高可靠性、高吞吐量的特点,因而在并发请求量比较高的互联网系统中被广泛应用。与此同时,这种方案也带来了调用链路处理上的问题,因为大部分应用请求都会要求同步响应实时处理结果,而由于请求的处理过程已经通过消息异步解耦,所以整个调用链路就变成了异步链路,此时请求链路的发起者如何同步拿到响应结果,就需要进行额外的系统设计考虑。

为了更清晰地理解这个问题,小码哥以最近正在做的共享单车的IOT系统为例,给大家来一张图描述下,如图所示:

bee4a5d5139fc0331f8be66eab2630ef.png

在上述系统流程中,终端设备与服务端之间通过MQTT协议相连,而MQTT协议本质上是一种异步消息的连接方式,因此业务应用(如图中的订单系统)发起开锁请求后,IOT应用系统会以MQTT协议的方式通过物联网平台(此处使用的是AWS IOT服务)向设备发起开锁下行消息,而这一过程在IOT应用系统完成与物联网平台的交互后同步调用链路就结束了,因为物联网平台与锁设备之间通过MQTT消息服务异步解耦了,当然物联网平台会通过一系列可靠消息机制来确保开锁消息能够发送到指定设备的监听MQTT队列。而至于锁设备是否能够及时接收到开锁下行MQTT消息,则取决于锁设备当时的移动网络情况。

锁设备在收到MQTT开锁消息后,会通过嵌入式软件系统触发硬件设备完成开锁动作,之后就需要通过MQTT上行消息将开锁结果反馈到服务端,从而由服务端系统判断是否创建骑行订单并计算费用。这一过程需要物联网平台监听指定锁设备相应的MQTT上行消息队列,由于物联网平台需要与上万个设备进行连接,因而不可能将每一个锁设备所产生的MQTT上行消息都直接转发给Iot应用系统,因此在物联网平台可以将一类的设备MQTT消息转发至特定的业务消息队列中,例如开锁上行消息,所有设备的MQTT开锁响应上行消息都可以转发到表示开锁响应的Iot业务消息队列,如“iot_upstream_lock_response”,这样Iot业务系统则不需要再关注底层设备的MQTT消息,可以用更利于业务理解的方式去处理开锁响应结果。

现在的问题是通过MQTT协议的开锁下行消息、上行消息已经完全处于两条不同的异步网络链路,而链路的发起者此时却需要同步等待开锁结果,但是实际上同步链路早已在Iot应用系统向物联网平台发送开锁消息后就已经完成,所以为了满足调用方的同步请求/响应需要就需要在Iot应用系统的下发开锁消息后进行额外的同步阻塞等待,并监听开锁响应的Iot业务消息队列“iot_upstream_lock_response”关于此次开锁请求的上行消息,之后再结束掉之前的同步阻塞等待逻辑,从而实现向业务调用方返回实时开锁响应结果的同步调用效果。那么在上述流程中如何实施额外的同步阻塞以及如何进行回调消息的监听呢?在接下来的内容中就和大家一起探讨具体的实施方案!

解决方案分析

以上问题在使用消息服务进行异步解耦的应用场景中是比较普遍的需求,由于异步调用链路非常长所以通用的解决思路是在调用链的起始端进行同步阻塞,而在调用链的结束端通过回调的方式来实现,如下图所示:

ce277079a2c9d805cd14e262ed80eedc.png

在上述图示中,链路起始队列处在发送第一次异步消息后会开启一个临时队列并同步阻塞监听该临时队列的回调消息,而链路的结束队列在完成逻辑处理后需要回调起始队列监听的临时队列,而由于请求线程一直处于阻塞监听该临时队列的状态,所以一旦收到回调消息就可以结束阻塞执行后续流程,从而完成整个链路的同步响应。
虽然常见的消息中间件都可以实现以上逻辑,例如小码哥之前所在的公司就基于RabbitMQ通过临时队列的方式实现过消息链路的同步调用,但是基于消息中间件的方式多少还是显得有些繁琐,对于常见的消息中间件如RocketMQ、RabbitMQ来说异步消息才是其强项,如果以大量临时队列的创建和销毁为代价来实现消息调用链路的同步,不仅从使用上来说显得有些麻烦,并且也会对消息中间件的稳定性带来一些不好的影响。

因此在前面提到的IOT系统中,我们采用了基于Redis的发布/订阅功能来实现异步消息链路的同步化调用。而由于Redis的高性能以及Redis的应用场景非常丰富,并且非常适合数据频繁变动的场景,在系统中既可以作为NoSQL数据库来使用,同时还支持分布式锁等功能,因而维护的性价比也相对较高。接下来我们就基于Spring Boot的开发框架来演示如何利用Redis的发布/订阅来实现异步消息链路的同步回调!

Redis发布订阅机制

Redis本身可以通过发布订阅机制实现一定的消息队列功能,在Redis中通过subscribe/publish等命令可以实现发布订阅功能,基于此原先的IOT系统处理示意图如下:

2c42e0e98ad5924bace607281a1970b3.png

如上图所示,在IOT应用端发送异步MQTT消息后会以消息ID组成的Key作为频道****,并保持请求线程对该频道的同步监听,直到收到Iot业务消息队列的开锁结果上行消息后,在消息队列的消费端将该上行消息发布至同样以消息requestId组成的频道中,从而实现基于Redis发布订阅机制的异步消息系统同步调用效果。

Spring Boot代码实现

下面我们基于Spring Boot演示如何通过代码进行实现,创建Spring Boot工程后引入Spring Boot Redis集成依赖包,如下:

<!--

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

spring:

此时项目就具备了访问Redis的能力,接下来我们通过具体的代码实现来进行功能演示。订阅监听代码如下:

@RestController

在上述代码中,我们模拟了一个开锁请求,在完成异步消息处理后会开启Redis订阅监听,为了实现异步阻塞还需要我们创建消息任务对象,代码如下:

public 

在消息任务对象中我们通过JDK1.8新提供的CompletableFuture类实现线程阻塞效果,并通过定义消息监听对象及超时时间完善处理机制。此外根据Controller层代码还需要自定义定义消息监听处理对象,代码如下:

public 

此时就完成了Redis服务订阅这部分逻辑的编写,在后续的逻辑处理中需要完成消息的发布才能正常结束此处的阻塞等待,接下来我们写一段代码来模拟消息发布,代码如下:

@RestController

此时启动Spring Boot应用调用开锁模拟接口,逻辑就会暂时处于订阅等待状态;之后再模拟调用开锁回调Redis消息发布逻辑,之前的阻塞等待就会因为监听回调而完成同步返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球2%高智商天才必测脑力题!却只有1%的人,能在5分钟内全部做对!

▲ 点击查看说起娱乐圈最“变态”的养娃爸爸&#xff0c;妥妥非吴尊莫属&#xff01;上亿元的学区别墅、几十万学费1年的文莱国际幼儿园、一周7天辅导班、家教、每年1个儿童国际比赛、考证拿奖……1个吴尊绝对抵得上8个海淀妈。前段时间吴尊晒出neinei二年级毕业成绩单&#xf…

爬取三千条数据需要多久_存储-性能,IOPS,带宽,吞吐量,1TB数据需要多久写完...

让我们先看一下这三个概念&#xff1a;IOPS (Input/Output Per Second) 即每秒的输入输出量(或读写次数)&#xff0c;是衡量存储介质性能的主要指标之一。IOPS是指每秒钟系统能处理的读写请求数量。 吞吐量&#xff08;Throughput &#xff09;衡量的是存储介质的数据传输速率&…

TortoiseSVN客户端重新设置用户名和密码[转]

在第一次使用TortoiseSVN从服务器CheckOut的时候&#xff0c;会要求输入用户名和密码&#xff0c;这时输入框下面有个选项是保存认证信息&#xff0c;如果选了这个选项&#xff0c;那么以后就不用每次都输入一遍用户名密码了。 不过&#xff0c;如果后来在服务器端修改了用户名…

这就是你们有钱人炫富的新方式吗?

1 真正的1秒可爱喷雾▼2 你们父子俩的脚咋回事啊&#xff1f;▼3 咦&#xff1f;影子动了&#xff01;▼4 小姐姐&#xff0c;你这样就很过分了&#xff01;▼5 宝宝发现了一个新玩具▼6 这就是有钱人炫富的新方式吗&#xff1f;▼7 单身久了&#xff0c;看两片茶叶转圈…

Dapr + .NET 实战(五)Actor

什么是Actor模式Actors 为最低级别的“计算单元”以上解释来自官方文档&#xff0c;看起来“晦涩难懂”。大白话就是说Actors模式是一段需要单线程执行的代码块。实际开发中我们经常会有一些逻辑不能并发执行&#xff0c;我们常用的做法就是加锁&#xff0c;例如&#xff1a;lo…

打印机一直显示正在打印中_中国和桌面3D打印机正在引领3D打印市场

2020年11月4日&#xff0c;南极熊获悉&#xff0c;国外的市场研究公司CONTEXT最近发布了3D打印市场报告&#xff0c;“中国”和“桌面3D打印机”正引领全球的3D打印市场从COVID-19疫情中复苏。分析报告显示&#xff0c;在2020年第一季度至第二季度期间&#xff0c;中国国内工业…

python中的星号和乘号_Python 函数中参数前面一个和两个星号(**)的区别

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化 脚本( shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。在 Python 的函数中经常能看到输入的参数前面有一个或…

sql重新注册服务器,sql server无法新建注册服务器怎么办?

SQL Server 不存在或访问被拒绝ConnectionOpen (Connect())这个"SQL Server 不存在或访问被拒绝"通常是最复杂的&#xff0c;错误发生的原因比较多&#xff0c;需要检查的方面也比较多。一般说来&#xff0c;有以下几种可能性&#xff1a;1、SQL Server名称或IP地址拼…

雨中的蚊子为啥不会被雨滴砸死?

全世界只有3.14 % 的人关注了爆炸吧知识在细雨中漫步是很浪漫的一件事&#xff0c;但作为蚊子&#xff0c;雨中飞行相当于天上掉汽车&#xff01;你有没有想过&#xff0c;它们是怎么活下来的&#xff1f;直到2015年&#xff0c;菠萝科学奖物理学奖颁给美国佐治亚理工学院胡立德…

.NET 6 迁移到 Minimal API

.NET 6 迁移到 Minimal APIIntro上次写了一篇 Minimal API Todo Sample&#xff0c;有些童鞋觉得 Minimal API 有些鸡肋&#xff0c;有一些功能的支持都不太好&#xff0c;但是其实 Host 之前支持的功能 Minimal API 大部分都是支持的&#xff0c;上次的 Todo Sample 完全没有使…

教你透彻了解红黑树

教你透彻了解红黑树 作者&#xff1a;July、saturnman 2010年12月29日本文参考&#xff1a;Google、算法导论、STL源码剖析、计算机程序设计艺术。本人声明&#xff1a;个人原创&#xff0c;转载请注明出处。推荐阅读&#xff1a;Left-Leaning Red-Black Trees, Dagstuhl Wor…

cass字体_不动产 准备工作 第一步: 管理CASS码

管理CASS码https://www.zhihu.com/video/1063850168960647168管理CASS码 功能概述&#xff1a;通过管理CASS码将不动产基础矢量数据分为房屋、房屋附属、其他设施三类&#xff0c;同时通过管理CASS码可以对建筑物面积计算规则进行自定义和统设、以及设置建筑物注记文本(和数据入…

lol修改服务器域名,LOL历史转区用户解冻大区官网自助系统地址 新版申请解冻账号网址...

原标题&#xff1a;LOL历史转区用户解冻大区官网自助系统地址 新版申请解冻账号网址英雄联盟在9月1日正式上线了历史转区用户解冻服务&#xff0c;因转区导致冻结账号的玩家可以在这边申请解冻了&#xff0c;很多玩家还不清楚申请的地址在哪&#xff0c;下面就来为大家详细的介…

c语言浮点型常量表示平均数_小白基础知识必备|| 整型常量与进制间的转换

一、C语言关键字C语言的关键字共有32个&#xff0c;根据关键字的作用&#xff0c;可分为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。数值类型关键字(12个)void、char、short、int、long、float、double、signed、unsigned、struct、enum、union控制语句…

中国代工厂的困惑:把大牌t恤卖到99块3件,还会有人买吗?

▲ 点击查看“很多人都知道大牌有溢价但是不知道大牌溢价逼近900%打个比方一件1000块的T恤&#xff0c;T恤成本如果是100那么剩下的900&#xff0c;算是买了个大牌logo”这是我们上个月去到的一家中国代工厂工厂内部人员向我们透露的他说&#xff0c;其实无论是纪梵希、爱马仕、…

.NET 排序 Array.SortT 实现分析

System.Array.Sort<T> 是.NET内置的排序方法, 灵活且高效, 大家都学过一些排序算法&#xff0c;比如冒泡排序,插入排序,堆排序等&#xff0c;不过你知道这个方法背后使用了什么排序算法吗?先说结果, 实际上 Array.Sort 不止使用了一种排序算法, 为了保证不同的数据量的排…

联想电脑如何添加无线网络连接服务器,安装英特尔MYWIFI的操作步骤

适用范围:(1)操作系统&#xff1a;仅支持VISTA /WINDOWS 7&#xff0c;不支持WINDOWS XP/2003/2000&#xff1b;(2)硬件&#xff1a;INTEL MY WIFI支持INTEL 5100以及以上无线网卡&#xff0c;非INTEL无线网卡不支持。知识点分析:英特尔的MY WIFI技术是一项针对笔记本电脑无线网…

假如把女生比作一种水果

1 和睡相不好的人一起睡觉是什么体验&#xff1f;2 箱子里的是我方输出&#xff0c;外面的是对方打野3 女儿问爸爸小时候都玩什么&#xff0c;于是爸爸给她做了这个。。4 推上一网友随手拍到的照片&#xff0c;就好像是三张图片拼起来的一样。5 一位台湾艺用解剖学老师的硬核授…

ai怎么调界面大小_科研论文作图系列-从PPT到AI (一)

这是“投必得学术”推送的第44篇文章&#xff0c;专注科研技能和资讯分享&#xff01;关注“投必得学术”&#xff0c;可以看到我们所有干货和资讯&#xff01;导语&#xff1a;之前的推送中&#xff0c;小编给大家介绍过几款科研作图软件&#xff0c;包括统计分析软件Origin和…

讲师征集| .NET Conf China 2021正式启动!

去年年初疫情突袭武汉&#xff0c;打得我们措手不及在众多 .NET 开发者们的殷切期盼声中一场轰动极客圈的技术狂欢趴毅然在苏州盛大开启、圆满落幕&#xff01;我们坚信&#xff0c;你还记忆犹新……▽因为&#xff0c;TA 是 .NET 5.0 发布的”里程碑“线上线下轮番轰炸的技术干…