我正在开发一个使用 Tibco EMS 主题进行 Pub/Sub 通信的客户端服务器应用程序。
在我们的一个用例中,我们需要每分钟发送数百万条消息,分割超过200k 个“主题”。
每个客户都对他需要订阅的一小部分主题感兴趣。
问题是,这些实现中哪个更合理:
通过单个主题发送所有消息,并使用消息选择器按相关主题进行过滤。
为每个主题创建一个非静态主题,并让客户端订阅相关主题的主题。
据传消息选择器会稍微影响性能……这是有道理的。所以本质上,你必须弄清楚权衡参数:一方面,消息选择器给你带来多少利润,另一方面,你能容忍它们的性能成本。
总之,消息架构(您的问题)和容量/性能测试等活动最终将为您提供答案。
关于消息传递架构,有很多问题要问:
您的问题在很大程度上取决于主题的类型和数量,以及它们的性质。
当主题相关时,消息选择器可能非常有用,并且一些订阅者只对子集感兴趣。
示例 1:一个主题报告,其中存在 JMS 标头“ReportType”。在这种情况下,一些客户端可能更喜欢擦除所有消息,而其他客户端可能会使用“ReportType=Sales 或 ReportType=Weekly”订阅。如果主题列表一直在变化,这个例子可能会变得非常粗略......什么程序有兴趣获取所有报告,事件它不知道的事件(他们必须自我描述才能有用)
示例 2:如果主题在层次结构中相关...... EMS 和 MQ 中的订阅可以是一个特定的分支。想象一下 3 个主题:REPORTS、REPORTS.WEEKLY 和 REPORTS.SALES 客户可以在 EMS 中晒出 REPORTS.* ......这是在没有消息选择器的情况下完成的。
示例 3:非静态主题。在该示例中,您可以随时创建主题......但必须担心很多事情:测试缩放,获取客户端的主题列表,管理主题的弃用,让客户端监听许多主题(非常困难。 ..多重连接???)等。
祝你的设计好运,
旁注:至于您的目标性能......如果您的容量/性能测试对 EMS 不满意并且不介意失去 JMS,请不要犹豫查看 FTL(另一个 TIBCO 产品)或 RabbitMQ 等产品特征。EMS 超级强大,可能需要很多时间,但其他产品可以更轻,更注重性能。