在多线程环境中整合Siddhi查询运行时

时间:2018-06-20 08:34:08

标签: wso2 siddhi wso2sp

您好:我有一个可以远程订阅事件频道的环境。事件通道会将事件推送到我的环境,并且我将有许多规则来处理事件。我计划使用Siddhi框架来实现这些规则并相应地处理事件。

在我遍历了Siddhi代码库后,似乎在siddhi示例中可以很好地表示Siddhi执行模式,例如https://github.com/wso2/siddhi/blob/master/modules/siddhi-samples/performance-samples/src/main/java/org/wso2/siddhi/performance/SimpleFilterMultipleQueryPerformance.java。它执行以下步骤:

(1)使用指定的流查询(查询1,查询2 ..)创建Siddhi运行时; (2)为输入流创建输入处理程序。 (3)构造事件,然后使用输入处理程序发送事件; (4)将创建的Siddhi Runtime添加到回调中,当输出流产生一些输出事件时,将通过传入的输出事件来调用回调函数。

通过简单的代码检测,我发现通过输入处理程序发送事件的线程与处理回调函数的线程相同。这使我推断整个Siddhi运行时都在单个线程中同步运行。这句话正确吗?

从我上面提到的Siddhi示例代码中,该代码使用多个事件发布者线程来处理事件的发送。在我看来,通过使用多个事件发送线程,我们可以实现Siddhi运行时的多线程执行。

由于我将要定义许多Siddhi查询,即query1,query 2,...等,所以有两个选项:

(选项1)类似于Siddhi代码库中的示例代码“ SimpleFilterMultipleQueryPerformance.java”,我创建了一个siddhi运行时对象,然后将所有Siddhi查询注册到该单个运行时。然后,我使用多个线程将事件同时发送到该单个运行时的输入处理程序。

(选项2)我创建了多个Siddhi运行时对象,向每个对象注册了Siddhi查询的子集。我控制线程,以便一个特定的线程发送仅专用于与一个特定的运行时对象相对应的输入处理程序的事件。也就是说,一个线程将事件发送到专用的Siddhi运行时对象;保证每个运行时仅由一个线程调用。

我想知道哪种选择在性能方面更好?

2 个答案:

答案 0 :(得分:0)

您的询问是关于使用Siddhi作为图书馆[1]。对于使用Siddhi作为库的方案,您对消息流的理解是正确的。但是有了Siddhi 4.x.x,就可以直接通过源和汇来处理传输。有关此的更多信息,请参见[2]。此外,产品封装的流处理器[3]还增加了更多功能,例如具有运行,调试功能的IDE。快速入门指南[4]将是一个很好的起点。

  

这使我推断整个Siddhi运行时正在单个线程中同步运行。

是的,调用inputHandler.send()的同一线程将遍历整个事件流直到回调,因此这是同步行为,但请注意send()不会返回任何内容,也不能保证每个事件都达到回调(某些可以过滤掉)。还有一个异步模式,您可以使用注释启用它。在这种模式下,我们使用打扰器[5]使消息流异步。可以存在多个并行线程,它们执行相同的路径,但转发不同的事件。 Siddhi被设计为以这种方式是多线程的。因此,可以执行多个并行事件。如果您使用多个线程调用相同的inputHandler,则这些事件将被并行处理。

关于您的选项,如果您的查询是互斥的,则创建更多的Siddhi App Runtime并并行运行它们(选项2)将具有更高的性能,因为争用较少。它等效于垂直缩放。但是,如果查询彼此连接,这意味着您必须将一个回调连接到另一个输入处理程序,则选项2的性能将降低。在这种情况下,选项1可以正常工作。仅就您所知,我们确实有分布式部署[6],也可以处理高事件发生率的情况。

[1] [https://docs.wso2.com/display/CEP410/Using+Siddhi+as+a+Library][1]

[2] https://wso2.github.io/siddhi/documentation/siddhi-architecture/

[3] https://wso2.com/analytics/features

[4] https://docs.wso2.com/display/SP410/Quick+Start+Guide

[5] https://lmax-exchange.github.io/disruptor/

[6] https://docs.wso2.com/display/SP420/Fully+Distributed+Deployment

谢谢

提山

答案 1 :(得分:0)

Siddhi现在支持Siddhi 4.1.50版中的可配置线程[1]。这使您可以配置多个工作线程来并行处理事件。

[1] https://wso2.github.io/siddhi/documentation/siddhi-4.0/#threading-and-asynchronous