2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

事件总线实现方式汇总

  • 2017-08-07
  • 本文字数:1744 字

    阅读完需:约 6 分钟

基于事件驱动的分布式异步架构模式多用于构建高可伸缩的反应式应用程序,适用于各种从简单到复杂的应用场景。它的核心思想是去耦合,将消息的发送和接收分开,实现异步处理消息事件。架构师 Mustafa Turan 在 Hackernoon 上分享了事件总线的几种实现方式,并总结了每一种实现方式的优缺点。

事件总线是实现基于事件驱动模式的方式之一,或者可以将其称为“Broker Topology”。事件发送者将事件消息发送到一个中心broker 上,事件订阅者向中心broker 订阅和接收事件,然后再处理接收到的事件。当然,订阅者不仅可以接收和消费事件,它们本身也可以创建事件,并将它们发送到事件总线上。下面列出了4 种事件总线的实现方式,并对它们的优缺点进行了总结。

事件总线和多个订阅者(绿色箭头)和通知发送者(红色箭头)

1. 向所有的订阅者发送事件

事件总线直接将输入事件(红色箭头)发送给订阅者(蓝色方块)

参与者

事件总线、订阅者(事件处理器)、事件创建者

实现

事件创建者向事件总线发送事件,事件总线将收到的事件发送给所有的订阅者。订阅者既可以处理接收到的事件,也可以创建新事件,然后把它们发送给事件总线。事件总线不关心订阅者是否成功接收到消息。

功能需求

通知、订阅、退订。

优势

实现起来很简单。

不足

事件总线需要将每一个事件消息复制一份给订阅者,也就是说,如果有 1000 个订阅者,每一个事件都会有 1000 份拷贝,这样会占用大量的内存。

事件总线不保证消息传递的可靠性,它会尝试给订阅者发送消息,而且只会尝试一次,如果出现错误,比如网络连接错误,订阅者可能就会收不到消息。
另外,事件总线不负责过滤消息,所以订阅者需要自己实现过滤逻辑。

Elixir 的参考实现

2. 向所有订阅者发送事件影子


事件总线和事件存储及事件观察者

参与者

事件总线、事件创建者、订阅者、事件存储(Event Store)、事件观察者(Event Watcher)

实现

事件总线在收到事件创建者发送过来的事件后,把事件保存到事件存储里,然后将事件影子(Event Shadow,也就是对原始事件的引用)发送给所有的订阅者。订阅者根据事件影子从事件存储里获取事件数据,再对数据进行处理。

事件总线为每一个事件创建一个事件观察者,观察者持有订阅者列表,当所有的订阅者都接收到消息后,观察者负责把事件从事件存储里删除。

事件总线仍然不保证订阅者一定会收到所有事件影子。如果有订阅者接收消息失败,相应的观察者就会被标记为“skipped”。

功能需求

通知、订阅、退订、保存 / 删除 / 获取、标记完成 / 跳过

优势

因为事件消息被保存在事件存储里,发送给订阅者的只是事件引用,所以占用内存会小很多。

不足

订阅者需要调用额外的方法,比如在收到事件影子之后要调用方法去获取事件数据,在处理完事件后还要调用方法通知事件总线已完成处理,或者通知事件总线跳过某个事件。另外,在事件总线端还要实现事件存储和事件观察者。这个对事件存储的实现要求比较高,如果订阅者数量很多,事件存储的读负载会很重,而且在写入事件时是阻塞式的。

这种实现方式仍然不会为订阅者过滤事件,所以订阅者还是需要自己实现事件过滤。

Elixir 的参考实现

3. 向经过过滤的订阅者发送事件影子

第三种实现方式与第二种是一样的,只不过不是将事件影子发送给所有订阅者,而是发送给经过过滤的订阅者,也就是说只发送给其中的一部分订阅者。事件总线需要记录订阅者感兴趣的主题,在这里可以使用正则过滤器为订阅者过滤主题。

这种方式的优势与不足和第二种也是一样的,只是多了事件过滤功能。

Elixir 的参考实现

4. 按顺序传递

为了保证顺序传递,可以对事件进行分区。关于如何通过分区来保证顺序传递,可以参考 Kafka 的论文,基本原理是让消费者消费属于自己的分区。

不足

动态增加分区或减少分区会变得很困难,而且需要自己实现分区器,消费者的实现也很复杂。

在实现订阅者时要注意的一些问题

对于第一种和第二种方式,需要通过阻塞的方式进行事件类型(也就是主题)匹配,避免进行不必要的事件拷贝,浪费了内存。

对于第三种和第四种方式,需要通过非阻塞的方式进行事件类型(也就是主题)匹配,因为订阅者只接收感兴趣的事件。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-08-07 19:005368
用户头像

发布了 322 篇内容, 共 159.4 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

提高单元测试质量的低代码思路

赫杰辉

Java 后端 低代码 单元测试

AI系统简介和分类

陈磊@Criss

多工厂、多基地数字化生产管理有难题?得帆云iPaaS可以帮你

得帆信息

集成

云服务过载控制的前世今生

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

MobTech MobPush|智能标签推送

MobTech袤博科技

一文带你搞懂如何优化慢SQL

京东科技开发者

数据库 sql 优化 企业号 3 月 PK 榜

平台使用体验和大客户推荐指数稳居第一,得帆信息入选《2022中国低代码全景产业研究报告》

得帆信息

低代码平台

OceanBase大事记(2023年3月)

OceanBase 数据库

数据库 oceanbase

GitHub上架即下架!《分布式系统人人都是架构师》全彩笔记开源

Java 分布式 系统架构 架构师

借AI之势,打破创意与想象的边界

阿里云CloudImagine

阿里云 AIGC

一份GitHub star过万的1121页图解算法让“他”成功杀进字节跳动

程序知音

Java 算法 编程语言 后端技术

跨越前后端排障鸿沟,精准排障,让IT人员不“撕逼”

嘉为蓝鲸

告警 后端技术 IT 运维

小程序营销模版——企业和开发者的应用形态

没有用户名丶

小程序容器

2023 微信公开课黄铁鸣企业微信最新动态:1200w、5亿客户、GMV上千亿

B Impact

MobTech MobPush|厂商通道支持

MobTech袤博科技

通信云服务全球突围,融云助力互联网产业出海「外卷」

融云 RongCloud

互联网 通信 融云

强大的PDF文档处理:Acrobat Pro DC 2023 中文版

真大的脸盆

Mac PDF Mac 软件 pdf编辑器 PDF文档处理

喜报|得帆信息成为中国信通院“卓信大数据计划”成员单位

得帆信息

低代码 中国信通院

CVPR 2023 大模型研讨会召开在即,国际技术竞赛正式开赛

飞桨PaddlePaddle

行业分析| anyRTC智慧视频监控的应用

anyRTC开发者

人工智能 音视频 智慧城市 智慧交通 视频监控

如何构建用户体验优化体系?

嘉为蓝鲸

IT运维 用户体验设计 用户体验分析

嘉为蓝鲸研发运营一体化解决方案入选金融信创优秀解决方案

嘉为蓝鲸

金融 解决方案 一体化

KubeVela 1.7 版本解读:接管你的已有工作负载

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

2步搞定拼版!AD通用拼版技巧分享!

华秋PCB

工具 PCB 原理图 PCB设计 拼版

阿里架构调整完毕,成立云智能集团全面独立经营,张勇兼任CEO

B Impact

Python:直观地查看某个物品使用一段时间之后每天的平摊价格

强劲九

Python 面试 matplotlib 算法题

一文详解扩散模型:DDPM

京东科技开发者

人工智能 AIGC 企业号 3 月 PK 榜 DDPM

在 Rainbond 上使用 Curve 云原生存储

北京好雨科技有限公司

云原生 kubernete 分布式存储 rainbond

事件总线实现方式汇总_架构_Mustafa Turan_InfoQ精选文章