写点什么

事件总线实现方式汇总

  • 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:005207
用户头像

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

关注

评论

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

广发证券基于 Apache Kyuubi 构建“提效可控”大数据赋能层

网易数帆

大数据 spark 开源 Kyuubi 广发证券

MISRA C++:2023已发布,一起来了解下C++发展史及使用技巧

龙智—DevSecOps解决方案

MISRA C++:2023 MISRA

ClkLog埋点系统客户案例-互联网运营经理谈埋点分析系统

ClkLog

兼容M1 Mac下载工具Folx pro 5 v5.27中文激活版 安装包

南屿

spss统计软件:IBM SPSS Statistics 27 (Win/mac)中文激活版

南屿

macOS高品质音频播放器:HQPlayer 4 Pro for mac

南屿

mac软件下载 mac音乐播放器 HQPlayer 4 Pro下载 苹果电脑无损播放器 HQPlayer 4 Pro破解版

一步一步教你写kubernetes sidecar

不在线第一只蜗牛

Kubernetes k8s 多集群

洞悉代币资金流,助力 GameFi 项目运营决策

Footprint Analytics

gamefi #区块链

2023年总结:NFT经济从不可替代到可替代的转变

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

ZCube:在我的优惠券中的落地实践 | 京东云技术团队

京东科技开发者

ATL:用对方法招对人,智能招聘降低人工成本

用友BIP

智能招聘

一文带你深入理解K8s-Pod的意义和原理

华为云开发者联盟

云原生 华为云 华为云开发者联盟

济宁能源:推动一体两翼战略,以资产数智化管理培育千亿产业

用友BIP

Tiamat携手火山引擎,让创作者的想象成为现实

火山引擎边缘云

边缘计算 火山引擎边缘计算 AIGC 边缘计算平台

AI赋能游戏开发,如何更好地处理随之而来的海量数据,更好地利用开发游戏?

龙智—DevSecOps解决方案

人工智能 AI 游戏

司库管理体系构建与价值创造

用友BIP

Autodesk Maya 2023中文版安装教程 附maya破解补丁 Mac/win

南屿

MindNode for mac思维导图 中文完美解锁版 支持M/Intel

南屿

软件开发

Geek_8da502

多功能fcpx视频剪辑软件:Final Cut Pro激活中文版

胖墩儿不胖y

Mac软件 视频编辑工具 视频编辑 编辑视频

1688商品评论数据接口(1688.item_review)

tbapi

1688商品评论接口 1688商品评价接口 1688商品评论API 1688评价接口 1688评论API接口

迪士尼视频下载工具Disney Plus +使用教程

南屿

【稳定性】浅谈11.11大促之预案演练 | 京东物流技术团队

京东科技开发者

京东商品详情数据接口(JD.item_get)丨京东API接口

tbapi

京东商品详情数据接口 京东API接口 京东商品数据接口 京东商品详情API接口

如何理解 RPC 与 Protobuf

Liam

gRPC 后端 网络协议 protobuf roc

2023年度华为云优秀开发者榜单揭晓,来看看你榜上有名吗?

华为云开发者联盟

程序员 开发者 华为云 华为云开发者联盟

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