1

我们目前有一个应用程序,它使用服务代理将消息排队以发送到外部系统,我们通过 Web 服务接口与之通信。

目前我们只与一个公司集成,所以一个队列就足够了——但是我们需要开始将消息传递给使用相同 Web 服务接口的多个公司。

我想知道一个队列系统是否足以满足此要求,或者我们是否应该为每个公司设置一个队列。每家公司都有一个队列,我担心会扩展它,因为我们可能有很多队列,然后有很多连接来检查队列。

但是,对于单个队列,我们​​可以根据需要添加更多阅读器。但是,如果我们无法与外部系统之一进行通信(例如连接问题),那么消息就没有问题,我们想重试它,但我们不想延迟发送给那些系统已启动。我想知道人们目前是如何处理类似情况的?

我们可以重新插入消息,但我担心的是我们不保证交货顺序。

4

1 回答 1

3

我假设通过“重新插入”一条消息,您的意思是回滚收到它的事务。效果将是该消息将再次可供接收,作为给定对话的第一条消息(因此您无需担心保留传递顺序)。也就是说,这种方法存在一个问题,即毒消息处理。如果回滚来自给定队列的 5 个连续接收,则该队列将被禁用。

在Klaus Aschenbrenner 的书中详细描述的另一种方法是有一个待处理请求表。一旦激活的过程收到来自 Service Broker 队列的请求消息,它就会尝试进行 Web 服务调用。如果由于某种原因失败,请求将被放入待处理的请求表中并每隔一段时间重试一次(您可以使用对话计时器来安排重试)。这样,如果 Web 服务不可用,它就不会一直阻止 Service Broker 读取器为其他公司提供服务(假设第一个请求的超时时间足够小)。而且由于无论网络服务调用是否成功,接收都会被提交,因此您不会遇到毒消息问题。

于 2010-02-04T16:43:04.470 回答