TL; DR服务是否应选择在其本地数据库中保存偶尔需要的数据,或者每次从数据来源的服务请求数据?
让我们来看一下网上商店/订购应用的一些通用示例。服务A是用户会话管理服务。它处理用户正在做什么,他能做什么等的业务逻辑。用户可以创建自己的衬衫进行购买。服务B是一个数据聚合器,包含大量库存和可用内容。
用户开始创建衬衫,因此服务B的服务请求,可用的样式/颜色。服务B发送一个可能的选择列表,然后为用户显示服务A.然后用户选择一个,定制它并移动到新衬衫。再次服务A必须从服务B请求,可用的样式/颜色。
现在让我们假设在用户会话的生命周期内,这些样式/颜色不会改变,我们知道这将是一遍又一遍地检索的相同数据。不只是这个用户,而是所有用户。所以在这种情况下,由于样式/颜色实际上是服务B域的一部分,它们应该留在那里并居住在那里,或者建议防止所有这些不必要的呼叫,并在第一次请求时(暂时)保存在服务A中会话生命周期的数据,以防止繁琐的服务。
这是一个过于简化的例子,但问题仍然是现实世界。建议这种设计的建议方式是哪种? 这通常适用于例如某些相当静态的数据通过某些服务时,此服务将在这些事务的生命周期内再次需要此数据几次。因此,我不确定该服务是否应该在生命周期中暂时保存它,因为知道数据不会改变,或者如果它在生命周期内发生变化,或者选择更多繁琐的服务并且每次都要求保持请求,那么它就不会关心。
答案 0 :(得分:4)
有一种不同的解决方案可以“侧重”这种权衡。
您的问题表明您正在考虑采用“旧的”“以服务为导向”的方法。也就是说,服务基本上是面向数据的服务,提供数据。如“库存”,“会话”,“客户”等
另一种方法是,基于业务领域分解应用程序,这与DDD有界上下文非常相似。这导致完全不同的体系结构,其中数据不与在其上工作的函数分离。有点像面向对象。
这将导致Shirt-Configurator拥有自己的数据库,其中包含所有相关信息,包括会话,库存等等。此外,包括UI。
另一个应用程序可能是Checkout。结帐可以是一个完全独立的应用程序,只需将URL返回到Shirt-Configurator即可获得正确的演示文稿。 Checkout应用程序不必调用甚至不需要知道Shirt-Configurator。
等等......
有关此架构风格的更多信息:http://scs-architecture.org/
答案 1 :(得分:1)
我必须赞扬你提出的精美问题,但当然答案很大程度上取决于你所处理的业务逻辑。这个问题与最终一致性(一些无sql数据库提供的属性 - 如Couchbase)有关。
最终,这是一个权衡问题:检索最新数据的“成本”与使用现有的有些陈旧数据的成本。
一些因素:
数据更新的频率如何?
更重要的是,当您使用陈旧数据时会发生什么(业务逻辑方面)。您的用户/应用甚至可以接受吗?
每次获取新数据会对您的系统产生什么影响?这样做的基础设施成本(机器/资金)是多少以及产生的延迟是多少?
答案 2 :(得分:1)
TL; DR服务是否应选择在其本地数据库中保存偶尔需要的数据,或者每次从数据来源的服务请求数据?
我不想这说,但这取决于。这取决于您的业务要求。这取决于你是否想要一个rezilient系统。如果service A
不可用,您希望service B
的行为如何?你有两个选择:
您希望Service A
拒绝工作,因为它无法从service B
获取新数据。如果数据发生很大变化或service A
中使用的数据必须始终保持超级新鲜,则执行此操作。
您希望Service A
继续工作,可能是通知用户数据可能不新鲜。在这种情况下,您应该通过收听事件或缓存来将数据从service B
复制到service A
。