繁体   English   中英

消息队列方案-队列和远程Web服务

[英]Message Queueing Scenario - Queueing and remote web service

(请参阅下面的幻灯片链接)我正在尝试创建与远程Web服务交互的,可审核的请求和响应服务。 我在为我的方法选择正确的实现时遇到一些麻烦。 基本上,我需要执行该工作的方式如下。

  • 请求者应用程序(A)将生成请求XML,并将其添加到请求“队列”中。 然后,请求处理器将从“队列”中获取未处理的记录,并将其发布到具有唯一ID的远程Web服务(X),如果请求成功,则请求将被保留/(requestComplete标志= 0) “队列”将在以后的时间重试。

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

  • 稍后,接收者Web服务(B)从请求中调用的“ X”服务接收响应。

  • 然后,“ B”搜索请求记录以查找原始请求,并将“ A”请求和“ X”响应相关联(使用唯一ID进行匹配)。

  • 响应会执行一些其他处理,并且来自“队列”的记录将更新为已完成。

这样,从请求到响应都有完整的审核跟踪。 通过查看“队列”记录,可以看到原始请求是何时发出的,如果请求有错误。 同样,通过响应,我可以看到何时收到响应。

我曾考虑过两种实现此方法的方法。

  1. 方案1使用一个数据库表作为一个请求队列,响应队列以及审核跟踪。 带有GUID的表中的一行,可以在过程的任何阶段(请求->处理->接收)进行引用,并在此过程中进行更新。 问题是我收集的这种实现方式不能像MSMQ(推送/弹出)之类的真正队列那样操作,可交易且不可扩展。
  2. 方案2对于实际的队列实现,我进行了一些研究,并认为将使用可能具有多个队列的MSMQ。 处理器队列来处理请求的处理和发送,然后将完成的请求推送到接收器队列,以等待来自“ X”的响应。 这种方法的唯一麻烦是没有清晰的审计线索,即,一旦收到请求,就将其从队列中删除,同样是响应。 除非我使用数据库表存储请求和响应队列以进行审核。 我已经读过,MSMQ存在日记类型的事务,它确实将什么记录排入队列,但是我正在寻找更完整的解决方案或关于此事的建议。

只是一些注意事项:

  • 请求“ A”发送给具有唯一ID的“ X”,“ X”发送对引用该唯一ID的“ B”的响应。 这允许“ B”跟踪请求记录“ A”。
  • 我需要能够重试失败的“ X”尝试(需要重试任何错误400或404)
  • 我需要能够对请求/响应进行审核跟踪。
  • 我正在使用C#,WCF,MSMQ,SQL Server 2008 R2,VS 2012。

如果有人对采用哪种方法有任何建议或指导,对上述方案的最佳做法有任何意见或知识,那将是非常有益的。

我建议您查看带有sagas的服务总线(我的首选是Rhino Service Bus ,但NServiceBus也有很多吸引力,并且还有Mass Transit

基本上,服务总线将处理排队(又称为发送)和出队(又称为接收和处理)的消息。 然后,传奇将帮助维护对话的状态(对话包含多个消息)。

Rhino Service Bus中的延迟消息和NServiceBus中的超时(我没有使用Mass Transit的经验)可以很好地处理稍后重试的问题。

我会将结果日志存储在数据库中,以使其更易于查询和报告。 我还宁愿将服务总线与MSMQ(或任何其他队列)一起使用,而不是将数据库表用作“队列”-前者是专门为您的情况设计的,而后者是一种更通用的产品,可以处理许多不同的情况,并且因此,它不会像队列实现(例如MSMQ)那样高效(尽管它可以做到-但扩展变得更加困难)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM