这个问题很久以前就被提出来了。我认为更现代和清晰的回答是由Reactive Manifesto在Message-Driven(与Event-Driven相对)中给出的:
消息是发送到特定目标的数据项。事件是组件达到给定状态时发出的信号。在消息驱动的系统中,可寻址接收者等待消息的到来并对其做出反应,否则处于休眠状态。在事件驱动的系统中,通知监听器附加到事件源,使得它们在事件发出时被调用。这意味着一个事件驱动的系统关注可寻址的事件源,而一个消息驱动的系统集中于可寻址的接收者。消息可以作为其有效负载包含编码事件。
事件驱动方法的一个缺点是整个系统变得稍微难以理解。例如,假设负责订单服务的团队要求您根据信用卡被拒绝的原因(没有资金,账户关闭,账单地址不正确等)用不同的事件替换AuthorizationDeclined事件。如果您停止发布AuthorizationDeclined事件,那么是否会影响其他一些服务?如果有许多事件和服务,则可能很难跟踪。
事件驱动架构可以使用或不使用消息传递来通信。消息传递是一种可靠、保证的方式,用于将生产者产生的事件传递给消费者。特别是当生产者和消费者真正解耦且可能托管在不同的服务器/虚拟机/环境中,并且没有直接访问任何共享内存时。
但在某些情况下-当事件的消费者是注册在同一应用程序内部的函数/回调时,或者当需要同步执行消费者时,可以在不使用消息传递的情况下实现事件订阅。
消息(Message)概念是抽象的,更具体的消息类型是事件(Event)和命令(Command)。
虽然消息没有任何特殊意图,但是事件通知已经发生并已经完成(在过去)。命令触发应该发生的事情(在未来)。
事件驱动架构和消息驱动架构是两种不同的东西,解决了两个不同的问题。
事件驱动架构关注的是系统如何被触发运行。在EDA的上下文中,大多数被认为是事件的触发器都是由其他手段生成的事件。如果让我们显式地考虑事件生成器、事件通道和事件处理引擎,那么它就是一个EDA。
键盘和鼠标是明显的事件生成器,但是这些事件的处理已经由各种框架或运行时进行了处理,作为架构师,我们不需要担心这一点。架构师需要思考的是某些领域特定的其他事件。例如——供应链管理事件——拣选、打包、派送、分销商、售出等。从技术角度来看,对于工业物联网类型的应用程序,RFID读取、生物识别读取、传感器数据、条码扫描、系统生成的事件是需要显式处理的事件,因为这些事件驱动着系统的功能。
消息驱动架构的重点是通过使用标准的面向消息的中间件将消息从一个模块传递到系统的另一个模块,以集成分布式系统。
当我们使用消息驱动的方法时,我们只想发布带有一些数据的消息。对于订阅者来说,由谁发布这条消息并不重要,我们只想接收数据并以某种方式进行处理。
我在谷歌上搜索消息和事件之间的区别时遇到了这个帖子。在阅读了以上所有回复后,仍然没有得到答案。
于是我尝试了更多的搜索,并找到了适合我的答案,所以我打算留在这里,希望能帮助像我一样的人。
消息是发送到特定地址的一些数据。在消息驱动系统中,每个组件都有一个唯一的地址,其他组件可以向其发送消息。这些组件或接收者等待消息并对其做出反应。
事件是从组件发出的一些数据,供任何监听者使用。