假设我有一个管理仓库的服务(更新频率不高(。我有一个销售服务,需要商店列表(搜索并在必要时使用(。如果我从商店服务中获得商店列表,并将其保存在我的销售服务中(比如在redis中(,但确保在商店列表更改时更新redis。它会违反微服务架构的单一责任原则吗?
不,事实上,在微服务架构中,当服务存储来自另一个服务的相关数据副本并使用某种机制进行同步时(通常通过消息代理使用一些异步通信(,这是非常常见的方法。
存储数据副本不会从管理该数据的服务转移该数据的所有权
这很常见,并且您有一个微服务模式(CQRS(。
如果你需要来自其他服务/微服务的一些信息来加入你的数据,那么你需要存储这些信息。
无论何时,无论是针对下游系统发出请求还是使用本地副本,您都会在性能和数据新鲜度之间进行权衡分析。
- 如果您总是发出RPC调用,那么您更喜欢数据新鲜度而不是性能
- 您需要多久发出一次RPC调用的频率对性能有直接影响
- 如果您利用缓存来获得性能,那么就有机会使用过时的数据(根据您的业务,这可能是可以接受的,也可能是不可接受的(
- 缓存失效是一个非常棘手的问题领域,因此,它可能会引起头痛
缓存一个微服务的数据不会侵犯数据所有权,因为缓存只是读取数据,不会删除或更新现有数据。它类似于有一个单一的领导者(主(-多个追随者设置或读写锁。除非只有一个地方可以创建、修改或删除数据,否则数据所有权将以正确的方式实现。