DZone>Web Dev Zone>.NET分布式缓存中的Pub/Sub设计模式
.NET分布式缓存中的Pub/Sub设计模式
可扩展的、高性能的消息传递。
通过
-
6月19日,22日 - Web Dev Zone -教程
喜欢 (1)
评论
保存
鸣叫
230次浏览
加入DZone社区,获得完整的会员体验。
发布-订阅模式也被称为Pub/Sub,是构建企业级.NET应用程序的一个不可或缺的工具。为了恢复你的记忆,Pub/Sub是一种消息传递模式,消息的发送者(发布者)对目标接收者(订阅者)没有任何了解。此外,发布者和订阅者的应用程序并不直接互动,而是依赖于一个被称为主题的共同媒介。因此,这是一个松散耦合的消息传递模型。
现在,假设你有多个不同角色的应用程序部署在同一个架构中,它们需要一个机制来通知/告知对方某些事件。这些事件可以是瞬时的(由于运行时的变化)或数据库事件(由于数据库的变化)。这正是发布-订阅设计模式将帮助你启用分布式事件的地方。
启用分布式事件
为了设计一个分布式事件驱动的架构,开发人员传统上会转向使用下面的任何一种方法。
由RDBMS提供的数据通知
如果数据存储仅限于关系型数据库,使用数据库通知功能似乎是最好的可用选项。它允许你向数据库服务器注册你的兴趣,并在数据库结果集因更新、添加或删除而发生任何变化时通知你的应用程序。
然而,RDBMS 在本质上是不可扩展的,很容易成为应用程序的性能瓶颈。你不希望给你的数据库带来不必要的负担。此外,数据库通知功能本身就很慢,而且也不支持运行时数据共享。
现在你可能明白为什么使用数据库作为消息传递媒介不能成为你的应用程序的最佳设计选择。
消息传递队列
你的另一个选择是在你的架构中引入一个单独的消息传递队列。虽然这些消息队列在帮助你在应用程序之间传输消息方面做得很好,但这些队列并不以数据为中心,即它们不监测数据库或任何其他来源的数据变化。此外,这些消息队列不能与你的应用层一起扩展。
实施一个自定义的解决方案
留给你的最后一个选择是建立你的消息传递平台/媒介以满足你的需求。虽然这种空的沙盒一开始非常诱人,让你可以随心所欲地开发你的东西,但在时间和资源的要求上有其复杂性。虽然有可能,但建立和管理一个强大的、可扩展的消息传递平台是一项非常艰巨的任务。
现在的问题是,哪种解决方案容易纳入,可扩展,高度可用,而且还非常可靠。
分布式缓存作为一个消息传递平台
别担心,有一个简单的解决方案。一个更现代的方法是使用内存分布式缓存来整合一个强大的消息传递平台。NCache是市场上唯一真正原生的.NET/.NET Core分布式缓存。它是一个内存分布式缓存,速度极快且可扩展。它使你的应用程序能够处理极端的交易负载,而你的数据库不会成为瓶颈。你也可以用NCache 实时处理数据/流
NCache通常被部署在N层架构的中间层。请看下图,以便更好地理解。
图1:部署在N层架构中的NCache
NCache是一个缓存服务器集群,通过将经常使用的数据保存在内存中,为你的.NET应用程序和Java应用程序提供每秒数以万计的请求,并帮助避免大部分的数据库旅行。
让我们先看看NCache是如何通过其事件驱动的架构内在地适合作为一个消息总线的。
NCache事件驱动的消息传递
下图显示了NCache是如何充当.NET和Java应用程序的消息传递总线的。
图2:NCache作为一个消息传递平台
在这里,NCache通过采用快速紧凑的序列化实现了跨平台的通信,它将你的.NET或Java对象转换为二进制文件,然后将它们传输到缓存集群中。所以,这就是NCache如何让您的.NET应用程序与Java应用程序互动,反之亦然。想了解更多信息,请看可移植数据类型。
NCache以Events的名义管理Pub/Sub设计模式,并为您提供不同的方法来传播您的信息给其他监听的应用程序。让我们来看看这两种消息类型,看看分布式缓存如何传播它们。
首先,考虑你的应用程序需要监听的数据变化。由于NCache也是一个.NET的键值存储,它为您提供了在缓存中出现任何数据变化时更新应用程序的功能。因为所有这些都在内存中,所以不存在性能瓶颈。这些更新可以是。
- 缓存级别的项目变化,无论是更新还是删除。
- 整个缓存级别的数据变化。
- 连续查询,即注册一个类似于SQL的查询,以关注缓存中的结果集是否发生变化。如果它发生了变化,你的应用程序会被通知。
- 集群变化,如果任何新的节点被添加或删除,或崩溃。(用于管理)。
NCache还允许你注册对数据库的依赖关系,包括SQL、Oracle和OleDb。这有助于使你的缓存与数据库保持同步,从而使你的应用程序保持同步。关于支持的依赖关系类型的完整列表,请查看数据库的依赖关系。这些依赖关系是在不同的数据存储中注册的数据变化通知,但你让NCache来处理它。你也可以将数据库通知与NCache的数据通知结合起来,以丰富你的特定用例。
另一方面,如果你只想把简单的消息传播给复杂的.NET或Java对象,那么你应该使用自定义消息传递功能。在这里,一个应用程序可以产生数据并触发一个事件,而感兴趣的监听器将几乎即时地收到该事件。关于这方面的进一步信息,你可以参见自定义事件。
NCache Pub/Sub API
NCache提供了一个内存中的发布者/订阅者(Pub/Sub)功能和一个专门的Pub/Sub消息存储,以便在.NET网络应用中实现实时信息共享。我们将看到如何结合NCache和Pub/Sub来解决上述挑战,并最终帮助你的应用程序更好地交流。
Pub/Sub模型通过提供一个渠道,让感兴趣的用户发布和订阅信息,自然地将发布者和订阅者解耦。现在,当NCache作为一个消息总线时,Pub/Sub模型得益于NCache的底层分布式架构和众多方便的功能。
基本架构
闲话少说,让我们先来了解一下NCache Pub/Sub的基本组件和它们的工作。NCache Pub/Sub消息传递的一般流程是这样的--发布者使用ITopic接口在一个主题上发布消息。订阅者创建对一个或多个主题的订阅,并接收相关消息。在成功的消息传递中,NCache会收到确认信息。否则,NCache在消息过期前不断重试(如果过期被设置)。未送达的消息会在缓存中停留,直到触发和启用驱逐或过期。
图3:NCache的Pub/Sub消息传递
订阅类型
NCache为pub/sun消息传递提供了两种不同类型的订阅,即非持久性订阅和持久性订阅。此外,NCache还支持独占和共享订阅策略。下面将讨论相关的细节。
- ***非持久性订阅。***默认情况下,在一个主题上创建的所有订阅都是非持久性的订阅。它只向订阅者传达预定的消息,直到它保持连接。如果订阅者的连接由于任何原因而丢失,它在重新加入网络时不会收到旧的消息。这种类型的订阅是独家的,这意味着一个订阅属于一个用户。
- ***持久订阅。***它考虑到了用户断开连接时的消息丢失。NCache在连接断开时保留一个用户的订阅。因此,用户可以在重新连接时收到所发布的感兴趣的消息。持久订阅提供了两种策略。
- 独占。一个订阅同时属于一个活跃的订阅者。
- 共享的。一个订阅可以同时有一个以上的订阅者注册,并且负载是共享的。
开始使用NCahce Pub/Sub
让我们假设有一个电子商务商店,由不同的供应商定期向商店添加新产品。同时,产品上也提供销售和优惠。商店经理和对所提供的产品感兴趣的客户需要随时了解新产品、正在销售的产品和折扣的情况。NCache的Pub/Sub功能可以在这种情况下实现分布式通知系统。为此,可以先创建NCache专用的Pub/Sub消息商店。
让我们讨论一下在上述情况下通过使用NCache Pub/Sub Messaging API实现分布式消息传递的逐步过程。
创建一个主题
作为第一步,需要创建一个主题,在这里可以发布不同供应商的新产品更新。可以使用NCache的ITopic接口创建一个具有唯一名称的新主题。下面是发布者应用程序如何使用CreateTopic方法来创建一个名称为"...... "的主题。 newProducts.
C#
// Pre-condition: Cache is already connected
// Specify the topic name
string topicName = “newProducts”
// Create topic
ITopic topic = cache.MessagingService.CreateTopic(topicName);
如果一个提供名称的主题已经存在,那么该主题的实例将作为ITopic返回。
NCache允许在创建主题时设置主题的优先级。当某些事件需要以比其他事件更高的优先级被传达时,这很有用。例如,关于成品的信息是紧急的。同样,由于打折或销售,产品价格的更新对卖家/买家来说可能是最重要的。在这种情况下,主题的优先级可以在创建时设置为高,相关的通知可以毫无延迟地被收到。
发布消息
一旦创建了一个主题,发布者应用程序可以使用发布方法向该主题发布相关信息。为此,首先要通过指定主题名称获得一个主题的实例。NCache在发布消息时提供以下两种传递模式。
- **全部(默认)。**将信息传递给所有注册的订阅者。当信息需要被广播时,它是有用的。
- **任何模式。**将信息传递给任何一个注册的订阅者。
此外,为了有效地管理你的Pub/Sub缓存的存储空间,你也可以为信息设置到期时间。
在下面的代码中,关于新产品的信息是由一个发布者在已经存在的主题*newProducts*。
C#
// Pre-condition: Cache is already connected
// Topic "newProducts" already created
string topicName = "newProducts"
// Get the topic
ITopic productTopic = cache.MessagingService.GetTopic(topicName);
// Create the object to be sent in message
Product product = FetchProductFromDB(10248);
// Create the new message with the object order
var productMessage = new Message(product);
// Publish the order with delivery option set as all
orderTopic.Publish(productMessage, DeliveryOption.All, true);
订阅主题消息
一旦话题被创建,一个订阅者应用程序可以通过获得一个订阅来接收发布到该话题的消息。由于支持不同类型的订阅,对非持久性订阅感兴趣的订阅者可以使用CreateSubscription 方法。对于持久性订阅,可以使用CreateDurableSubscription 方法。
下面的代码显示了订阅者应用程序如何为该主题创建一个订阅 newProducts.MessageReceived ,回调被注册,以便在得到通知时执行任何预定的操作。例如,订阅者可以在收到销售通知时在MessageReceived 回调中更新产品价格。
C#
// Pre-condition: Cache is already connected
// Topic "newProducts" already created
string topicName = "newProducts"
// Get the topic
ITopic productTopic = cache.MessagingService.GetTopic(topicName);
// Create and register subscribers for topic newProducts
// MessageReceived callback is specified
ITopicSubscription orderSubscriber = orderTopic.CreateSubscription(MessageReceived);
在上面的例子中,一个非持久性的订阅被创建。此外,当需要在重新连接时接收订阅的主题/专题的旧消息时,订阅者可以创建一个持久订阅。
NCache还提供了一种基于模式的订阅方法,NCache支持多个通配符来订阅所提供模式下的单个/多个主题。
注册通知
NCache使发布者能够了解信息的状态和主题的可用性。发布者的应用程序可以注册以下通知。
- **MessageDeliveryFailure。**如果一个消息由于任何问题而未能交付,则通知发布者。
- **OnTopicDeleted。**当一条消息被删除时通知发布者。
下面是发布者如何简单地注册这两种类型的通知。
C#
// You have an instance productTopic of existing topic
// Register message delivery failure
productTopic.MessageDeliveryFailure += OnFailureMessageReceived;
//Register topic deletion notification
productTopic.OnTopicDeleted = TopicDeleted;
通过遵循上述步骤,一个基本的Pub/Sub消息架构可以被集成到任何ASP.NET/.NET Core应用程序。
结论
到此为止,你已经熟悉了NCache的Pub/Sub功能。让我们总结一下Ncache Pub/Sub为处理现有解决方案的限制提供了哪些好处。
- 由于线性可扩展性,NCache Pub/Sub可以通过增加缓存服务器和执行负载平衡来处理越来越多的订阅请求。规模的扩大对用户来说是透明的,不会妨碍通信过程。因此,你可以使用NCache Pub/Sub轻松地提高你的通信性能。
- NCache Pub/Sub促进了持久的订阅、消息交付退订和交付失败通知,以避免消息丢失。此外,NCache的分布式和复制式架构确保了NCache的高可用性,在动态环境中适应订阅者的连接。所有这些特点都确保了可靠的通信。
- 由于NCache是一个内存中的分布式缓存,驻留在缓存中的消息存储本身就是快速的。此外,NCache允许对驻留在缓存中的项目进行过期和驱逐,以智能地管理存储空间。
NCache的可扩展性、可靠性和存储效率,加上Pub/Sub的松散耦合和异步消息传递模式,使得NCache的Pub/Sub功能在未来的.NET/.NET Core应用程序中的分布式消息传递中具有很大的前景。
数据库 设计 分布式缓存 关系型数据库 应用 缓存(计算) 数据(计算) 交付(商业) .NET
经Nandkishor Yadav许可发表于DZone。在此查看原文。
DZone贡献者所表达的观点属于他们自己。
DZone上的热门文章
评论