缓存中的 Pub/Sub 消息传递:概述
这种发布/订阅(Pub/Sub)消息传递范式提供了一个中间通道(称为主题)来在多个应用程序之间交换消息,而无需发送者(发布者)和接收者(订阅者)的任何知识。 发布者应用程序通过主题向订阅者应用程序发送消息。
由于所有 Pub/Sub 模型都需要一个通信渠道, NCache 充当主题的媒介,以便发布者向主题发布消息。 订阅者通过主题接收消息作为通知。 使用 NCache 作为主题的媒介确保模型内的松散耦合并允许增加抽象,为分布式主题提供额外的好处。
除了分布式缓存, NCache 还提供了专门的 Pub/Sub 消息缓存.
重要
我们建议使用专用的 Pub/Sub 缓存,原因如下:
赶出:如果缓存包含消息和缓存项,频繁驱逐缓存项也可能会在将消息转发给订阅者之前将其删除。
状态转移:状态转移会增加每个缓存项操作的成本。 由于消息经常发布、中继和过期,因此这种经常性的活动可能会触发状态转移,因此代价高昂。
为什么发布/订阅消息很重要
实时事件需要在事件驱动的分布式架构中的不同应用程序之间共享通知。 Pub/Sub 模式使发布者能够与订阅者共享事件,以便在感兴趣的事件发生时进行任何所需的处理。
例如,一组订阅者可能对有关订单发货详细信息的信息感兴趣,以便他们可以处理该信息以跟踪订单交付。 因此,他们将订阅一个转发订单详细信息消息的主题。 一旦发布者发布了有关该主题的消息,订阅者将收到通知并接收包含订单详细信息的消息,以便在其端进行进一步处理。
发布/订阅组件
的基本组成 NCache 下面列出了发布者订阅者模型,稍后将详细讨论:
主题: 发布消息的地方。
出版商: 将消息发布到主题/主题的应用程序(Web 应用程序、桌面应用程序、微服务)
订户: 有兴趣从主题/主题接收消息的应用程序。
订阅: 为订阅者创建以接收预期消息的感兴趣实体。
信息: 发布者通过主题发送和订阅者接收的实际数据对象。
话题
发布者发布有关该主题的消息。 订阅者订阅主题以接收消息。 该主题以分布式形式存在于 NCache. 因此,它的创建发生在所有集群节点上。 它包含消息存储,它存储发布者在队列中发布的实际数据对象。 它还在内部维护所有订阅它的订阅者列表和发布者列表。
ITopic/Topic
接口有利于 话题创作, 主题获取及 话题删除。 您也可以 异步删除主题 避免等待主题被删除。
备注
主题和底层消息的分布式特性增强了可扩展性。
一旦将消息发布到主题,它就会触发一个事件,主题根据偏好将其转发给订阅者 消息传递选项 以便他们可以根据需要获取消息。 下图说明了主题作为发布者和订阅者的中介渠道的作用:
备注
如果订阅者暂时断开连接,然后自动重新连接,与主题相关的所有信息(例如订阅和失败事件通知)都会重新注册到该主题,订阅者端不会发生任何中断。
主题优先级
NCache 引入了主题级别的优先级,可帮助您根据主题的重要性确定最低和最高优先级主题的优先级。 如果他们需要发布关键消息,您可以创建具有更高优先级的主题。 因此,首先传递这些消息。 同样,如果主题发布不重要的消息,您可以创建优先级较低的主题。 缓存将首先驱逐这些消息。
重要
主题的优先级只能在创建主题时指定,之后不能修改。
您可以简单地设置 主题级优先级 在创建主题时,以优先处理关键消息的传递。
主题删除通知
主题删除时,缓存中的所有消息和相关元信息都会被删除。 因此,订阅者和发布者会因以下原因收到此删除的通知:
- 订阅者可能正在等待来自注册主题的传入消息。 一旦主题被删除,订阅者就可以通过事件通知来相应地处理其执行,避免无限等待状态。
- 发布者可以避免向不存在的主题发送消息,并相应地处理任何待处理的消息和未来的执行。
要接收主题删除通知,您的应用程序 注册 OnTopicDeleted 事件.
向主题发布消息
发布者可以 向主题发布消息 通过指定主题名称。 消息可以异步批量发布,以提高应用程序性能。 分区缓存在集群中分发消息。 对于消息路由,每条消息都有一个唯一的 ID,称为 MessageID
在发布者端,以及哈希码 MessageID
确定存储消息的集群节点。
备注
NCache 允许在一次调用中发布大量消息以提高性能和内存使用率。
NCache 允许发布者在发布消息时使用以下属性。
消息传递选项: 发布者可以决定是在发布时将消息传递给单个订阅者还是广播给所有订阅者 消息传递选项.
消息传递失败通知: 发布者可以 注册 MessageDeliveryFailure 如果特定消息未能传递,则获得通知。 这些交付失败场景在 消息分配和传递到订阅 部分。
重要
消息传递失败通知仅针对过期消息。
- 主题删除通知: 出版商可以注册 主题删除通知 防止主题删除后不当发布相应消息。
订阅主题
订阅者应用程序可以 订阅主题消息 通过订阅将自己注册到感兴趣的主题。 在 Pub/Sub 中,订阅表示订阅者对特定主题的兴趣。
备注
如果将新节点添加到缓存集群并触发状态传输,则所有订阅以及消息和缓存数据都将复制到新节点。
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 统计数据和观察各种 性能计数器 在这方面。 Pub/Sub 主题活动和状态可以通过 Windows PerfMon 计数器 和 命令行工具.
可靠性和高可用性
NCache 实现消息传递的确认机制。 消息保存在内存中,直到它们根据 至少一次交货 标准。 因此, NCache 确保分布式架构中 Pub/Sub 消息传递的消息传递可靠性。
此外,最多一个节点的容错 分区副本拓扑 使 Pub/Sub 消息存储具有高可用性。 如果节点出于任何原因离开集群,则副本具有消息备份。
在本节中
发布/订阅主题
解释如何创建、获取和删除 Pub/Sub 模型的主题 NCache.
向主题发布消息
提供创建主题并向其发布消息的示例代码。
订阅主题
提供示例代码以订阅主题并接收感兴趣的消息。
发布/订阅事件
解释 Pub/Sub 事件以通知发布者和订阅者有关缓存和应用程序中发生的各种事件。
监控 Pub/Sub 主题
描述可以通过以下方式监控 Pub/Sub 统计信息的方式 NCache 监视器、PerfMon 和命令行工具。