c# - API 数据条件检查列表

标签 c# .net architecture quartz.net

我正在使用一个 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是数据数),所以我正在寻找一个更好的方案

最佳答案

这是一个有趣的问题。我不得不承认我真的不知道我会怎么做——这在很大程度上取决于处理需要发生的速度,以及许多其他没有提到的因素——比如你在您拥有的技术堆栈,是在内部部署还是在云中,解决方案必须由您/您的团队编码,或者您可以购买一些 $$ 工具。为了将来引用,尤其是对于体系结构问题,您可以提供的任何上下文都非常有帮助 - 例如约束条件。

我确实想到了 Pub-Sub,它可能会提供您可以使用的模式,但您实际上只需要一个可以在您的代码库中运行的简单实现,而且非常重要的是您只有一个消费客户端,RabbitMQ 队列——这不像你有 X 数量的随机客户端想要数据。因此,现成的 Pub-Sub 解决方案可能不太合适。

假设您想要一个“本土化”的解决方案,目前想到的是:

enter image description here

(“流”连接器显示数据流,可以解释为“推”;其他行是 UML“依赖”行;例如,匹配引擎依赖于批处理中保存的数据,但是它不知道这是如何发生的)。

  • 外部数据源 是数据的来源。我没有对它的工作原理或您对它的控制权做出任何假设。
  • 接口(interface),所有这一切所做的就是获取原始数据并将其放入可以稍后由匹配引擎处理的批处理中。界面的工作方式取决于您希望如何平衡 (a) 传入的数据,以及 (b) 您对匹配引擎的期望。
  • 批处理被放入批处理队列。它的工作是确保在处理之前没有数据丢失,并且可以管理处理(批处理顺序、弹性等)。
  • 匹配引擎,在假设每个批处理的大小是可管理的记录/更改数量的前提下,运行速度很快。它的工作是进行更改并询问谁对它们感兴趣,然后将结果返回给 RabbitMQ。所以它的输入只是批处理和用户和用户匹配规则(稍后会详细介绍)。我不确定这实际上是如何工作的,最坏的情况是它遍历每个规则以查看谁匹配 - 你现在正在做什么,但是......

关键点:队列还允许您扩展匹配引擎实例的数量 - 但是,我不知道这对下游有什么影响RabbitMQ 及其下游消费者(更新到达的顺序等)。

未显示的内容:缓存。匹配引擎需要知道匹配规则是什么,以及这些规则与哪些用户相关。执行该查找的最快方法可能是在内存中,而不是数据库读取(除非您对它是如何发生的很聪明),这让我想到了这个补充:

enter image description here

  • 数据源 是保存用户数据和用户匹配规则的地方。我假设它们在“您的解决方案”之外,但这并不重要。
  • 缓存 是保存用户匹配(规则)和用户 数据的东西。它的唯一工作是以一种为匹配引擎快速工作而优化的方式来保存它们。从逻辑上讲,您可以说它是匹配引擎的一部分,或者是独立的。您如何处理此问题可能取决于您是否打算扩展匹配引擎。
  • Data Provider 只是一个组件,其工作是获取用户和规则数据并使其可用于缓存。

因此,规则引擎、缓存和数据提供程序都可以是单独的组件,或者逻辑上是一个组件/微服务的一部分。

关于c# - API 数据条件检查列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68970178/

相关文章:

c# - 自定义光标在 IE9 中不起作用?

C# 引用命名空间被类命名空间隐藏

java - 一些疑问与此 Swing MVC 实现有关。打开数据库连接应该是 Controller 任务?

C# 二进制搜索变体

authentication - API网关应该负责授权吗?

.net - 跨负载平衡服务器 (ASP.Net) 的选择性缓存清除

c# - 检查空引用

c# - MySQL BLOB 图像数据逐渐丢失?

c# - 在 WinForms 的 ListView 中更改滚动条的颜色

c# - 如何在Visual Studio中找到哪个 `method`来自哪个 `namespace`