消息排队场景-排队和远程web服务



(请参阅下面的幻灯片链接)我正在尝试创建与远程web服务交互的可审计请求和响应服务。我在决定我的方法的正确实现方面遇到了一些麻烦。基本上,我需要如何实现工作如下。

  • 请求者应用程序(A)将生成请求XML并将其添加到请求'队列'中。一个然后请求处理器将从"队列"中获取一条未处理的记录将其发送到具有唯一ID的远程web服务(X),如果请求没有成功,则请求将在请求"队列"中保留/(requestComplete标志= 0),以便稍后重试。

  • 如果请求成功,则保留/(requestComplete标志= 1)并且不重试

  • 在稍后的日期,接收者web服务(B)从请求中调用的'X'服务接收响应。

  • 'B'然后通过请求记录查找原始请求,并将'A'请求和'X'响应(使用唯一ID匹配)关联起来。

  • 对响应进行一些额外的处理,来自'queue'的记录被更新为完成。

这样就有了从请求到响应的完整审计跟踪。我可以看到最初的请求是什么时候发出的,如果有一个错误的请求通过查看'queue'记录。同样,我可以看到什么时候收到了回复。

我想到了两种方法来实现它。

  1. 场景1使用一个数据库表作为请求队列、响应队列和审计跟踪。表中带有GUID的一行,可以在流程的任何阶段(请求->处理->接收)中引用,并在此过程中更新。问题是,从我收集到的这个实现不像MSMQ (push/pop)那样的真正队列,可处理且不可扩展。对于实际的队列实现,我做了一些研究,并认为使用可能有多个队列的MSMQ;处理程序队列处理和发送请求,然后将完成的请求推送到接收队列以等待来自'X'的响应。这种方法的唯一问题是没有清晰的审计跟踪,也就是说,一旦接收到请求,就会从队列中删除请求,响应也是如此。除非我使用数据库表来存储用于审计目的的请求和响应队列。我已经读到,与MSMQ有日志类型的事务,它确实保留了哪些记录排队,但我正在寻找一个更完整的解决方案或关于此事的建议。

注意事项:

  • 请求'A'发送给'X'一个唯一的Id, 'X'发送一个响应'B'引用那个唯一的Id。这允许'B'跟踪请求记录'A'。
  • 我需要能够重试失败的尝试'X'(任何错误400或404的需要重试)
  • 我需要能够保持请求/响应的审计跟踪。
  • 我使用c#, WCF, MSMQ, SQL Server 2008 R2, VS 2012。

如果任何人有任何建议或指导的途径,任何评论或任何知识,在处理上述情况的最佳实践,这将是非常有益的。

我建议查看带有saga的服务总线(我的偏好是Rhino service bus,但NServiceBus也有很多吸引力,还有Mass Transit)

基本上,服务总线将处理排队(即发送)消息和排队(即接收)消息的管道。处理它们)。然后,saga将帮助维护会话(其中会话由多条消息组成)的状态。

稍后重试的问题可以通过Rhino ServiceBus中的延迟消息和NServiceBus中的超时(我没有Mass Transit的经验)来相当优雅地处理。

我会将结果日志存储在数据库中,以便于查询&报告。我也宁愿使用带有MSMQ(或任何其他队列)的服务总线,而不是使用数据库表作为"队列"——前者是专门为您的场景设计的,而后者是一个更通用的产品,可以处理许多不同的场景,因此它不会像队列实现(例如MSMQ)那样有效(尽管它可以做到这一点,但扩展变得更难)。

最新更新