【问题标题】:Incorporating Siddhi Query Runtime in a Multithreading Environment在多线程环境中合并 Siddhi 查询运行时
【发布时间】:2018-06-20 08:34:07
【问题描述】:

嗨:我有一个远程订阅事件通道的环境。事件通道会将事件推送到我的环境中,我将有许多规则来处理事件。我计划使用 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 运行时对象;保证每个运行时仅由一个线程调用。

我想知道在性能方面哪个选项更好?

【问题讨论】:

    标签: wso2 siddhi wso2sp


    【解决方案1】:

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

    这让我推断出整个 Siddhi 运行时都在一个线程中同步运行。

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

    关于您的选项,如果您的查询是互斥的,则创建更多的 Siddhi 应用程序运行时并并行运行它们(选项 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

    谢谢,

    体山

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2022-01-06
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        相关资源
        最近更新 更多