如何定义报告微服务的边界?

How to define boundaries of a reporting microservice?

假设我有一个 Order Service 提供了一个 API 用于创建、更新和取消订单。必要时,用户必须能够生成包含订单详细信息的 PDF。

我不是特别喜欢 Order Service 包含执行此 PDF 生成所需的逻辑(和所有依赖项),因为如果我需要在系统的更多部分实现 PDF 生成,我会在每个微服务上加载大量依赖项,此外微服务似乎承担了比它应有的更多责任。

但另一方面,如果我创建一个 Reporting Service 来生成这些 PDF,我会考虑到技术问题,而且,每个服务都必须发送数据、模板和设置Reporting Service 并通过网络接收生成的 PDF 文件,这可能是一个瓶颈。

考虑到 Chris Richardson 在《微服务模式》一书中所说的内容:

microservices should be organized around business concerns rather than technical concerns

如何在不违反限界上下文和保持关注点分离的情况下进行设计?

PDF 渲染与任何其他视图层问题没有什么不同。将其封装为与您用于将订单呈现到网页的类型相同的 granularity/separation。

由于您可能不会在订单服务中处理 HTML/JS 订单呈现,因此您可能也不想在那里处理订单呈现。将您的 PDF 呈现保存在知道如何呈现它们的专用服务中,并将所需的数据传递给它。尽管订单服务可能不会调用此服务,但它可能会调用订单服务。

最好在库中编写生成 PDF 的逻辑,并在需要的微服务中使用该库。

为 PDF 生成开发单独的微服务不是一个好的选择,因为 PDF 生成依赖于 (1.) 来自另一个微服务的数据和 (2.) 将数据转换为 PDF 的模板。所以,会有很多数据流。