假设我们要使用微服务创建应用。
我们有一个页面,其中显示一些项目(产品)。
这些产品具有多个联接(类别,标签,用户等)。
如果用户,类别数据在另一个服务中,我们如何管理和过滤结果?
例如,在SQL中,您创建并连接了3,4个连接。
使用微服务-我必须过滤类别,然后过滤标签,然后过滤产品-这可能比SQL查询的速度慢10倍。
如果我有一个表“ products_categories”,该表为每个产品负责的产品设置了类别?产品服务还是类别服务?
谢谢
答案 0 :(得分:2)
在微服务架构中,有两种处理方法。
API组合模式-这是最简单的方法,应尽可能使用。它的工作原理是使拥有数据的服务客户端负责调用服务并合并结果。
命令查询责任隔离(CQRS)模式-比API组合模式更强大,但也更复杂。它维护一个或多个视图数据库,其唯一目的是支持查询。
我将更喜欢使用CQRS,定义视图数据库,这是一个只读副本,专门支持该查询。其余服务将通过订阅(创建,更新,插入)数据所有者服务发布的事件来使副本保持最新状态。
答案 1 :(得分:1)
无论何时构建任何微服务,这都是一个非常标准的问题。人们总是觉得微服务是解决所有不正确问题的方法。
此问题的解决方案在设计上更好。设计时要在性能和数据冗余之间取得平衡。更高的性能(更低的延迟数)意味着跨微服务的不同数据库的数据重复性更高。您不应以实现与SQL Join一样好的性能为目标;但也不要重复太多数据。需要平衡。.
最重要的是,需要将需求划分为正确的微服务集。
答案 2 :(得分:0)
我假设您为每个数据库表创建了一个“微服务”。这些不是微服务,它们只是数据库的基于HTTP的CRUD接口。
首先,知道为什么需要微服务。 (是否有实际原因?)其次,您必须创建包含至少一个软件完整(业务)功能的微服务。意味着它不需要其他服务即可。
如果您需要一个需要来自多个微服务的数据的表,那么就定义而言,您所犯的错误是微服务。如果微服务在没有其他服务帮助的情况下无法提供其自己的UI,那么它就不会完全包含其自身的功能。
答案 3 :(得分:0)
是什么让您无法拥有多种服务来读取/写入同一数据库/表?例如:
categories
tags
products
然后,您可以编写另一个服务来从所有这三个服务中读取,但是,这可能不是在HTTP级别,而是可以从database
服务中的同一read
进行读取,并且利用SQL
的力量。
读取的服务可以包含您的join
逻辑,这意味着您不需要使用周围的其他服务。