2009-11-02 77 views
34

我想知道当我们引用SOA或中间件时,以及通常在应用程序和企业集成情况下,消息驱动环境和事件驱动环境之间是否存在明显的区别。我知道用户界面类似于事件驱动模型,我们的系统拦截用户的操作。消息驱动与应用程序集成的事件驱动方法

而且很显然,基于发布/订阅,采用同步或异步通信消息支持系统,交易等

但有中间件/ SOA /应用集成方面有区别吗? (架构级)。我正在尝试查阅维基百科(herehere)等来源,但我仍然有些困惑。开发人员何时应该选择一种解决方案?

是否有例子或案例,一种方法比另一种更有意义?或者有任何全面的资源和指导来实施每一个?

非常感谢任何见解。

回答

15

对“有明显区别”的简短回答是“否”。

这些术语不是完全可以互换的,但意味着相同的基本架构 - 特别是您将触发事件或消息。

您引用的第一篇文章是关于低级管道系统,即代表您传输邮件的MOM或pub-sub“公交”。事件驱动的体系结构是您在该框架之上构建的。

术语事件驱动,同时也适用于GUI代码,并不是真正处于相同的抽象层次。在这种情况下,与沿着消息/事件驱动的线路构建整个企业相比,它是一个小型模式。

7

事件驱动的体系结构可以实现带或不带消息。消息传递是以可靠,有保证的方式将生产者提出的事件传达给消费者的一种方式。特别是当生产者和消费者真正解耦时,可能托管在不同的服务器/虚拟机/环境中,并且无法直接访问任何共享内存。

但是,在特定情况下 - 当事件的使用者是在同一应用程序本身内注册的函数/回调,或者需要同步执行使用者时,则可以实现无需消息传递的事件订阅。

2

因为它很好地放在this文章中,为了理解事件驱动的设计,我们不必看它呈现的是什么,而是要观察它隐藏的内容,这只不过是编程的基础; “调用栈”。

在事件驱动设计中,方法调用的定义直接从窗口中移出。没有更多的呼叫者和被叫者。这是一个接吻顺序和顺序的吻。系统不需要知道事情发生的顺序。因此,共享内存空间(这是调用堆栈的先决条件)变得不必要。

但是,在调用堆栈环境中,不仅调用者必须知道接下来会发生什么,而且必须能够将功能与方法名称相关联。

默认情况下,面向消息的应用程序会删除共享内存。发布者和订阅者不需要共享内存空间。另一方面,所有其他特征(即顺序,方法名称耦合等)都不是必需的。

如果消息传递是为了符合事件驱动架构的公理而设计的,它们可以被认为是相同的。否则,它们之间存在巨大的差异。

0

如果我们使用事件驱动的方法,我们通常希望在这个事件中发送源对象 - 发布事件的组件。因此,在订户中,我们不仅可以获取数据,还可以知道谁发布了此事件。例如。在移动开发中,我们会收到View,它可以是Button,Image或一些自定义View。根据这个视图的类型,我们可以在用户中使用不同的逻辑。在这种情况下,我们甚至可以添加一些后处理,修改源组件 - 例如将动画添加到这些源视图。

当我们使用消息驱动的方法时,我们只想发布带有一些数据的消息。发布此消息的订阅者无关紧要,我们只是想接收数据并进行处理。

30

这是关于JonasBonér问题的Typesafe/Reactive的观点。从this blog post的第三段可以看出:“不同之处在于消息是定向的,事件不是 - 消息具有明确的可寻址收件人,而其他人(0-N)发生的事件只是为了观察它。”

+0

由于我们可以在0-N可寻址接收者之间广播消息,所以也值得强调直接的词。 – 4lex1v 2015-10-08 06:31:09

0

事件驱动体系结构和消息驱动体系结构是两个不同的东西,并解决了两个不同的问题。

事件驱动架构重点在于如何触发系统正常工作。在EDA环境中被认为是事件的大多数触发事件是通过键盘和鼠标以外的方式生成的事件。这是一个EDA,如果这使我们明确地考虑事件发生器,事件通道,事件处理引擎。

键盘和鼠标是显而易见的事件发生器,但是处理这些事件已经被各种框架或运行时间所关注,并且作为架构师我们不需要担心它。还有一些特定于某个领域的事件是建筑师应该考虑的。示例 - 供应链管理事件 - 选择,包装,派送,分销,零售商,销售等。从工业物联网类型应用的技术角度来看,事件包括:RFID读取,生物度量读取,传感器数据,条形码扫描,系统生成的事件是需要明确照顾的事件,因为这些事件驱动系统的功能。

消息驱动体系结构的重点是通过使用标准面向消息中间件将消息从一个模块传递到系统的另一个模块来集成分布式系统。

14

很久以前,这个问题被问到。我认为,一个更加现代化和明确的回应是由Reactive ManifestoMessage-Driven (in contrast to Event-Driven)给出:

的消息是发送到特定目标数据项。事件是组件在达到给定状态时发出的信号。在一个消息驱动的系统中,可寻址的收件人等待消息的到达并对它们作出反应,否则将处于休眠状态。在事件驱动的系统中,通知监听器被附加到事件源,以便在事件发出时被调用。这意味着事件驱动的系统专注于可寻址的事件源,而消息驱动的系统专注于可寻址的收件人。消息可以包含编码事件作为其有效负载。