2

我们有一个核心系统,它通过 MSMQ 与其客户端和其他内部系统异步通信。这是一个很好的选择,因为客户端是发送短信的手机,而其他系统具有 MQ 适配器。此外,这些通信过程默认情况下是异步的。

现在我们需要支持其他需要默认同步通信样式的系统。一个典型的例子是手持设备,它支持通过 HTTP 的 rpc 样式请求/响应通信。

有一个解决方案建议通过添加一个 HTTP“代理”/端点来支持这一点,它将从这些客户端收到的消息推送到具有相关 ID 的入站队列,然后在出站队列中查找具有相同相关 ID 的消息。希望消息的处理完成,具有预期相关 ID 的消息将出现在出站队列中。这将发生在将消息推送到核心系统以模拟请求响应的同一线程上。

但是,我们看到通过correlationId (MessageQueue.ReceiveByCorrelationId) 接收消息是性能杀手。真正减慢系统速度并不需要很多客户端线程。

我想问题是提出的设计,使用通过相关 ID 方法接收来模拟同步请求响应是这里的问题。在当前架构中,出站队列驻留在远程主机上,一直在阅读此内容以查看是否存在问题。

有没有人有任何其他方法来解决这个问题?我想合乎逻辑的事情是将消息从出站队列填充到数据库或来自单个接收进程的东西,然后搜索具有相应correlationId的消息

4

1 回答 1

2

执行远程接收使用 RPC,不是特别快,但应该没问题。当您添加游标的使用(在这种情况下是在队列中搜索具有所需相关 ID 的消息)时,性能肯定不会像您所发现的那样扩展得很好 - 更多的客户端通常意味着更多的消息并导致速度变慢因为光标必须进一步移动。您肯定想在本地队列上进行这种搜索。

如何让后端多播出站队列中的消息?然后,可以改为向所有通常远程接收出站队列消息的服务器发送一个副本,该副本将进入本地队列以进行 ID 匹配。

干杯
约翰·布雷克韦尔

于 2011-02-02T16:33:13.653 回答