缓存中的 Pub/Sub 消息传递:概述
这种发布/订阅(Pub/Sub)消息传递模式提供了一个中间通道(称为主题),用于在多个应用程序之间交换消息,而无需发送方(发布者)和接收方(订阅者)直接耦合。发布者应用程序通过主题向订阅者应用程序发送消息。由于所有发布/订阅模型都需要一个通信通道, NCache 它作为主题的媒介,发布者可以通过该主题发布消息。订阅者则通过该主题收到通知。通过利用 NCache 作为消息总线,应用程序无需直接耦合即可实现高可用性和可扩展性,允许发布者实时向数千名订阅者广播事件。除了分布式缓存之外, NCache 还提供了专门的 Pub/Sub 消息缓存.
重要提示
我们建议使用专用的 Pub/Sub 缓存,原因如下:
赶出:如果缓存包含消息和缓存项,频繁驱逐缓存项也可能会在将消息转发给订阅者之前将其删除。
状态转移:状态转移会增加每个缓存项操作的成本。 由于消息经常发布、中继和过期,因此这种经常性的活动可能会触发状态转移,因此代价高昂。
为什么要在分布式架构中使用发布/订阅消息传递?
实时事件需要在事件驱动的分布式架构中的不同应用程序之间共享通知。 Pub/Sub 模式使发布者能够与订阅者共享事件,以便在感兴趣的事件发生时进行任何所需的处理。
例如,一组订阅者可能对订单发货详情感兴趣,以便处理这些信息来跟踪订单的配送情况。因此,他们会订阅一个用于转发订单详情消息的主题。一旦发布者在该主题上发布消息,订阅者就会收到通知,并收到包含订单详情的消息,以便在其端进行进一步处理。
核心组件 NCache 发布/订阅模式
的基本组成 NCache 下面列出了发布者订阅者(Pub/Sub)模型,稍后将详细讨论:
主题: 发布消息的地方。
出版商: 向 Topic/Topics 发布消息的应用程序(Web 应用程序、桌面应用程序、微服务)。
订户: 有兴趣从 Topic/Topics 接收消息的应用程序。
订阅: 为订阅者创建以接收预期消息的感兴趣实体。
信息: 发布者发送的实际数据对象以及订阅者通过主题接收的实际数据对象。
主题 NCache
发布者在主题上发布消息。订阅者订阅主题以接收消息。此主题以分布式形式存在于 NCache因此,它的创建发生在所有集群节点上。它包含消息存储,用于存储发布者在队列中发布的实际数据对象。它还在内部维护所有订阅它的订阅者列表以及发布者列表。 ITopic/Topic 接口有利于 主题创建, 话题获取和 主题删除。 您也可以 异步删除主题 以避免等待主题被删除。
注意:
主题和底层消息的分布式特性增强了可扩展性。
一旦消息发布到主题,就会触发一个事件,主题会根据订阅者的偏好将该事件转发给订阅者。 消息传递选项 以便他们能够根据需要获取消息。下图说明了主题作为发布者和订阅者的中介渠道的作用:
注意:
当订阅者暂时断开连接然后自动重新连接时,与主题相关的所有信息(例如订阅和失败事件通知)都将重新注册到主题,而不会在订阅者端造成任何中断。
主题优先级
NCache 引入了主题级优先级,允许您根据主题的重要性为其分配相对优先级。如果需要发布重要消息,您可以创建优先级较高的主题,这样这些消息就会优先传递。同样,如果主题发布的是不太重要的消息,您可以创建优先级较低的主题,缓存会优先清除这些消息。您只需设置即可。 主题级别优先级 在创建主题时,以便优先传递关键消息。
重要提示
Topic 的优先级只能在创建 Topic 时指定,之后无法修改。
主题删除通知
要接收主题删除通知,您的应用程序需要注册 OnTopicDeleted 事件主题删除后,缓存中的所有消息及相关元信息都会被删除。因此,订阅者和发布者会收到删除通知,原因如下:
- 订阅者可能正在等待已注册主题的消息。一旦主题被删除,订阅者就可以通过事件通知来处理其执行,避免无限等待的状态。
- 发布者可以避免向不存在的主题发送消息,并相应地处理任何待处理的消息和未来的执行。
向主题发布消息
发布者可以 向主题发布消息 通过指定主题名称。可以异步批量发布消息,以提高应用程序性能。分区缓存在集群中分发消息。对于消息路由,每条消息都有一个唯一的 ID,称为 MessageID 在发布者端,以及哈希码 MessageID 确定存储消息的集群节点。 NCache 允许发布者在发布消息时使用以下属性。
注意:
NCache 允许在一次调用中发布大量消息以提高性能和内存使用率。
消息传递选项: 发布者可以决定是在发布时将消息传递给单个订阅者还是广播给所有订阅者 消息传递选项.
消息传递失败通知: 发布者可以 注册 MessageDeliveryFailure 如果特定消息未能传递,则获得通知。 这些交付失败场景在 消息分配和传递到订阅 部分。
重要提示
消息传递失败通知仅针对过期消息。
- 主题删除通知: 出版商可以注册 主题删除通知 防止Topic删除后相应消息被不当发布。
订阅主题
订阅者应用程序可以 订阅主题消息 通过订阅的方式注册到感兴趣的主题。在发布/订阅模式下,订阅代表订阅者对特定主题的兴趣。
注意:
如果将新节点添加到缓存集群并触发状态传输,则所有订阅以及消息和缓存数据都将复制到新节点。
NCache 允许用户通过提供主题名称或模式来订阅主题。有关详细信息,请参阅 订阅方式. 此外,您还可以设置 消息传递模式 在创建订阅时同步或异步。 NCache 提供多种类型的 Pub/Sub 订阅,讨论如下。
订阅及其类型
订阅 NCache 可分为以下几类:
耐用
注意:
持久订阅是一种命名订阅。
在一个 持久订阅缓存可确保订阅者在应用程序/机器关闭、重启或网络故障导致连接中断的情况下,不会错过任何消息。因此,持久订阅不会因订阅者连接中断和重新连接而受到影响。
注意:
除非订阅者正确取消订阅,否则不会删除持久订阅。
如果订阅者断开连接,发送给该订阅者的消息将存储在服务器上,直到订阅者重新加入或消息过期。除非订阅者已正确取消订阅,否则持久订阅不会在订阅者断开连接时自动删除。持久订阅进一步分为:
共享: 共享持久订阅意味着多个订阅者共享一个命名订阅。分配给共享订阅的消息随后以循环方式在订阅者之间进行负载平衡。即使任何订阅者离开网络,消息仍会继续传递给活跃订阅者。因此,如果订阅者在分配后正常或突然离开,其分配的消息将重新分配给其他活跃订阅者。
重要提示
共享订阅仅受持久订阅支持。
在共享订阅中,订阅将保留在主题上,并且只有在所有订阅者都取消订阅后才能取消订阅。这意味着只要有一个活跃订阅者,订阅就会保持活跃状态。
- 独家: 独占持久订阅意味着每次只有一个活跃订阅者注册订阅。如果订阅者正常取消订阅,独占订阅可以分配给新订阅者。如果订阅者突然离开,等待一段空闲时间后,新的订阅请求将被接受。即使没有订阅者,分配的消息也会一直保留在那里。
不耐用
在一个 非持久订阅订阅者仅在保持连接期间接收发送给他们的消息。如果订阅者离开网络,则在断开连接期间将不会收到任何发布的消息。非持久订阅默认为独占订阅。
重要提示
如果订阅者应用程序重新启动,订阅者将会丢失消息。
此外,非持久订阅在订阅者离开网络时会自动删除。这意味着如果该订阅者重新加入或再次建立连接,它将被视为新订阅。
持久订阅到期
您还可以 设置持久订阅的到期日期 在一段时间不活动之后,例如,长时间没有活跃订阅者。订阅到期后,分配给此订阅的消息将根据 DeliveryOption 这些消息。
注意:
每次订阅者轮询或执行任何其他活动时,订阅的到期时间都会重置。
处理非活动订阅
注意:
只有非持久订阅才会被标记为非活动状态,而这不适用于持久订阅。
如果在等待一定的非活跃期后没有活跃的订阅者反对订阅,则认为订阅过期。 如果订阅者在非活动期间断开连接后重新加入,它将能够接收其分配的消息。
重要提示
应处理非活动订阅以避免服务器端内存过载。
等待非活动期后,订阅过期,其分配的消息将重新分配给其他订阅。 消息的重新分配取决于消息的传递选项。
如果分配给订阅 A 的消息的传递选项设置为 ALL,并且在订阅 A 过期之前已将其分配给另一个订阅 B,则不需要重新分配。
如果分配给订阅的消息的传递选项设置为 ANY 并且订阅过期,则分配的消息将始终重新分配给任何其他订阅。
留言
消息包含由发布者发送并通过主题传递给订阅者的实际数据对象。发布者在主题上发布消息后,注册的订阅者会收到通知,告知他们感兴趣的消息已发布。如果有多条消息,则这些消息将按顺序存储在特定主题的队列中。本文将进一步讨论消息分配给订阅者、消息传递和确认机制。
注意:
同一条消息可以分配给多个主题。通过自动生成的 ID 进行唯一标识。
消息分配和传递到订阅
最初,消息在服务器端未分配。所有订阅都根据 DeliveryOption一旦发生订阅分配,订阅者就会收到通知。然后,订阅者会实现轮询机制来批量获取多条消息,从而减少服务器端开销。收到消息后,订阅者会发送确认,消息即视为已送达。
注意:
如果没有订阅者接收消息,则消息将存储在主题中。一旦第一个订阅者订阅了主题,消息就会被分配并传送给该订阅者。
消息传递选项
发布者需要指定消息传递选项,以决定消息是发送给单个订阅者还是在发布时广播给所有订阅者。需要注意的是,成功传递的定义取决于指定的传递选项。以下将讨论两种传递选项及其对应的成功传递标准:
全部传感器 : 所有注册用户都会收到消息。当所有用户都确认收到消息后,消息就会被删除。
任何: 任何单个注册订阅者都会收到消息。 如果指定的订阅者未发送确认,消息将重新分配给下一个订阅者。 如果他们确实发送了确认,则消息被视为已成功传递。
注意:
如果消息根据指定的传递选项成功传递,则将其从缓存中删除。
消息存储和分发
以下是缓存中消息存储和分发的重要方面:
消息根据拓扑分布在节点之间。
对于分区-副本和分区拓扑,使用基于哈希的分布。
对于复制拓扑,消息被复制到集群缓存的所有节点。 然而,协调节点负责消息操作。
对于镜像拓扑,消息被发布到主动节点,然后相应地复制到被动节点。
如果消息存储接近逐出,则会记录一个事件,指示消息存储已满并开始逐出。
消息在缓存内存上有开销。 因此,在计算缓存大小时必须考虑消息大小。
消息行为
在这里,我们讨论在以下情况下消息的预期行为:
在清除缓存时: 清除缓存后,消息将与缓存项一起删除。
缓存重启时: 与清除缓存类似,缓存重启后,缓存内容也会被清除,包括所有主题及其包含的消息。
驱逐: If 赶出 在 Pub/Sub 缓存上启用,数据将首先被驱逐,然后消息将被驱逐。
状态转移: 在状态转移的情况下,当消息移动到集群中的另一个节点时,最终存储消息的节点负责传递。
消息传递失败通知
重要提示
已注册接收消息传递失败通知的发布者,在消息过期后尚未发送给任何订阅者时,会收到通知。
如果消息未分配或传递给任何订阅者,则视为失败。 当订户不存在或由于网络故障而处于非活动状态时,可能会发生这种情况。 在这种情况下,发布者可以 注册消息传递失败通知需要注意的是,投递失败通知仅针对过期的消息。如果消息在投递给任何订阅者之前过期,则认为该消息投递失败。
注意:
如果某个主题有多个发布者,则故障通知将被发送给任何已注册故障通知的活跃发布者。
消息过期
与缓存项目类似,发布者可以 设置消息的过期时间。 一旦超过过期间隔,消息就会从缓存中过期,并使用相同的清理间隔机制。
消息的过期时间决定了它在缓存中保留的时间。 无论是否投递,如果消息未投递,它将在过期时间后被删除。 如果消息在过期前成功传递,则不等待过期时间就将其从缓存中移除。
有序消息
NCache 现在支持在客户端维护消息顺序的有序消息。 发布者可以 发布有序消息 通过为一组消息指定序列名称,可以实现消息的有序化。消息会按照发布顺序传递给订阅者。对于同一链的有序消息,序列字符串必须相同。利用序列字符串,所有消息都通过位置亲和性机制驻留在同一节点上。以下是有序消息的重要特性:
注意:
同步传递模式可用于有序消息。
来自具有相同序列的发布者的消息驻留在单个缓存节点上。
如果
DeliveryOption设置为 Any 时,所有相同序列的有序消息都投递给同一个订阅者。 如果特定订户失去连接或变得不可用,则为此目的重新分配新订户。 但是,如果DeliveryOption设置为 All,则所有相同序列的有序消息都会传递给所有订阅者。在状态转移的情况下,有序消息可能会丢失其顺序并在不保持顺序的情况下发布。
有序消息只能使用 Publish API 中的 Sync 模式发布。 不支持批量和异步 API 调用。
监控
NCache 为您提供监控 Pub/Sub Topic 统计数据和观察各种 性能计数器 在这方面。可以通过 Windows PerfMon 计数器 和 命令行工具.
可靠性和高可用性
NCache 实现消息传递的确认机制。消息将保留在内存中,直到根据 至少一次交货 标准。 因此, NCache 确保分布式架构中 Pub/Sub 消息传递的消息传递可靠性。
此外,最多一个节点的容错 分区副本拓扑 使 Pub/Sub 消息存储具有高可用性。 如果节点出于任何原因离开集群,则副本具有消息备份。
在本节中
发布/订阅主题
解释如何创建、获取和删除 Pub/Sub 模型中的主题 NCache.
向主题发布消息
解释如何创建主题并向其中发布消息。
订阅主题
解释如何订阅主题并接收感兴趣的消息。
发布/订阅事件
解释 Pub/Sub 事件以通知发布者和订阅者有关缓存和应用程序中发生的各种事件。