从Web API接近实时事件处理

时间:2015-12-26 10:31:44

标签: c# multithreading api rest service

如果你不介意,我会提出一些想法或意见。我正在尝试理解解决方案的最佳方法,该解决方案需要使用REST和JSON处理通过Web API接收的近实时事件。每秒都会收到几个事件。

当收到一个事件时,它会根据许多规则进行处理,这些规则可能需要计算费用。将针对100s规则处理每个事件以查找匹配项。规则可能基于多个事件,因此我需要将状态存储在内存中,而不是磁盘或数据库,因为性能将成为关键。规则将作为一次性练习从数据库推入,并将再次保存在内存中。如果更改规则,则会重新推送。

最好是写一个C#WebAPI应用程序来接收和关联事件。还是WebAPI和Windows服务?

如果以后如何让API和Windows服务在彼此之间传递数据?这些可以在相同或不同的服务器上

使用Windows服务而不是为每个重新指定的事件启动新线程,我想我应该创建一个事件队列或缓冲区(某种FIFO阵列)。 Id有几个缓冲区分配给不同的线程或进程,以实现某种程度的并行性。

同样,如果我将其生成为WebAPI,是否可以创建排队/线程方法?

1 个答案:

答案 0 :(得分:0)

这个问题可能太大而无法提供单一答案。像这样的设计系统取决于许多因素,例如系统的要求。

对于一般事件处理解决方案,最好使用web api将事件保存到队列系统中,该队列系统存储事件以供以后处理。队列可以是外部服务,例如Azure存储队列,也可以是自定义的任何自定义队列实现,您可以与之通信并满足您的要求。

然后,您将拥有单个或多个事件处理器,用于检索事件以便从队列进行处理。事件处理器可以是您编写的自定义程序。通常,队列应该有一种方法来租用事件,以便在处理器发生故障(崩溃)时将事件返回到队列以供另一个处理器处理。处理器处理完事件后,可以从队列中永久删除它。

拥有这种类型的架构是构建可靠且可扩展的处理事件解决方案的良好起点。当然,如果每秒事件的数量很大,就必须考虑队列的性能,因为它可能成为瓶颈。