选择是否使用消息或事件

假设你正在规划分布式音乐共享应用程序的体系结构。 同时想要确保应用程序尽可能可靠且可缩放,并且打算使用 Azure 技术来构建强大的通信基础结构。

必须先了解应用程序组件交换的各个通信,方可选择正确的 Azure 技术。 可以为每个通信选择不同的 Azure 技术。

关于通信,首先要了解的是它是发送消息还是发送事件。 这是一项基本选择,有助于选择要使用的相应 Azure 服务。

Azure 中的通信策略 (API)

什么是消息?

在分布式应用程序的术语中,消息具有以下特征:

  • 消息包含由一个组件生成的原始数据,该数据将由另一个组件使用。
  • 消息本身就包含该数据,而不仅仅是对该数据的引用。
  • 发送组件期望目标组件以特定方式处理消息内容。 整个系统的完整性可能取决于执行特定作业的发送方和接收方。

例如,假设一位用户使用移动音乐共享应用上传新歌曲。 该移动应用必须将该歌曲发送到在 Azure 中运行的 Web API。 必须发送歌曲媒体文件本身,而不仅仅是指示已添加新歌曲的警报。 该移动应用期望 Web API 将新歌曲存储在数据库中,并使其可供其他用户使用。 这是一个消息示例。

什么是事件?

相比消息而言,事件并不是很重要,最常用于广播通信。 发送事件的组件称为“发布者”,接收方则称为“订阅者”。

对于事件,接收组件通常会决定他们感兴趣的通信,并将“订阅”这些通信。 订阅通常由 Azure 事件网格或 Azure 事件中心等中介管理。 当发布者发送事件时,中介将该事件路由到感兴趣的订阅者。 这称为“发布-订阅体系结构”。 它不是唯一的事件处理方法,但却是最常用的。

事件具有以下特征:

  • 事件是一个轻量通知,表明发生了某些事情。
  • 可以将事件发送到多个接收方或根本不发送到任何接收方。
  • 事件通常旨在为每个发布者“扇出”或提供大量订阅者。
  • 事件发布者对接收组件所采取的操作没有任何期望。
  • 某些事件是离散单元,与其他事件无关。
  • 某些事件是相关和有序系列的一部分。

例如,假设已完成音乐文件上传并且已将新歌曲添加到数据库中。 为了通知用户存在新文件,Web API 必须通知 Web 前端和移动应用用户存在新文件。 用户可以选择是否收听新歌,因此初始通知不包括音乐文件,而只通知用户该歌曲存在。 发送方并不期望事件接收方在接收到此事件后执行任何特别的操作进行响应。

这是一个离散事件示例。

如何选择消息或事件

单个应用程序可能会将事件用于某些目的,而将消息用于其他目的。 在选择之前,必须分析应用程序的系结构及其所有用例,以便确定其组件相互通信的所有不同目的。

事件更有可能用于广播,并且通常是短暂的,这意味着如果没有订阅者,通信可能不由任何接收方处理。 如果分布式应用程序要求保证通信得到处理,则更有可能使用消息。

对于每个通信,请考虑以下问题:发送组件是否期望目标组件以特定方式处理通信?

如果答案是肯定的,请选择使用消息。 如果答案是否定的,可以使用事件。

了解组件通信所需的方式将有助于选择组件的通信方式。 首先来使用消息。

知识检查

1.

假设你具有分布式应用程序,其中的 Web 服务可对用户进行身份验证。 用户登录时,Web 服务会通知所有客户端应用程序,因此它们可将用户的状态显示为“联机”。 登录通知是消息示例还是事件示例?

2.

假设你具有分布式应用程序,其中的 Web 服务让用户可以管理自己的帐户。 用户可以注册、编辑配置文件并删除帐户。 当用户删除帐户时,你的 Web 服务会通知数据层,用户的数据则会从数据库中删除。 这类帐户删除通知是消息示例还是事件示例?