在多个高事务服务器应用程序需要相互通信的环境中,为它们找到最佳的通信通道非常重要。发布者/订阅 (PubSub) 模型是为应用程序提供通信平台时最流行的方法之一。我们都知道这些媒介有什么共同点;多个客户端发布消息,多个客户端可以订阅消息。这一切都以极其解耦的方式发生,这意味着发布者不会将消息直接部署到订阅客户端。相反,消息总线用作所有客户端进行通信的中间通道。
简而言之,PubSub 消息传递是一种发布者和订阅者都不知道彼此身份的方法。
让我们花点时间考虑一下当发布者和订阅者数量增加时会发生什么。该数字越大,消息传递负载就越大。这种情况会导致您的 PubSub 平台出现可扩展性瓶颈,从而违背了引入解耦消息传递接口的主要目的。
让我们看看一个解决方案,它不仅继承了 pub/sub 的一般工作方式,而且还添加了许多其他功能以方便您使用; 一种快速且可扩展的方法。
NCache 更多信息 NCache 发布/子文档 Scale Pub/Sub 消息传递-网络研讨会
运用 NCache 内存中 PubSub
NCache 为您的 .NET 应用程序提供快速、灵活、最具线性可扩展性的分布式缓存。
运用 NCache 因为如果您计划随时随地扩展您的应用程序,您的事件驱动的 PubSub 平台可能会非常有益。它可以防止系统中出现任何瓶颈。
就是这样 NCache 充当应用程序的消息总线:
NCache 充当 Pub/Sub 实现的中间接口。 该图说明不仅一个而且多个客户端可以一次订阅一个或多个主题。
任意数量的应用程序都可以连接到缓存并开始在 NCache 服务器。 这些消息然后被不同的客户根据他们的要求订阅。 通过 NCache,您可以决定是所有订阅者还是只有一个订阅者可以接收发布的消息。 通过这样做, NCache 充当 .NET 服务器应用程序的消息传递总线。
NCache 更多信息 发布/订阅 NCache 发布/订阅事件
快速 PubSub 示例 NCache
假设我有一个全球玩家都在使用的在线游戏应用程序。 在我的应用程序中,我有一个功能,它不仅包含音频通信,还包含运行时消息。 多个玩家同时向一个频道和他们自己的团队玩家发送消息。
考虑到玩游戏的玩家数量,消息负载将是巨大的。 我需要的是一个可以提高游戏性能的通信接口。 为此,我更喜欢 NCache 作为我游戏的消息总线。
以下是我用来实现服务器应用程序可以发布和接收消息的场景的片段。 此代码显示了如何获取主题并针对它发布消息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Precondition: Cache is already connected // Get the topic ITopic teamChat = cache.MessagingService.GetTopic("RuntimePlayerComms"); // Create the object to be sent in message // Get information of the player through player ID Player teamLeader = FetchInfo(1); // Create the message var newChatMessage = new Message(teamLeader); // Set the expiration time of the message newChatMessage.ExpirationTime = TimeSpan.FromSeconds(60); // Publish the message with delivery option set to All subscribers teamChat.Publish(newChatMessage, DeliveryOption.All, true); |
一旦针对某个主题发布了消息,订阅者就会针对该主题创建订阅以接收消息。 以下代码演示了订阅应用程序如何订阅某个主题以接收所需的消息。
1 2 3 4 5 6 7 8 9 |
// Precondition: Cache is already connected // Get the topic ITopic teamChat = cache.MessagingService.GetTopic("RuntimePlayerComms"); // Create and register subscribers for the topic // MessageReceived is the callback through which the message is delivered ITopicSubscription subscriber = teamChat.CreateSubscription(MessageReceived); |
到目前为止,我只讨论了 pub/sub 的一般工作,但你真正需要知道的是额外的长度 NCache 去满足你的需要。
你想知道我之前喊出的那些“其他功能”是什么吗? 让我们直接了解由 NCache.
独家持久订阅
通常,当客户端订阅某个主题时,该订阅称为非持久订阅,这意味着如果客户端与服务器断开连接,其所有订阅都将丢失。
NCache 为您提供持久订阅。 在这种情况下,即使服务器和客户端之间的连接中断,该客户端的所有订阅仍保持不变。 因此,当客户端重新连接时,它会接收订阅者断开连接时发布的所有消息。
在应用程序中执行此场景的方式很简单。 您在应用程序中添加以下代码行以实现独占持久订阅。
1 2 3 4 5 6 7 8 |
// Create and register subscribers for the topic // MessageReceived callback is specified // The subscription policy is Exclusive IDurableTopicSubscription subscriber = teamChat.CreateDurableSubscription("RuntimePlayerComms", SubscriptionPolicy.Exclusive, MessageReceived, TimeSpan.FromMinutes(20)); |
只要连接处于活动状态,就没有新客户端可以订阅该订阅。 如果此连接中断,则保留消息,并在重新建立连接时将它们发送到客户端。 这样做是为了不会丢失任何消息。
共享持久订阅
除了独占订阅,持久性也可以通过共享订阅来实现。 在这种订阅类型中,一个以上的客户可以订阅一个订阅。 这服务于负载分担的目的。
共享订阅使用循环方法向所有连接的客户端发送消息。 因此,即使客户端断开连接,消息也会继续在剩余的订阅者之间分发。
只要有一个客户端连接到订阅,订阅就会保持活动状态。 以下代码是我的在线游戏应用程序如何实现共享的持久订阅。
1 2 3 4 5 6 7 8 9 |
// Create and register subscribers for the topic // MessageReceived callback is specified // The subscription policy is Shared IDurableTopicSubscription subscriber = teamChat.CreateDurableSubscription("RuntimePlayerComms", SubscriptionPolicy.Shared, MessageReceived, TimeSpan.FromMinutes(20)); |
默认情况下,这些订阅是独占的,每个订阅只允许一个订阅者。
基于模式的订阅
有时,不是逐个订阅命名订阅,而是提供一种模式,在该模式下,所有当前和未来的主题都被一次性订阅。 为了适应这种情况, NCache 通过提供基于模式的订阅为其客户提供便利。 通过这种方法,可以轻松订阅一个或多个属于所提供模式的主题。
了解支持的通配符种类 NCache的PubSub订阅,请参考 NCache 文档 基于模式的订阅.
以下是我如何在游戏应用程序中使用基于模式的通配符的示例片段。
1 2 3 4 5 6 |
// Only ? * [] wildcards supported string topicName = "team*"; string subscriptionName = "TeamPlayersComms"; // Get the topic ITopic teamChat = cache.MessagingService.GetTopic(topicName, TopicSearchOptions.ByPattern); |
为什么 NCache 对于发布订阅?
为什么青睐 NCache,你可能会问? 好… NCache is
- 快,因为它是一种内存解决方案。
- 线性可扩展,因为您可以在运行时添加额外的服务器; 随时。
- 灵活,因为它无需任何客户端干预即可动态自动重新平衡数据。
我的看法 NCache 提供最佳、最具可扩展性和最快的方式来适应应用程序中的消息通信。 事实是 NCache 是一种内存中的分布式缓存解决方案,足以应对由于消息负载而可能出现的任何瓶颈。 现在,这是您在 .NET 应用程序中需要的双赢局面。