发布/订阅和基于内容的订阅

时间:2012-08-03 21:28:15

标签: c# .net publish-subscribe

我正处于设计将成为事件驱动架构(基本发布/订阅)的系统的开始阶段。实际的工具和框架还没有被选中,所以这个问题比技术特定更具概念性(尽管它将在.Net中完成)。

对于这种情况几乎完美的比喻是金融交易系统。想象一下,一个不断接收市场数据的服务器(实时或间隔 - 无所谓)。服务器将发布特定证券的定价更新。出于这个问题的目的,让我们说服务器正在“观察”和发布有1000种证券。

此服务的订户有100个客户端应用程序。每个客户只对正在发布的一小部分证券感兴趣。

如果客户端收到所有1000个证券的消息,那么它必须解析它们,这显然会在客户端上产生更多的网络流量和更多的负载。

另一方面,在发布/路由时,必须解析服务器端的消息内容似乎会增加负载。

这种架构通常如何处理?

4 个答案:

答案 0 :(得分:2)

看看RabbitMQ提供的一些教程

Link

请特别注意,您可以使用路由和主题将消息传递到适用的客户端。 “服务器”“这里可以简单地删除队列中的消息,客户端可能只是根据他们订阅的路由/主题来监听某些消息。可能还有很多其他选项,但这似乎是一个很好的路线.RabbitMQ有一些.Net客户可用,我对他们的产品非常满意。

我也使用过IBM MQ和MSMQ,但我更喜欢Rabbit。主要是因为它基于AMQP这是一个开放协议,让我使用.Net,Python,Java等连接而不是专有驱动程序或尝试将所有内容包装在JMS中。绝不是专家,所以也许其他人可以更好地了解你的问题。

祝你好运。

答案 1 :(得分:2)

通常,服务器是能够执行繁重任务的功能更强大的计算机。由于客户端只需要信息的子集,我认为服务器应解析信息并仅发送给客户需要的信息。

答案 2 :(得分:1)

分发股票报价正是导致发布/订阅寻址专利的用例,我们现在知道并喜欢JMS和其他消息传递技术中的“主题”(专利EP0412232)。

在这种情况下,服务器将在包含股票代码的主题上发布股票报价(“ticks”)...通常,您使用主题名称空间,该名称空间给出了有关该符号的一些分层信息 - 例如NASDAQ.TECHNOLOGY.HARDWARE.AAPL。

客户端将使用主题通配符订阅符号或符号组。发布/订阅机制将确保仅向正确的订户分发。使用多播网络可以提高效率。

因此,为了回答您的问题,在这种情况下,发布者(服务器)正在执行分类消息所需的任何逻辑,然后发布相关主题。订户不需要做太多工作就可以获取相关消息。

答案 3 :(得分:0)

根据您提供的简短描述,您的方案看起来非常适合OMG DDS(数据分发服务)实施。这是一种语言中性规范,有几种产品可以提供C#API。

请参阅this Wikipedia entry以获得非常简短的介绍和参考列表。

DDS支持许多高级数据管理功能,如强类型和内容感知数据总线,分布式状态管理和历史数据访问。其丰富的服务质量设置允许从应用程序向中间件卸载大量复杂性。

特别是,您描述的内容过滤要求是一项重要功能。一些可用的产品已经实现了复杂的过滤机制,可以很好地扩展,并在网络上的流量与评估过滤器所需的CPU负载之间进行智能权衡。这些过滤器以SQL语法表示,如WHERE的{​​{1}}子句。

DDS实施通常具有高度可扩展性和分散性。参与DDS基础设施的组件在空间和时间上都是分离的。一些DDS产品部署在众多任务和关键业务系统中。

如果您有兴趣,那么我可以为您提供更多信息。我已经专注于DDS超过10年,我仍然喜欢它,我认为它是最有用的技术之一。