.net - 在提出请求时计算价格时如何按价格对数百种产品进行排序
问题描述
鉴于以下三项服务:
- 产品服务:存储产品信息
- 可用性服务:使用调度优化算法确定存储在产品服务中的产品的可用性
- 价格服务:存储产品定价和折扣价格的规则
将所有这些组合在一起是一项 BFF 服务,它协调所有需要提出的请求,以便向客户提供有关哪些产品符合他们的标准、可用以及以什么价格提供的信息。随着时间的推移,产品的数量将达到数百甚至数千。每个请求都会返回一个产品页面(可以说 100 个产品中的 10 个)。
当客户搜索产品时,将调用 BFF 服务,该服务依次按列出的顺序调用这三个服务。
产品需要问题 分类。第一个要求是价格。价格是: 1. 存储在不同的服务中 2. 使用各种算法确定(甚至可以是动态确定的价格,即“个性化”价格)
问题 我们如何根据价格进行排序?我对一些不太好的解决方案有一些想法。但是从其他可能已经解决了这个问题的人那里寻找更多的输入。Booking.com 也做了类似的事情……
解决方案
我了解您希望以几乎实时的准确性显示一致的数据。我会考虑以下选项:
重新考虑您的微服务组合。也许在当前的设计中它们太小了。尽管您提到的所有微服务都与产品实体紧密耦合。但当然,这取决于许多因素,我不会在这里介绍,而且我对您的系统了解得不够多,无法做出这样的建议。
合并 BFF 服务中的所有三个来源。排序/分页可以应用在合并值之上。可以缓存原始合并结果,以避免每个页面的 API 往返不断。我猜价格不会经常变化,因此它可能是一个可行且简单的解决方案。
即使产品的数量是几千个内存缓存也应该足以处理这个问题。
建立一个专门的阅读模型(换句话说,复制数据)。如果 BFF 负责提供读取模型,那么它可以监听诸如“价格改变”、“产品添加”、“产品移除”之类的域事件并构建自己的异步读取模型。这将允许使用单个数据库查询构建可分页视图。
您还可以结合 2 + 3 并使缓存机制了解域事件。某些事件可能会使整个缓存或其中的一部分(例如单个产品)无效。
我假设您的微服务有自己的专用数据库。您可以在单个数据库查询中公开提供所需功能的跨数据库视图。微服务的布道者会说这是一种邪恶的反模式。嗯,是的,但如果你知道你在做什么,那可能是一个务实的选择,我不会把它划掉。
我提到的每个选项都有优点和缺点。如果没有对您的生态系统有更广泛的了解,将很难判断哪个最适合您。
推荐阅读
- azure - 是否可以使用队列名称模式或多个队列创建队列触发的 Azure 函数?
- javascript - Twitter Typeahead 自定义选择逻辑
- javascript - 使用带有键值对的给定对象在javascript中构造一个带有键值对的数组
- javascript - 带有数据列表的VueJS组件不显示选项
- php - 验证来自配置文件中值的文件大小约束
- java - org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“entityManagerFactory”的bean时出错
- android - 为什么谷歌文档说工厂方法模式可以减少对象创建和减少频繁的垃圾收集
- python - 为什么我的子程序在我调用另一个子程序后继续执行我所有的 if 语句
- python - TestCase 因发现 -s 失败,但逐个运行显示正常
- amazon-web-services - 具有版本控制和 Glacier 转换的 S3