微服务:限界上下文之间的模型共享

Microservices: model sharing between bounded contexts

我目前正在构建一个使用平均堆栈开发的基于微服务的应用程序,并且 运行 我遇到了几种需要在有界上下文之间共享模型的情况。

例如,我有一个处理注册过程以及登录(生成 jwt)、注销等的用户服务。我还有一个文件服务,它处理用户的个人资料照片和其他图像的上传恰好上传。此外,我有一个朋友服务,可以跟踪成员之间的联系。

目前,我正在将用户服务使用的用户 table 的用户 guid 以及名字、中间名和姓氏字段添加到文件 table 和朋友table。这样我就可以在其他服务(朋友和文件)中需要时查询这些字段,而无需在每次查询时进行任何休息调用以获取信息。

注意事项:

缺点似乎是我必须这样做,我选择了带有 rabbitmq 的 seneca,每当用户从用户 table 更新他们的信息时通知文件和朋友 tables。

1) 我应该担心服务变得太啰嗦了吗?

2) 如果大量更新发生在一个小时内,这会导致任何性能问题吗?

3) 在尝试隔离边界时,我只是没有看到另一种方法来解决这个问题。解决此问题的推荐方法是什么?我的方向是否正确?

这是一种权衡。我个人不会将用户详细信息与用户标识符一起存储在相关服务中。但我也不会查询用户服务来获取此信息。您可能需要的是整个系统的某种读取模型,它可以以针对您的特定需求(报告、在网页上一起显示等)优化的方式存储这些数据。

读模型是事件驱动架构中流行的一种模式space。有一篇非常好的文章讨论了这类问题(分为两部分):

https://www.infoq.com/articles/microservices-aggregates-events-cqrs-part-1-richardson https://www.infoq.com/articles/microservices-aggregates-events-cqrs-part-2-richardson

关于微服务的许多常见问题似乎主要围绕域模型的分解,以及如何克服查询等需求阻碍分解的情况。本文清楚地阐明了这些选项。绝对值得花时间阅读。

在您的特定情况下,这意味着文件和好友服务只需要为用户存储主键。但是,所有服务都应发布状态更改,然后可以将其聚合到读取模型中。

如果您担心大量消息和高 TPS(例如用于生成和使用事件的 100,000 TPS),我建议不要使用 RabbitMQ,而是使用 apache KafkaNATS(Go 版本,因为 NATS 也有 Rubby 版本)以支持每秒大量消息。

此外,关于数据库设计,您应该根据领域驱动设计 (DDD) 设计每个微服务基础业务功能和限界上下文。因此,因为与 SOA 不同,建议每个微服务都应该有自己的数据库,那么您不必担心规范化,因为您可能必须为每个微服务重复许多结构、字段、表和功能,以保持它们与每个微服务分离其他并让他们独立工作以提高可用性并具有可扩展性

也可以使用事件溯源+CQRS技术或事务日志拖尾来规避2PC(2 阶段承诺)- 在实施微服务时不推荐这样做 - 以便根据 CAP[= 在您的微服务和操作状态之间交换事件以获得最终一致性 定理。