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

时间:2017-06-01 17:42:16

标签: mean-stack microservices bounded-contexts

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

作为一个例子,我有一个用户服务,处理注册过程以及登录(生成jwt),注销等。我还有一个文件服务,处理用户碰巧上传的个人资料照片和其他图像上传。此外,我有一个Friends服务,可以跟踪成员之间的关联。

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

以下是警告:

缺点似乎是我必须使用rabbitmq选择seneca,每当用户从User表更新其信息时,都会通知File和Friend表。

1)我应该担心服务过于健谈吗?

2)这会导致任何性能问题,如果一小时内发生了很多更新,那么就说吧?

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

2 个答案:

答案 0 :(得分:1)

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

读取模型是在事件驱动的体系结构空间中流行的模式。有一篇非常好的文章讨论了这些问题(分为两部分):

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

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

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

答案 1 :(得分:0)

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

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

您也可以使用事件采购+ CQRS 技术或交易记录拖尾来规避 2PC (2阶段承诺) - 在实施微服务时不建议 - 为了在微服务之间交换事件并根据 CAP 定理操纵状态以获得最终一致性。