performance - 基于消息的微服务 - Api 网关性能
问题描述
我正在设计一个微服务架构,我有一个与性能相关的问题。这就是我正在尝试的设计:
- 我有几个微服务,它们执行不同的操作并将这些结果存储在它们自己的数据存储中。
- 微服务通过消息队列接收工作,在那里它们接收请求以针对给定的特定数据运行其进程。微服务不相互通信。
我有一个 API 网关,它实际上具有三个旅程:
1) 接收处理数据的请求,然后将其转换为几条消息,将这些消息放入队列中,以便微服务在自己的时间进行处理。处理时间可以是几分钟或更长时间(非即时)
2) 接收进程状态请求,返回整个进程的进度。
3) 接收对组合数据的请求,该请求是来自服务的所有结果的某种组合。
我的问题在于上面的#3 和这个过程的性能。
每当收到此请求时,api 网关必须将消息请求放入队列中以获取来自所有服务的信息,而不是等待所有服务回复其数据的最新状态,然后将这些数据和返回给调用者。
这个过程显然相当慢,因为它必须等待每个服务响应。加快这个速度的方法是什么?
我想到解决这个问题的唯一方法是拥有另一个聚合服务/数据存储,其中重复数据由我的 api 网关存储和查询。我真的不喜欢这种方法,因为它会复制数据并且是额外的工作/代码。
从我的微服务中查询最新数据的“正确”和高效的方式是什么。
解决方案
您可以使用这些方法跨微服务查询数据。 参考
选择性数据复制
通过这种方法,我们将其他微服务所需的数据复制到我们微服务的数据库中。微服务之间的唯一耦合在于数据复制配置。
复合服务层 使用这种方法,您可以引入从较低级别的微服务聚合数据的复合服务。
推荐阅读
- javascript - 为什么本地浏览器什么都不显示?
- c# - 使用组合的类中的 MvvmLight
- asp.net-core - 如何增加 ASP.Net Core SOAP ServiceContract 中的字节限制?
- algorithm - 我错误地计算了这个简单的循环复杂度,如何正确计算?
- java - 添加参数来调用一个类会阻止它打开新窗口方法的工作。爪哇外汇
- c# - 创建包含 50 个项目的随机数组/只有 0 和 1
- angular - 显示标签并从地图中删除标记
- json - 如何在我的表中使用 JSON 属性名称?
- java - Android数据绑定导致包含布局问题
- r - 将 ggplot 饼图添加到 ggmap 地图