何时使用事件总线?

31
我正在设计一个新的Java Web应用程序的后端,正在考虑是否使用事件总线;具体来说是 Guava 的 EventBus
大多数服务器端请求将是同步的:也就是说,用户正在请求数据,并且需要在几秒钟内得到响应。但是,还有很多可以异步处理的请求,在客户端上是“fire and forget”。只要它们最终被处理,客户端就不在乎花费 2 秒还是 2 小时。
对于这些异步请求,我计划让映射 URL 的 Servlet 将请求发布到队列中。然后,消费者将出队每个请求并将其路由到适当的处理程序。这就是 EventBus 是否适用的地方。将请求路由到正确的处理程序的业务逻辑非常复杂。通常情况下,Camel 路由将是完美的解决方案。在我的用例中,我想知道是否可以将一堆“处理器”(事件处理程序)连接到同一个事件总线上,然后让每个处理程序相互触发和接收事件,直到产生最终结果。
我想说我已经探索了使用 Apache Camel,我确实认为在这里 Camel 是正确的工具。不幸的是,由于问题超出了此问题的范围,我将不会使用它。因此,我开始构想类似 Camel 的解决方案,这就是我如何找到 Guava 的 EventBus。但它可能不是一个合适的替代品。
我猜我正在寻找 Event Bus 模式解决的问题分类,然后我需要确定是否与我的用例相匹配。
1个回答

51
这里是EventBus解决的问题陈述的简要内容:
“我需要一个简单的、集中式的通知机制,当特定类型的事件发生时,可以通知感兴趣的代码,而不需要在发布事件的代码和接收事件的代码之间直接耦合。”
当你说“将请求路由到正确处理程序的业务逻辑相当复杂”时,我怀疑EventBus可能不是你要找的东西,因为它仅基于Java对象类进行路由(尽管你可以通过在事件类上实现接口并让订阅者订阅特定接口来做一些花哨的事情)。

1
感谢@ColinD(+1)-是的,我想每个订阅者/处理器都可以在事件总线中像弹球机内的弹球一样弹来弹去。在每个订阅者处,事件将被修改,就像Camel processors内部修改Message/Exchange的方式一样。我仍然犹豫是使用它还是手动将处理器连接在一起。我感兴趣的是解耦,但EventBus仍然不像是最好的(非Camel)解决方案。我会给你打上绿色勾,并会向您汇报我的决定和结果。再次感谢! - IAmYourFaja
这有点像中介者。 - stdout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接