首页 > 解决方案 > 在提出请求时计算价格时如何按价格对数百种产品进行排序

问题描述

鉴于以下三项服务:

  1. 产品服务:存储产品信息
  2. 可用性服务:使用调度优化算法确定存储在产品服务中的产品的可用性
  3. 价格服务:存储产品定价和折扣价格的规则

将所有这些组合在一起是一项 BFF 服务,它协调所有需要提出的请求,以便向客户提供有关哪些产品符合他们的标准、可用以及以什么价格提供的信息。随着时间的推移,产品的数量将达到数百甚至数千。每个请求都会返回一个产品页面(可以说 100 个产品中的 10 个)。

当客户搜索产品时,将调用 BFF 服务,该服务依次按列出的顺序调用这三个服务。

产品需要问题 分类。第一个要求是价格。价格是: 1. 存储在不同的服务中 2. 使用各种算法确定(甚至可以是动态确定的价格,即“个性化”价格)

问题 我们如何根据价格进行排序?我对一些不太好的解决方案有一些想法。但是从其他可能已经解决了这个问题的人那里寻找更多的输入。Booking.com 也做了类似的事情……

标签: .netalgorithmmicroservices

解决方案


我了解您希望以几乎实时的准确性显示一致的数据。我会考虑以下选项:

  1. 重新考虑您的微服务组合。也许在当前的设计中它们太小了。尽管您提到的所有微服务都与产品实体紧密耦合。但当然,这取决于许多因素,我不会在这里介绍,而且我对您的系统了解得不够多,无法做出这样的建议。

  2. 合并 BFF 服务中的所有三个来源。排序/分页可以应用在合并值之上。可以缓存原始合并结果,以避免每个页面的 API 往返不断。我猜价格不会经常变化,因此它可能是一个可行且简单的解决方案。

    即使产品的数量是几千个内存缓存也应该足以处理这个问题。

  3. 建立一个专门的阅读模型(换句话说,复制数据)。如果 BFF 负责提供读取模型,那么它可以监听诸如“价格改变”、“产品添加”、“产品移除”之类的域事件并构建自己的异步读取模型。这将允许使用单个数据库查询构建可分页视图。

    您还可以结合 2 + 3 并使缓存机制了解域事件。某些事件可能会使整个缓存或其中的一部分(例如单个产品)无效。

  4. 我假设您的微服务有自己的专用数据库。您可以在单个数据库查询中公开提供所需功能的跨数据库视图。微服务的布道者会说这是一种邪恶的反模式。嗯,是的,但如果你知道你在做什么,那可能是一个务实的选择,我不会把它划掉。

我提到的每个选项都有优点和缺点。如果没有对您的生态系统有更广泛的了解,将很难判断哪个最适合您。


推荐阅读