微服务架构:聊天服务或数据复制
Microservices Architecture: Chatty services or data duplication
TL;DR 服务应该选择将偶尔需要的数据保存在其本地数据库中,还是每次都从数据来源的服务请求数据?
让我们举一些网上商店/订购应用程序的通用示例。服务 A 是用户会话管理服务。它处理用户正在做什么、他能做什么等业务逻辑。用户可以创建自己的衬衫以供购买。服务 B 是一个数据聚合器,包含大量库存和可用内容。
用户开始制作衬衫,所以服务A向服务B请求,有styles/colors个可用。服务 B 向下发送一个可能的选择列表,然后服务 A 将其显示给用户。然后用户选择一件,对其进行定制,然后转到一件新衬衫。同样,服务 A 必须向服务 B 请求 styles/colors 可用。
现在让我们假设在用户会话的生命周期内,这些 styles/colors 不会改变,我们知道这将是一遍又一遍地检索的相同数据。不仅仅是这个用户,而是所有用户。所以在这种情况下,由于 styles/colors 实际上是服务 B 域的一部分,它们应该留在那里并住在那里,或者是否建议阻止所有这些不必要的调用并在第一次请求时(暂时)保存在服务中A 会话生命周期的数据,以防止聊天服务。
这是一个过于简化的示例,但问题仍然存在。哪种更推荐构建此设计的方法?
这通常适用于例如一些相当静态的数据正在通过某些服务传递时,并且该服务将在这些事务的生命周期内多次再次需要该数据。所以我不确定该服务是否应该在知道数据不会改变的生命周期内暂时保存它,或者不关心它是否在生命周期内发生变化,或者选择更多的聊天服务并每次都继续请求。
我必须赞扬您的问题写得很好,但答案当然在很大程度上取决于您所处理的业务逻辑。这个问题与最终一致性的问题有关(属性 由一些没有 sql 的数据库提供——比如 Couchbase)。
最终,这是一个权衡问题:检索最新数据的 'cost' 与使用现成可用的有些陈旧数据的成本。
一些因素:
数据多久更新一次?
更重要的是,当您使用陈旧数据时(业务逻辑方面)会发生什么。你的users/apps能接受吗?
每次获取新数据对您的系统有什么影响?这样做的基础设施成本是多少(machines/money),它会产生多少延迟?
TL;DR Should a service opt for saving data in its local database that it needs occasionally, or request the data every time from the service that the data originated from?
我不想这么说,但这要视情况而定。这取决于您的业务需求。这取决于你是否想要一个弹性系统。如果 service B
不可用,您希望 service A
如何表现?您有两个选择:
您希望 Service A
拒绝工作,因为它无法从 service B
获取新数据。如果数据变化很大,或者 service A
中使用的数据必须一直是超级新鲜的,你可以这样做。
您希望 Service A
继续工作,可能是通过通知用户数据可能不是最新的。在这种情况下,您应该通过监听事件或缓存将数据从 service B
复制到 service A
。
有一个不同的解决方案 "side-steps" 这种权衡。
您的问题表明您在 "old" "service-oriented" 方法中思考得更多。也就是说,服务基本上是提供数据的面向数据的服务。比如"Inventory"、"Session"、"Customer"等
另一种方法是,这与 DDD 限界上下文非常相似,根据业务领域分解应用程序。这导致了一个完全不同的架构,其中数据与在其上工作的功能没有分离。有点像面向对象。
这将导致 Shirt-Configurator 拥有自己的数据库,其中包含所有相关信息,包括会话、库存等。另外,包括 UI.
另一个应用程序可能是 Checkout。结帐可以是一个完全独立的应用程序,只需将 URL 返回给 Shirt-Configurator 以获得正确的展示。 Checkout 应用程序不必调用甚至不需要知道 Shirt-Configurator。
等等...
关于这种架构风格的更多信息:http://scs-architecture.org/
TL;DR 服务应该选择将偶尔需要的数据保存在其本地数据库中,还是每次都从数据来源的服务请求数据?
让我们举一些网上商店/订购应用程序的通用示例。服务 A 是用户会话管理服务。它处理用户正在做什么、他能做什么等业务逻辑。用户可以创建自己的衬衫以供购买。服务 B 是一个数据聚合器,包含大量库存和可用内容。
用户开始制作衬衫,所以服务A向服务B请求,有styles/colors个可用。服务 B 向下发送一个可能的选择列表,然后服务 A 将其显示给用户。然后用户选择一件,对其进行定制,然后转到一件新衬衫。同样,服务 A 必须向服务 B 请求 styles/colors 可用。
现在让我们假设在用户会话的生命周期内,这些 styles/colors 不会改变,我们知道这将是一遍又一遍地检索的相同数据。不仅仅是这个用户,而是所有用户。所以在这种情况下,由于 styles/colors 实际上是服务 B 域的一部分,它们应该留在那里并住在那里,或者是否建议阻止所有这些不必要的调用并在第一次请求时(暂时)保存在服务中A 会话生命周期的数据,以防止聊天服务。
这是一个过于简化的示例,但问题仍然存在。哪种更推荐构建此设计的方法? 这通常适用于例如一些相当静态的数据正在通过某些服务传递时,并且该服务将在这些事务的生命周期内多次再次需要该数据。所以我不确定该服务是否应该在知道数据不会改变的生命周期内暂时保存它,或者不关心它是否在生命周期内发生变化,或者选择更多的聊天服务并每次都继续请求。
我必须赞扬您的问题写得很好,但答案当然在很大程度上取决于您所处理的业务逻辑。这个问题与最终一致性的问题有关(属性 由一些没有 sql 的数据库提供——比如 Couchbase)。
最终,这是一个权衡问题:检索最新数据的 'cost' 与使用现成可用的有些陈旧数据的成本。
一些因素:
数据多久更新一次?
更重要的是,当您使用陈旧数据时(业务逻辑方面)会发生什么。你的users/apps能接受吗?
每次获取新数据对您的系统有什么影响?这样做的基础设施成本是多少(machines/money),它会产生多少延迟?
TL;DR Should a service opt for saving data in its local database that it needs occasionally, or request the data every time from the service that the data originated from?
我不想这么说,但这要视情况而定。这取决于您的业务需求。这取决于你是否想要一个弹性系统。如果 service B
不可用,您希望 service A
如何表现?您有两个选择:
您希望
Service A
拒绝工作,因为它无法从service B
获取新数据。如果数据变化很大,或者service A
中使用的数据必须一直是超级新鲜的,你可以这样做。您希望
Service A
继续工作,可能是通过通知用户数据可能不是最新的。在这种情况下,您应该通过监听事件或缓存将数据从service B
复制到service A
。
有一个不同的解决方案 "side-steps" 这种权衡。
您的问题表明您在 "old" "service-oriented" 方法中思考得更多。也就是说,服务基本上是提供数据的面向数据的服务。比如"Inventory"、"Session"、"Customer"等
另一种方法是,这与 DDD 限界上下文非常相似,根据业务领域分解应用程序。这导致了一个完全不同的架构,其中数据与在其上工作的功能没有分离。有点像面向对象。
这将导致 Shirt-Configurator 拥有自己的数据库,其中包含所有相关信息,包括会话、库存等。另外,包括 UI.
另一个应用程序可能是 Checkout。结帐可以是一个完全独立的应用程序,只需将 URL 返回给 Shirt-Configurator 以获得正确的展示。 Checkout 应用程序不必调用甚至不需要知道 Shirt-Configurator。
等等...
关于这种架构风格的更多信息:http://scs-architecture.org/