calendar.getinstance()获取的是什么时间_分享微服务中跨服务长时间调用的解决方案...
我们先来看下需求:在微服务系统中,服务A触发一个功能需要获取服务B的实时统计的数据,这个实时统计耗时比较长。在K8S容器中有一个设置,当一个请求超过这个设置的时间时,会自动将这个请求从内部断掉且不会给请求方返回任何信息。现在需要确保服务A能获取服务B实时统计的数据。分析这个需求得到几个重要的信息点:1)、服务B统计数据是需要实时的,不能提前统计好。2)、K8S容器对请求有时间限制,不能超过规定的时
我们先来看下需求:
在微服务系统中,服务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中。
缺点:涉及到的环节太多,一个环节出现问题就会导致无法获取数据。
今天的内容就到这里了,希望对大家有所帮助,有什么建议欢迎在评论区评论!
更多推荐
所有评论(0)