2010-02-04 22 views
1

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

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

我想知道如果一个单一的队列系统是足够的,或者我们应该有一个队列,每个公司。由于每个公司都有一个队列,所以我担心会扩大规模,因为我们可能有很多队列,然后有很多连接来检查队列。

只有一个队列,我们​​可以根据需要添加更多的阅读器。但是,如果我们无法与其中一个外部系统进行通信(例如连接问题),则该消息不存在问题,并且我们希望重试该消息,但我们不希望延迟那些公司的消息系统已经启动。我想知道人们目前是如何处理类似的情况?

我们可以重新插入邮件,但是我担心的是我们不保证发货顺序。

回答

3

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

Klaus Aschenbrenner's book中详细描述的替代方法是具有挂起请求的表格。一旦被激活的过程收到来自Service Broker队列的请求消息,它就会尝试执行Web服务调用。如果由于某种原因而失败,请求将被放入挂起的请求表中并每隔一段时间重试一次(您可以使用conversation timers安排重试)。这样,如果Web服务不可用,则不会阻止Service Broker读取器为其他公司服务(假定第一个请求的超时时间足够短)。而且由于无论Web服务调用是否成功,都会提交接收,因此不会遇到有害消息问题。

+0

我的意思是重新插入的意思是,你将消息从队列中取出并重新放入,所以你不会收到有毒消息。然而,你失去了订单交付 - 我会按照你的建议查看挂起的请求表。 – spooner 2010-02-04 18:28:42

+0

买了这本书,并给我我需要的一切。感谢您的高举。 我认为我的问题是我在考虑将邮件保留在队列中的问题太多,而不是试图在更合适的地方使用数据库的其他功能(例如重试表)。 – spooner 2010-02-05 13:16:35

+0

很高兴我能帮到你。许多Service Broker的使用模式涉及一个表格,该表格保存处理相关消息(通常由会话组ID标识)之间的应用程序状态,以便队列读取器可能确实是异步的。 – 2010-02-05 17:55:40