鉴于Event-A
,Event-B
,Event-C
在彼此的天数内到达(可能无序),我想触发处理以生成衍生Event-ABC
知道我在集合中有所有事件。
事件按userId / sessionId
分组目前,我从单个队列中读取所有事件,写入数据库,并更新元数据,说明已写入哪些事件。一旦元数据包含基于规则的所有事件,我就会触发聚合处理。这种方法存在一些性能问题,因为队列工作者在处理属于同一组的事件时可能会敲击相同的密钥,因此我正在寻找替代方案。
我想要的是基于userId / sessionId进行处理的更细粒度的软件定义路由和排队事件。我认为我想做的事情与事件采购有些相似。
我在看Akka是否可以帮助解决这类问题。对于每个userId / sessionId的actor,它将减少不需要的并发性并在actor中包含触发器逻辑。我担心的是使用这么多Actors时可能存在大量内存需求。
答案 0 :(得分:0)
您所描述的内容更类似于Saga或流程管理器,而不是事件采购。您需要处理多条消息的内容,然后在满足规范后做出反应。
阿卡当然可以应付这种情况。使用Akka,您可以为每个键创建一个actor,然后在收到它们时将消息路由到各个actor。我不会太担心内存问题,因为Actor系统应该应对成千上万的Actors。我认为你需要衡量你到达的任何解决方案的性能。您还需要考虑如何处理服务器崩溃 - 如果您将所有内容保存在内存中,那么当服务器崩溃时您很容易丢失传奇。根据您的要求,这可能是也可能不是问题(即,如果您可以从中恢复)。如果考虑到这一点很重要,你可以查看Akka Persistence。
答案 1 :(得分:0)
由于队列工作人员在处理属于同一组的事件时可能会敲击相同的密钥,因此这种方法存在一些性能问题,因此我正在寻找替代方案。
免责声明:我不确定我理解您在此处所描述的内容,因此下面的解决方案可能不合适。
我认为我想做的事情与事件采购有些相似。
是的,您的说明听起来很像来自process manager
的事件。
事件处理程序(您可能每个事件类型都有一个,或者订阅这三个事件类型的单个处理程序)会收到一个事件。
从userId / userSession信息中,它计算此流程实例的唯一标识符。根据流程的唯一标识符构建哈希或命名为uuid。
加载与标识符匹配的进程的当前状态。这是一个跟踪之前已经看过哪些事件的数据结构。它可能只是一个事件流。
apply
当前事件进入进程状态。 "应用"如果已经看到此事件,预计将成为无操作 - 您的事件消息确实具有唯一标识符,对吗?
保存更新的流程状态。这结束了交易。
现在观察进程状态 - 您可以在事件处理程序或异步进程中立即执行此操作。如果该过程是"准备好",则动词生成Event-ABC。
上面的大纲遵循通用模式,其中您有流程管理器跟踪正在运行的流程的状态,但通过针对适当的聚合运行命令来触发业务逻辑。
在更简单的设计中,您可以合并"聚合"和"过程"。基本模式是相同的 - 事件处理程序计算聚合的id,加载它,并调用handle事件命令。聚合使用事件中包含的信息更新其自身状态,并将状态更改写入其自己的历史记录中。如果考虑了所有必需的事件,聚合也会将Event-ABC写入其自己的历史记录中。