当被路由者想要更改路由时,Akka路由参与者

当被路由者想要更改路由时,Akka路由参与者,akka,Akka,请注意,以下说明仅用于说明。问题是关于akka中事件流处理的模式,而不是关于如何使用替代设计解决示例的问题 想象一个用Akka编写的复杂事件处理引擎,其中事件规则由参与者建模。消息的事件流类似于订单、订单中的项目履行、订单付款。业务规则参与者正在做一些类似于向客户开具发票和跟踪付款直至完成的事情。业务规则感兴趣的数据本质上是非常动态的,不可能知道哪些规则正在跟踪消息流的哪些部分 很天真,我们可以使用boardcast路由器风格的方法。所有业务规则参与者都会看到所有数据,如果他们跟踪的不是数据,他

请注意,以下说明仅用于说明。问题是关于akka中事件流处理的模式,而不是关于如何使用替代设计解决示例的问题

想象一个用Akka编写的复杂事件处理引擎,其中事件规则由参与者建模。消息的事件流类似于订单、订单中的项目履行、订单付款。业务规则参与者正在做一些类似于向客户开具发票和跟踪付款直至完成的事情。业务规则感兴趣的数据本质上是非常动态的,不可能知道哪些规则正在跟踪消息流的哪些部分

很天真,我们可以使用boardcast路由器风格的方法。所有业务规则参与者都会看到所有数据,如果他们跟踪的不是数据,他们会忽略该消息。然而,这会带来可伸缩性问题,因为并非所有规则参与者都对所有数据感兴趣,而且比例非常大。这意味着使用一个索引,通过消息中的复杂业务标识符跟踪哪些规则参与者正在跟踪哪些类型的消息。然后,我们只能向规则参与者发送他们正在查找的数据。此索引显示哪些消息发送到哪些参与者,这些参与者会根据参与者内的业务规则进行更改。从路由参与者的角度来看,则被路由者希望动态地更改路由

这就产生了一个时间问题。如果路由参与者的运行速度足以让许多路由对象忙碌,那么当一个特定的路由对象获得消息{a}时,它将传递一个消息流,比如{a,B,C}。如果该路由器随后决定它需要消息{B},那么它将已经被路由到它的上游,而不是路由到最近发现它现在希望消息{B}看到消息{A}的路由器的邮箱。修改后的路由只会在{C}之后的消息上生效,或者更可能在路由参与者开始处理来自特定路由对象的响应消息时生效

一种解决方案是在路由参与者处缓冲消息。然后,如果一个路由对象改变了它感兴趣的消息响应,那么路由参与者可以扫描旧消息的缓冲区,并根据需要重新发送一些消息。这意味着需要大量代码来保持消息缓冲区尽可能小,以便能够尽可能高效地重新发送它们。我想知道是否有更标准的模式或更自然的方法来解决Akka内的动态路由问题


[脚注:注释中描述的替代解决方案是使用消息缓存,并让规则参与者点击缓存,但让我们假设缓存必须非常大,强制IO或两阶段提交主jdbc存储,因此假设缓存是不需要的,如果可以避免的话。问题是关于事件streakka中的aming模式,其中路由规则可以以一种高度动态的方式改变——上面对这样一个系统的近似描述是简化的,仅用于说明目的。关键段落是关于消息流{a,B,C},让路由读取{a}决定它需要消息{B}它已经被上游路由器发送了。]

这个问题似乎相当普遍。我在这里看到两个子问题

  • 它可能从规则分解中受益。如果可以创建“关联令牌”(客户id、初始订单id),那么一些中间参与者可以进行非常好的初始路由(例如基于令牌的哈希)。最后,最终参与者可以从小得多的消息集中选择所需的内容

  • <> LI> < P>为构建具有复杂规则的通用事件处理拓扑,可以考虑一个库。它有一个构建拓扑结构的生成器,然后将其转换成互连的参与者的运行时系统。这些规则要么与Scala函数一样简单,要么与具有嵌套的行动者的完整子系统分支一样复杂。/p>
    问题,要处理的每个事件/消息是否都有一个ID&您的应用程序是否可以明确地说我有消息ID=A我需要消息ID=B?根据您当前的设计,也许您有一个聚合器,它维护ID列表,并且知道潜在的副作用,并在需要时将消息转发给其他参与者。另一个选项是尽可能多地对你的管道进行梳理和分组,这样你就可以向有限数量的参与者广播,参与者链可以自行决定下一步向何处发送消息。@NightWolf新的akka软件是聚合器,它的工作是制定业务规则,以确定哪些消息是相关的,并根据这些消息采取行动。因此,问题不能简单化ied需要在将消息发送给规则参与者之前知道哪些消息是相关的。事件的峰值突发量将非常高,因此需要一个扇出管道。路由参与者应该持有一个索引,其中哪些规则通过消息上的哪些业务键跟踪哪些消息。然后,问题中概述了挑战:如何提高效率我不确定我是否完全理解为什么你需要一个路由参与者。听起来好像RuleActorX正在做出路由状态需要更改的决定。对我来说,这听起来像是充实。如果RuleActorX决定它需要更多的数据,那么它应该通过向某个重选者发送消息来请求ter或显式地从存储中获取消息。也许您可以使用代理来管理状态更改,而不是缓冲似乎有风险的消息。您是正确的,当我们更改规则参与者希望看到的内容时,他们当前会前往mongodb获取数据。我有一个akka解决方案,该解决方案在正常的持久化查询模式下工作,但我们新台币要扩大到几千万或几亿