编译|朱宪忠策划|Ethan在日常开发中,我们通常会在同一个架构中部署多个不同角色的应用程序,这些应用程序需要一些机制来通知对方发生了什么事件。这些事件可能是暂时的(在运行时临时进行的更改)或数据库事件(由于数据库中的更改)。如何处理如此复杂多变的分布式事件一直是一个比较棘手的问题。而这就是发布-订阅设计模式的用武之地。众所周知,发布-订阅模式可能是众多设计模式中最常见和最著名的一种。它定义了一对多的关系,允许多个订阅者对象同时监听一个主题对象。当主题对象的状态发生变化时,它会通知所有订阅自己的订阅者对象,让他们自动更新自己。在“发布-订阅”消息范式中,消息的发送者(发布者)不知道预期的接收者(订阅者)。此外,发布者和订阅者应用程序不直接交互,而是依赖于称为“主题”的公共媒介。因此,发布-订阅模式是一种松散耦合的消息传递cdxxd模型。正是基于这些特点,发布-订阅模型(简称“发布/订阅”)成为构建企业级.NET应用程序不可或缺的工具。探索分布式事件驱动架构要设计分布式事件驱动架构,开发人员历来倾向于采用以下选项之一。1、RDBMS提供数据通知如果数据存储仅限于关系型数据库,数据库通知功能确实可以做到。除了允许向数据库服务器注册事件外,此功能还可以在数据库结果集因更新、添加或删除而发生变化时通知应用程序端。但这里有个问题,RDBMS天生不可扩展,很容易成为应用程序的性能瓶颈。通常,开发人员不想让数据库承担不必要的额外任务。此外,数据库通知功能本身很慢,并且不支持运行时数据共享。这使得很容易理解使用数据库作为消息传递媒介并不是最佳设计选择。2.消息队列的另一种选择是在架构中引入一个单独的消息队列。虽然这些消息队列在帮助您在应用程序之间传输消息方面做得很好,但这些队列不是以数据为中心的,即它们不监视数据库或任何其他来源的数据更改。此外,这些消息队列无法随应用层扩展。3.定制解决方案剩下的最后一个选项是创建一个适合您需求的消息传递平台。定制解决方案的想法乍一看很诱人,但就所需的时间和资源而言可能很难估计,因为构建和管理一个强大且可扩展的消息传递平台可能是一项艰巨的任务。问题的症结在于:哪种解决方案更加整合、可扩展、高度可用且非常可靠?使用分布式缓存作为消息平台这里分享一个分布式缓存消息平台NCache。事实证明,这不仅是一个简单可行的解决方案,而且还是一种集成强大消息传递平台的更现代的方式。NCache是目前市场上唯一真正的原生.NET/.NET内核分布式缓存。它是一种内存中分布式缓存技术,速度极快且可扩展性极强。它使应用程序能够处理极端的事务负载,而数据库不会成为瓶颈。此外,您还可以使用NCache实时处理数据/流。NCache通常部署在N层架构的中间层。下图更直观的展示了它的架构层次。图1:部署在N层架构中的NCacheNCache是??一个缓存服务器集群,可以为.NET应用程序和Java应用程序提供每秒数万次的请求——通过将频繁使用的数据保存在内存中,可以有效避免大量请求数据库访问。接下来深入分析NCache。首先,让我们看看NCache如何作为事件驱动架构的消息总线工作。1.NCache事件驱动消息下图显示了NCache如何作为.NET和Java应用程序的消息总线。图2:作为消息传递平台的NCache在上述架构中,NCache通过使用快速紧凑序列化将.NET或Java对象转换为二进制文件,然后将它们传输到缓存集群,从而实现跨平台通信。因此,这给出了NCache如何支持.NET应用程序和Java应用程序之间交互的内部逻辑。有关这方面的更多信息,请自行研究可移植数据类型。NCache以事件的名义管理发布/订阅设计模式,并提供不同的方式将消息传播到其他监听应用程序。让我们看看这两种消息类型,以了解分布式缓存如何传播它们。首先,考虑应用程序需要监听的数据变化。由于NCache还使用.NET键值存储技术,它提供了在缓存中的任何数据发生变化时更新应用程序的能力。因为这一切都发生在内存中,所以不存在性能瓶颈。这些数据变化可以是:缓存级别的项目变化,是更新还是删除整个缓存级别的数据变化连续查询,你在其中注册一个类似SQL的查询来监视缓存中的结果集是否发生了变化。如果是这样,如果集群由于任何新节点添加或删除或崩溃而发生更改,则会通知应用程序。(用于管理)NCache还允许数据库依赖注册,包括SQL、Oracle和OleDb。这有助于使数据库和应用程序的缓存数据保持最新。完整的支持的依赖类型列表请查看数据库依赖内容,这里不再赘述。这些依赖项在不同的数据存储中注册数据更改通知;但是,可以让NCache处理它。您还可以将数据库通知与NCache数据通知相结合,以进一步丰富项目构建策略。另一方面,如果您只想将简单消息传播到复杂的.NET或Java对象,那么您应该使用自定义消息传递功能。在这里,应用程序可以生成数据并触发事件,感兴趣的侦听器几乎可以立即接收到事件。有关这方面的更多信息,请参阅与自定义事件相关的文章。2.NCache发布/订阅APINCache提供内存中的发布/订阅(publish/subscribe)功能和专用的发布/订阅消息存储,以支持.NETweb应用程序中的实时信息共享,最终帮助应用程序更好地通信。发布/订阅模式通过提供感兴趣的用户发布和订阅消息的渠道,自然地将发布者和订阅者分离。现在,当NCache充当消息传递总线时,发布/订阅模型受益于底层NCache分布式架构和许多方便的功能。3.基本架构我们先来了解一下NCache发布/订阅的基本组成和工作原理。NCache发布/订阅消息的大致流程如下:首先,发布者使用ITopic接口发布主题消息。然后,订阅者可以创建对一个或多个主题的订阅并接收相关消息。NCache将在消息成功传递时收到确认;否则,NCache将在消息过期之前不断重试(如果设置了过期信息)。未送达的消息将驻留在缓存中,直到触发过期消息,请参考下图。图3:NCache发布/订阅消息机制4.订阅类型NCache为发布/订阅消息提供了两种不同类型的订阅,即非持久订阅和持久订阅。此外,NCache支持独占和共享订阅策略。细节在下面讨论。非持久订阅:默认情况下,在一个主题上创建的所有订阅都是非持久的。它只在保持连接有效之前将预期的消息传递给订阅者。如果订阅者的连接因任何原因丢失,当它重新加入网络时将不会收到旧消息。这种类型的订阅是独占的,也就是说一个订阅只属于一个订阅者持久订阅:它考虑到了订阅者断开连接时消息的丢失。当连接丢失时,NCache保留订阅者的订阅。因此,订阅者可以在重新连接时收到他们感兴趣的已发布消息。持久订阅提供两种策略:独占:一次一个订阅只属于一个活跃订阅者共享:一个订阅可以同时注册多个订阅或者提供负载分担NCahce发布/订阅应用案例假设有一个电子商务商店不同供应商定期向其供应新产品。同时,还提供产品销售和折扣。对所提供产品感兴趣的商店经理和客户需要随时了解新产品、打折产品和折扣的最新信息。NCache发布/订阅功能可以在这种情况下启用分布式通知系统。为此,您可以首先创建一个特定于NCache的发布/订阅消息存储。接下来,让我们讨论在上述场景中使用NCache发布/订阅消息传递API实现分布式消息传递的分步过程。1.创建主题第一步,您需要创建一个主题,以便不同的供应商可以发布新产品的更新。可以使用NCache中的ITopic接口创建具有唯一名称的新主题。以下代码显示发布者应用程序如何使用方法CreateTopic创建名为newProducts的主题。//前提条件:缓存已连接//指定主题名称stringtopicName="newProducts"//创建主题ITopictopic=cache.MessagingService.CreateTopic(topicName);如果具有所提供名称的主题已经存在,则该主题的实例将作为ITopic返回。NCache允许在创建主题时设置主题优先级。当某些事件需要以比其他事件更高的优先级进行通信时,这很有用。例如,关于成品的信息是紧急的;同样,由于折扣或销售而导致的产品价格更新对卖家/买家来说最为重要。这种情况下,可以在创建主题时将主题优先级设置为高,这样就可以及时收到相关通知。2.发布消息创建主题后,发布者应用程序可以使用Publish方法向该主题发布相关消息。为此,首先通过指定主题名称获取主题的实例。NCache在发布消息时提供以下两种投递方式:全部(默认):将消息投递给所有注册的订阅者。这在需要广播信息时很有用。任何:将消息传递给任何注册订阅者。另外,为了有效管理你的pub/sub缓存的存储空间,你还可以设置消息的过期时间。在以下代码中,发布者将在现有主题newProducts上广播有关新产品的消息。//前提条件:缓存已连接//主题“newProducts”已创建stringtopicName="newProducts"//获取主题ITopicproductTopic=cache.MessagingService.GetTopic(topicName);//CreateobjectProductproducttobesentinmessage=FetchProductFromDB(10248);//新建一条对应对象顺序的消息3.订阅主题消息创建主题后,订阅者应用程序可以接收发布的消息通过获取订阅来访问主题。由于支持不同类型的订阅,对非持久??订阅感兴趣的订阅者可以使用CreateSubscription方法;对于持久订阅,他们可以使用CreateDurableSubscription方法。以下代码显示订阅者应用程序如何创建对主题newProducts的订阅。MessageReceived注册回调以在收到通知时执行任何预期的操作。例如,订阅者可以在收到销售通知时在MessageReceived回调中更新产品价格。//前提条件:缓存已连接//主题“newProducts”已创建stringtopicName="newProducts"//获取主题ITopicproductTopic=cache.MessagingService.GetTopic(topicName);//创建并注册主题newProducts的订阅者//指定回调函数MessageReceivedITopicSubscriptionorderSubscriber=orderTopic.CreateSubscription(MessageReceived);在上面的示例中,创建了一个非持久订阅。此外,当订阅者需要在重新连接时从订阅的主题接收旧消息时,他们可以创建持久订阅。NCache还提供了一种基于模式的订阅方式,NCache支持多个通配符订阅提供的模式下的单个/多个主题。4.注册通知NCache使发布者能够知道消息的状态和主题的可用性。发布者应用程序可以注册以下通知:MessageDeliveryFailure:如果由于任何问题而无法传递消息,则通知发布者OnTopicDeleted:删除消息时通知发布者这是发布者注册这两种通知的简单方法://YourThereisaninstanceofanexistingtopicproductTopic//注册消息传递失败productTopic.MessageDeliveryFailure+=OnFailureMessageReceived;//注册主题删除通知productTopic.OnTopicDeleted=TopicDeleted;通过执行上述步骤,可以将基本的发布/订阅消息传递架构集成到任何ASP.NET或.NETCore应用程序中。总结至此,让我们总结一下NCache发布/订阅模型为克服现有解决方案的局限性提供的好处。由于线性可扩展性,NCache发布/订阅可以通过添加缓存服务器和频繁执行负载平衡来处理不断增加的订阅请求。这种缩放功能对用户是透明的,不会妨碍通信过程。因此,您可以使用NCache发布/订阅模式轻松扩展通信性能。NCache发布/订阅有助于持久订阅、消息传递失效和传递失败通知以避免消息丢失。此外,NCache的分布式和复制架构确保了NCache的高可用性,以适应动态环境中的订阅者连接。所有这些特性确保了可靠的通信。由于NCache是内存中的分布式缓存,因此驻留在缓存中的消息存储本身就很快。另外,NCache允许指定是否使驻留在缓存中的数据项过期,从而智能地管理存储空间。NCache的可扩展性、可靠性和存储效率,以及发布/订阅的松散耦合和异步消息传递模式,使得NCache的发布/订阅功能在未来.NET/NETcore应用的分布式消息传递开发中大有可为。原文链接:https://dzone.com/articles/pubsub-design-pattern-in-net-distributed-cache译者简介朱宪忠,社区编辑,专家博主,讲师,潍坊某高校计算机教师,免费老手编程一件。早期专注于各种微软技术(编译成三本与ASP.NETAJX和Cocos2d-X相关的技术书籍)。/ESP32/RaspberryPi等物联网开发技术和Scala+Hadoop+Spark+Flink等大数据开发技术。
