【问题标题】:What are the different ways of handling events in a publish-subscribe system?在发布-订阅系统中处理事件的不同方式是什么?
【发布时间】:2011-09-15 20:49:40
【问题描述】:

在每个订阅者等待多种类型事件的发布-订阅系统中,有没有比简单切换更好的处理方案?

假设我们有 2 个发布者,Pub1 和 Pub2; Pub1 发送 2 种事件 Pub1-eventA 和 Pub1-eventB,Pub2 相同,分别为 Pub2-eventA 和 Pub2-eventB

另一方面,我们有一个订阅 Pub1 和 Pub2 事件的客户端 Sub1;

您将如何管理在 Sub1 侦听器中处理这些事件?

这里有一些可能性:

一个监听器,一个大开关(难以维护):

Listener{

  HandleEvent(event){

    if(event.type == Pub1-eventA)
       Action1.execute();
    if(event.type == Pub1-eventB)
       Action2.execute();
    if(event.type == Pub2-eventA)
       Action3.execute();
    if(event.type == Pub2-eventB)
       Action4.execute();

  }

}

一个监听器和一个关联映射:

Map<event-type, Action> ActionMap

Listener{

      Action = ActionMap[event-type]

      Action.execute();
}

每个事件类型一个监听器:

ListenerPub1-eventA{ check(event-type); Action1.execute(); }
ListenerPub1-eventB{ check(event-type); Action2.execute(); }
ListenerPub2-eventA{ check(event-type); Action3.execute(); }
ListenerPub2-eventB{ check(event-type); Action4.execute(); }

【问题讨论】:

    标签: events event-handling publish-subscribe event-driven


    【解决方案1】:

    在“一个侦听器,一个大开关”和“一个侦听器和一个关联映射”中,每个事件仍然会以一个单独的方法结束,但您必须在代码中维护事件的分派。

    发布-订阅消息系统最重要的贡献是解耦发布者和订阅者。所以消息路由应该是你的中间件的责任。如果您的中间件无法进行消息路由,那么我建议为每种事件类型设置一个侦听器,以便:

    1. 您不必自己维护消息路由/调度
    2. 每个侦听器都有一个职责
    3. 在任何扩展方案的情况下,您可以为任何消息类型添加更多侦听器,而无需触及不相关的侦听器。

    这就是我能想到的。

    我希望这会有所帮助。

    【讨论】:

    • 我想这确实是最好的解决方案;您如何看待成群结队的听众?
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 2012-01-18
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多