首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分享微服务中跨服务长时间调用的解决方案

我们先来看下需求:

在微服务系统中,服务A触发一个功能需要获取服务B的实时统计的数据,这个实时统计耗时比较长。在K8S容器中有一个设置,当一个请求超过这个设置的时间时,会自动将这个请求从内部断掉且不会给请求方返回任何信息。现在需要确保服务A能获取服务B实时统计的数据。

分析这个需求得到几个重要的信息点:

1)、服务B统计数据是需要实时的,不能提前统计好。

2)、K8S容器对请求有时间限制,不能超过规定的时间。

3)、服务B统计时长很重要。

根据以上重要信息,可以有以下2个方案:

方案一:直接调接口

让服务B提供实时统计数据的接口,当服务A需要这数据的时候直接调接口。但此方案需要考虑服务B统计数据的耗时是多长,一旦统计耗时超过K8S设置的时长,那服务A将一直阻塞,直到服务A设定的熔断时间。如下图:

方案一

缺点:当服务B统计数据的时间不可控时,容易导致服务A一直阻塞,无法获取数据。

方案二:MQ+redis+文件服务器

当服务A需要获取统计数据时,发送消息让服务B开始统计数据,当服务B统计完数据后,将数据文件上传到文件服务器,并将文件路径存到redis对应的key中,此时服务A从redis中获取到数据文件路径就可以从文件服务器获取数据文件了。如下图:

方案二

具体步骤:

服务A:

1、触发需要服务B的统计数据的功能。

2、在redis中存入一个key,并将它的value值设为空。

3、发送消息到MQ,消息体为存入到redis的key。

4、开始循环获取redis中key的value值,若值为空就继续循环,直到获取到数据文件的路径,跳出循环。注意:1)、每次循环获取文件路径的时候,可以停顿会,减少循环次数,降低系统的性能消耗。2)、这里的循环需要设置超时时间,到了时间就停止循环,避免死循环。

5、根据文件路径获取数据文件,解析获取数据,继续后面的操作。

服务B:

1、接收到统计数据的消息,获取key,开始统计数据。

2、数据统计完之后,生成json文件并上传到文件服务器,得到数据文件的路径。

3、将数据文件的路径存储到redis的key中。

缺点:涉及到的环节太多,一个环节出现问题就会导致无法获取数据。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200610A0T2NR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券