我今天的问题是关于构建微服务时的组合操作。
让我们使用虚构的场景:我想构建一个仪表板。仪表板由一群人和他们的信息(历史、评论、购买、最后搜索的产品)组成。
阅读spring-cloud和spring-reactor,我想要一个调用多个微服务的非阻塞解决方案:用户服务,评论服务,搜索引擎服务,......
我的第一个猜测是做类似的事情
- 加载用户,
- 然后为每个人加载其评论
- 然后加载它的历史
- 合并所有数据
在伪代码中类似于loadUsers().flatmap(u -> loadReviews(u))....reduce()
. 正如你所看到的,这里真的很近似。
当加载 1 个用户时,我们可以估计还需要 4 个 http 调用。对于 100 个用户,400 个额外的呼叫等。Big-O 似乎不是线性的。
在最坏的情况下,微服务还委托来自 XYZ 微服务的数据加载,那么我们得到:对于 1 个用户 -> N 个调用,包括 1 个审查调用 -> 1 个 XYZ 调用。抱歉,我没有计算 Big-O(二次?)。
为了避免这种情况,我们也许可以加载所有用户,提取他们的 id,用一批 id 调用每个微服务。每个微服务可以一次加载所有数据(可能是由 id 映射的评论列表),原始调用将合并所有这些列表。(一种zip功能)
摘要:我刚刚阅读了这个关于 Observables 组合的问题。我的问题可以概括为“当您在链的开始没有唯一用户但有数百名用户时,您是否使用相同的策略?” (性能可能不是问题吗?)