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

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

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

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

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

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

在这种类型的架构中,这通常如何处理?

看一看RabbitMQ提供的一些教程

链接

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

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

祝好运。

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

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

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

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

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

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

请参阅此Wikipedia条目,以获得非常简短的介绍和参考列表。

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

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

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

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