.net - 在 TIBCO EMS(或其他 JMS)中,如何创建可扩展的请求/响应处理器?

标签 .net jms tibco ems

我正在从事一个通过 TIBCO EMS 提供请求/响应服务的服务器端项目,我正在寻找有关存档可扩展性和低延迟的最佳实践的建议。我在 .NET 上执行此操作,但由于 TIBCO EMS 据称正在实现 JMS 规范,因此我认为针对其他 JMS 实现以及平台 (Java) 的建议是相关的。

目前,我们正在使用一个 Connection、一个 Session、一个 Consumer,并在单个 Consumer 上使用回调来监听消息。每个请求都在回调线程上处理,同步回复不同的队列(但相同的 session )。这行得通,但似乎无法扩展——即使在高事务率下,CPU 负载也可以忽略不计,但请求的延迟不断增加。

我假设发生的事情是 EMS 使用单个线程进行回调,处理时间以及发送回复所需的时间因此会阻止处理其他请求,但是 - 什么是获得的最佳方式这是规模化?

一种方法是在收到请求后立即在线程池上安排对传入请求的实际处理。这是一个快速修复并且可以扩展,但会引入额外的延迟并且会引入有关 session 使用的线程问题。另一个是拥有多个 Session 对象,甚至是 Connection 对象?任何人都可以就这样做的最佳实践提出建议,我想这一定是那里更常见的使用模式之一......

最佳答案

您需要一个两步排队过程。您的回调应该尽可能少地执行,我的首选选项是仅将消息排队到本地 Queue 中。然后,多个本地线程可以访问此队列,对任何可用项目进行出队和处理,并允许 JMS 排队过程继续进行,从而消除大量延迟。

您需要执行一些同步操作才能将结果返回给正确的消费者,但这应该相对微不足道。

关于.net - 在 TIBCO EMS(或其他 JMS)中,如何创建可扩展的请求/响应处理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7971791/

相关文章:

java - MQ消息回滚

java - 如何使用 ActiveMQ Broker URI 创建双工连接?

.net - 使用 opc ua .net 库在 Unity3d 中创建一个非常简单的 OPC 客户端

.net - 流利的NHibernate-如何映射列表<枚举>?

c# - 带有 MongoDB .NET 驱动程序的 Azure DocumentDB : how to set id manually?

java - 如何在 'main' 线程上运行 DefaultMessageListenerContainer

java - JmsTemplate 无法发送响应,因为 javax.jms.IllegalStateException : Session is closed

jms - 连接到 tibco 并查看队列中的消息正文

JavaScript 和 LiveView(TIBCO 实时数据集市)

c# - 在 JsonConvert.SerializeObject 中自定义标识参数