检查 API 数据的条件列表
Checking list of conditions on API data
我正在使用 API,它每 1 秒发送一些关于产品的数据。
另一方面,我有一个用户创建的条件列表。我想检查是否有任何数据符合任何条件。如果是这样,我想通知用户。
例如,用户条件可能是这样的:price < 30000 and productName = 'chairNumber2'
数据将是这样的:
{'data':[{'name':'chair1','price':'20000','color':blue},{'name':'chairNumber2','price':'45500','color':green},{'name':'chairNumber2','price':'27000','color':blue}]
我正在使用微服务架构,在验证条件下,我正在 RabbitMQ 上向我的通知服务发送消息
我已经尝试过简单的解决方案(每 1 秒检查一次每个条件,如果有任何数据满足条件则将数据传递给我的其他服务)
但这需要太多的RAM和时间(时间顺序是n*m,n是条件数,m是数据数),所以我正在寻找一个更好的方案
这是一个有趣的问题。我不得不承认我真的不知道我会怎么做——这在很大程度上取决于处理需要发生的速度,以及许多其他没有提到的因素——比如你在您拥有的技术堆栈,是内部部署还是云端,解决方案必须由 you/your 团队编码,或者您可以购买一些 $$ 工具。为了将来参考,尤其是对于体系结构问题,您可以提供的任何上下文都非常有帮助 - 例如约束。
我确实想到了 Pub-Sub,它可能会提供您可以使用的模式,但您实际上只需要一个可以在您的代码库中运行的简单实现,而且非常重要你只有一个消费客户端,即 RabbitMQ 队列——这不像你有 X 数量的随机客户端想要数据。因此,现成的 Pub-Sub 解决方案可能不太合适。
假设您想要一个“本土”解决方案,目前想到的是:
(“flow”连接器显示数据流,可以解释为 'push';其他行是 UML“依赖”行;例如,匹配引擎依赖于数据保存在批次中,但不知道这是如何发生的)。
- 外部数据源是数据的来源。我没有对它的工作原理或您对它的控制权做出任何假设。
- 接口,这一切所做的就是获取原始数据并将其放入稍后可以由匹配引擎处理的批次中。界面的工作方式取决于您希望如何平衡 (a) 输入的数据,以及 (b) 您知道匹配引擎期望的内容。
- 批次被放入批次队列。它的工作是确保在处理之前没有数据丢失,可以管理处理(批处理顺序、弹性等)。
- 匹配引擎,假设每个批次的大小是可管理的 records/changes 数量,则运行速度很快。它的工作是进行更改并询问谁对它们感兴趣,然后 return 将结果发送给 RabbitMQ。所以它的输入只是批次和用户和用户匹配规则(稍后会详细介绍)。我不确定这实际上是如何工作的,最坏的情况是它遍历每个规则以查看谁匹配 - 你现在正在做什么,但是......
关键点:队列还允许您扩展匹配引擎实例的数量 - 但是,我不知道不知道对 RabbitMQ 及其下游消费者有什么影响(更新到达的顺序等)。
未显示的内容: 缓存。匹配引擎需要知道匹配规则是什么,以及这些规则与哪些用户相关。执行该查找的最快方法可能是在内存中,而不是数据库读取(除非您对它是如何发生的很聪明),这让我想到了这个补充:
- 数据源 是保存用户数据和用户匹配规则的地方。我假设它们在“您的解决方案”之外,但这并不重要。
- Cache 是保存 用户匹配(规则)和用户 数据的东西。它的唯一工作是以一种为匹配引擎快速工作而优化的方式来保存它们。从逻辑上讲,您可以说它是匹配引擎的一部分,或者是独立的。您如何处理此问题可能取决于您是否打算扩展匹配引擎。
- Data Provider 只是一个组件,其工作是获取用户和规则数据并使其可用于缓存。
因此,规则引擎、缓存和数据提供程序都可以是单独的组件,或者逻辑上是一个组件/微服务的一部分。
我正在使用 API,它每 1 秒发送一些关于产品的数据。 另一方面,我有一个用户创建的条件列表。我想检查是否有任何数据符合任何条件。如果是这样,我想通知用户。
例如,用户条件可能是这样的:price < 30000 and productName = 'chairNumber2'
数据将是这样的:
{'data':[{'name':'chair1','price':'20000','color':blue},{'name':'chairNumber2','price':'45500','color':green},{'name':'chairNumber2','price':'27000','color':blue}]
我正在使用微服务架构,在验证条件下,我正在 RabbitMQ 上向我的通知服务发送消息
我已经尝试过简单的解决方案(每 1 秒检查一次每个条件,如果有任何数据满足条件则将数据传递给我的其他服务) 但这需要太多的RAM和时间(时间顺序是n*m,n是条件数,m是数据数),所以我正在寻找一个更好的方案
这是一个有趣的问题。我不得不承认我真的不知道我会怎么做——这在很大程度上取决于处理需要发生的速度,以及许多其他没有提到的因素——比如你在您拥有的技术堆栈,是内部部署还是云端,解决方案必须由 you/your 团队编码,或者您可以购买一些 $$ 工具。为了将来参考,尤其是对于体系结构问题,您可以提供的任何上下文都非常有帮助 - 例如约束。
我确实想到了 Pub-Sub,它可能会提供您可以使用的模式,但您实际上只需要一个可以在您的代码库中运行的简单实现,而且非常重要你只有一个消费客户端,即 RabbitMQ 队列——这不像你有 X 数量的随机客户端想要数据。因此,现成的 Pub-Sub 解决方案可能不太合适。
假设您想要一个“本土”解决方案,目前想到的是:
(“flow”连接器显示数据流,可以解释为 'push';其他行是 UML“依赖”行;例如,匹配引擎依赖于数据保存在批次中,但不知道这是如何发生的)。
- 外部数据源是数据的来源。我没有对它的工作原理或您对它的控制权做出任何假设。
- 接口,这一切所做的就是获取原始数据并将其放入稍后可以由匹配引擎处理的批次中。界面的工作方式取决于您希望如何平衡 (a) 输入的数据,以及 (b) 您知道匹配引擎期望的内容。
- 批次被放入批次队列。它的工作是确保在处理之前没有数据丢失,可以管理处理(批处理顺序、弹性等)。
- 匹配引擎,假设每个批次的大小是可管理的 records/changes 数量,则运行速度很快。它的工作是进行更改并询问谁对它们感兴趣,然后 return 将结果发送给 RabbitMQ。所以它的输入只是批次和用户和用户匹配规则(稍后会详细介绍)。我不确定这实际上是如何工作的,最坏的情况是它遍历每个规则以查看谁匹配 - 你现在正在做什么,但是......
关键点:队列还允许您扩展匹配引擎实例的数量 - 但是,我不知道不知道对 RabbitMQ 及其下游消费者有什么影响(更新到达的顺序等)。
未显示的内容: 缓存。匹配引擎需要知道匹配规则是什么,以及这些规则与哪些用户相关。执行该查找的最快方法可能是在内存中,而不是数据库读取(除非您对它是如何发生的很聪明),这让我想到了这个补充:
- 数据源 是保存用户数据和用户匹配规则的地方。我假设它们在“您的解决方案”之外,但这并不重要。
- Cache 是保存 用户匹配(规则)和用户 数据的东西。它的唯一工作是以一种为匹配引擎快速工作而优化的方式来保存它们。从逻辑上讲,您可以说它是匹配引擎的一部分,或者是独立的。您如何处理此问题可能取决于您是否打算扩展匹配引擎。
- Data Provider 只是一个组件,其工作是获取用户和规则数据并使其可用于缓存。
因此,规则引擎、缓存和数据提供程序都可以是单独的组件,或者逻辑上是一个组件/微服务的一部分。