为了账号安全,请及时绑定邮箱和手机立即绑定

浅谈事件驱动架构(EDA)的概念及关键组件

近年来,事件驱动架构已经变得非常流行,在开发高度可扩展的分布式系统方面。它是一种设计软件的方式,其中不同部分通过发送和响应事件来通信。

一个事件就是发生的事情,比如,

  • 用户注册
  • 用户上传照片
  • 支付完成,

系统中不同的部分不会直接向彼此发出请求,而是关注这些事件,并在需要时进行回应(异步)。

比如说:

  1. _支付服务模块_完成并触发“支付完成”的事件。
  2. _库存服务_响应该事件并更新新购商品的库存。
  3. _邮件服务_响应并发送确认邮件。

我们来看看事件驱动架构中的组件的一个非常简单的图。

关键要素

图片说明

1. 事件生产者/发布者
当某些事情发生时创建并发布事件的系统或服务。
示例:当一个新用户注册时,用户服务会发送一个“用户注册”的事件。

2. 消息代理
消息代理是一种中间件,它位于事件生产者和事件消费者之间。其主要作用是高效地接收、存储和转发事件,确保事件准确无误地送达合适的消费者服务。

在这一背景下,消息代理里有一个关键的概念叫做信道。这些信道充当通信路径,协调从生产者到相应消费者的事件流动。

  • Kafka 中,这些通道被称作 主题。它支持 多订阅者模型,允许多个消费者从同一个发布者接收消息。
  • RabbitMQ 中,这些通道被称作 队列。RabbitMQ 的队列通常是 点对点 的,这意味着一个队列中的消息只能由一个消费者接收和处理。

示例技术:Kafka、RabbitMQ、AWS SNS/SQS(亚马逊SNS/SQS)、Google Pub/Sub(谷歌Pub/Sub)。

3. 事件消费者/订阅者
监听事件并作出反应的服务。
例如:通知服务监听“用户注册”的事件并发送一封欢迎邮件。

4. 事件
描述实际发生的事件的消息。它通常包含结构化数据,比如 JSON 或 XML。
例如:示例事件消息:

    {
      "数据": {
        "id": "event-123456",
        "类型:": "注册事件",
        "时间戳": "2025-04-01T12:00",
        "属性": {
          "id": "usr-98765",
          "电子邮件": "user@example.com",
          "姓氏": "example",
        }
      }
    }

切换到全屏,退出全屏

经纪交易平台

交换是一种机制,决定消息如何进入队列。不同类型的交换提供了不同的消息分发方式。

直接交换(一对一路由)
基于路由键和队列绑定键(RabbitMQ)的精确匹配将消息路由到队列。
它是怎样工作的?

  • 生产者发送一条带有路由键的消息。
  • 交换机只会把消息转发给那些绑定关键字匹配的队列。

示例:
带有路由键为 "order.created" 的消息只会发送到绑定的队列。

如图所示
这张图片

Fanout 交换器(广播)
将消息广播到所有绑定的队列,忽略路由键,就像在RabbitMQ-Fanout交换器中一样
(RabbitMQ-Fanout 交换器 | Kafka-每个主题可以有多个消费者)。

它是怎么工作的?

  • 生产者发送了一条消息。
  • 交换器将消息转发到所有绑定的队列。

例如:
通知事件会被广播到多个服务(电子邮件、短信、以及推送通知)。

图片描述

主题交换(模式匹配)
根据路由键中的通配符模式来分发消息。支持用*匹配一个词,用#匹配多个词。(例如RabbitMQ的主题交换和Kafka的带分区键的主题)。
它是怎么工作的?

  • 使用 . 用法来分隔 routing key 中的单词,例如 "order.payment.failed"

示例:
绑定到的队列会接收 "order.*",并且会接收 "order.created""order.cancelled",但是不会接收 "user.created"

图片描述
看起来是一张图片,点击可以查看。

EDA的优势 - Reactive Manifesto(反应宣言)
  • 可扩展性:解耦的服务可以各自扩展。
  • 灵活性:无需改动现有服务,就可以轻松添加新的事件消费者。
  • 实时处理:支持实时数据流处理,并能够快速响应。
  • 弹性:只要妥善管理事件和订阅,一个服务的故障就不会影响整个系统。
  • 松耦合:组件通过事件进行交互,从而减少了依赖性。
EDA的缺点
  • 最终的一致性:系统不同部分可能会暂时持有过时的信息,直到所有事件都被处理。
  • 调试难度大:在多个异步事件之间追踪问题变得更加困难。
  • 延迟增加:由于异步的特性,某些事件可能需要更长的时间来处理。
  • 重复事件:需要幂等性来避免重复处理。
  • 某些代理(如RabbitMQ)不能保证消息的顺序:一些代理不能保证消息的顺序。
  • 需要学习事件驱动的设计模式:需要掌握事件驱动的设计模式。
最后,让我们来看看结语.

如果你打算实现一个分布式、实时且高度可扩展的系统,你一定要考虑实现一个事件驱动的架构,来充分利用它带来的所有好处。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消