分布式分析中的微服务限界上下文
microservices bounded context in distributed analytics
在我们当前的系统中,我们正在将过去作为单一整体应用程序的多个服务分割成独立的服务。
我们在分析方面有一个非常标准的架构(类似于 lambda):
- 解析 HTTP 请求并将其推送到流的前端服务。
- 为每种事件构建汇总并直接调用数据库(主要是出于性能原因)的消费者服务。
- 读取每个汇总的 table 和 returns 有意义数据的报告服务
- 一种数据管理服务,每 N 小时运行一次批处理作业,读取数据并对其采样,删除无用的行和短暂的data/reports,等等
架构类似于下图:
由于消费者和报告服务使用相同的 tables 我们正在打破有界上下文并且我们在这里遵循反模式,因为每次我们需要进行模式更改时我们需要在 "same time" 部署消费者(创建数据的服务)和报告(读取数据的服务)。然后我们可能还必须部署管理服务。
我能够想出遵循有界上下文规则的唯一方法是在报告服务上公开一种方法,以根据消费者调用参数构建汇总。策展服务也是如此,在报告服务中公开策展方法。将此 "reporting service" 转化为某种上帝服务。
此解决方案的巨大缺点是无法预测报告的延迟,因为同一个盒子可能正在执行批处理作业,创建大量汇总并计算报告,因为该服务将承担多项责任.
有没有办法将这三个服务(消费者、报告、管理)架构为松散耦合并且不直接依赖于它们之间的数据库集成?
Is there a way to architect this three services (consumer, reporting, curation) to be loosely coupled and don't depend directly on the database integration between them?
不要将数据库暴露给消费者、报告和管理服务,而是暴露新服务的 API(例如 REST API),它将独占访问数据库。使这些服务不依赖于数据库,而是依赖于此 API 并对消费者、报告和管理服务隐藏数据库。
如果您有很多限界上下文,那么您可以为每个限界上下文创建一个单独的服务:
在我们当前的系统中,我们正在将过去作为单一整体应用程序的多个服务分割成独立的服务。
我们在分析方面有一个非常标准的架构(类似于 lambda):
- 解析 HTTP 请求并将其推送到流的前端服务。
- 为每种事件构建汇总并直接调用数据库(主要是出于性能原因)的消费者服务。
- 读取每个汇总的 table 和 returns 有意义数据的报告服务
- 一种数据管理服务,每 N 小时运行一次批处理作业,读取数据并对其采样,删除无用的行和短暂的data/reports,等等
架构类似于下图:
由于消费者和报告服务使用相同的 tables 我们正在打破有界上下文并且我们在这里遵循反模式,因为每次我们需要进行模式更改时我们需要在 "same time" 部署消费者(创建数据的服务)和报告(读取数据的服务)。然后我们可能还必须部署管理服务。
我能够想出遵循有界上下文规则的唯一方法是在报告服务上公开一种方法,以根据消费者调用参数构建汇总。策展服务也是如此,在报告服务中公开策展方法。将此 "reporting service" 转化为某种上帝服务。
此解决方案的巨大缺点是无法预测报告的延迟,因为同一个盒子可能正在执行批处理作业,创建大量汇总并计算报告,因为该服务将承担多项责任.
有没有办法将这三个服务(消费者、报告、管理)架构为松散耦合并且不直接依赖于它们之间的数据库集成?
Is there a way to architect this three services (consumer, reporting, curation) to be loosely coupled and don't depend directly on the database integration between them?
不要将数据库暴露给消费者、报告和管理服务,而是暴露新服务的 API(例如 REST API),它将独占访问数据库。使这些服务不依赖于数据库,而是依赖于此 API 并对消费者、报告和管理服务隐藏数据库。
如果您有很多限界上下文,那么您可以为每个限界上下文创建一个单独的服务: