我们先来看下需求:

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

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

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

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

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

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

方案一:直接调接口

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

12434efe302f7729108d5758b47198de.png

方案一

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

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

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

38de6c98783073c75c9f1f830d84171a.png

方案二

具体步骤:

服务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中。

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

今天的内容就到这里了,希望对大家有所帮助,有什么建议欢迎在评论区评论!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐