C# N服务总线-获取队列上所有挂起的消息

C# N服务总线-获取队列上所有挂起的消息,c#,.net,nservicebus,C#,.net,Nservicebus,我有一个应用程序,它通过WCF从许多其他应用程序接收数据 我现在有一些客户也希望收到该数据的副本,但不同的客户有不同的需求 客户A希望我们呼叫web服务向他发送数据 客户B希望我们通过电子邮件将数据发送给他 客户C希望建立自己的系统,该系统将轮询我提供的web服务以接收他的数据 我想使用NServiceBus已经有一段时间了,看起来这是一个很好的应用程序。我认为我可以通过设置端点以所需的格式/协议向客户A和客户B交付数据,从而很好地处理客户A和客户B。顾客C:不过,我很挣扎 我在N服务总线中

我有一个应用程序,它通过WCF从许多其他应用程序接收数据

我现在有一些客户也希望收到该数据的副本,但不同的客户有不同的需求

  • 客户A希望我们呼叫web服务向他发送数据
  • 客户B希望我们通过电子邮件将数据发送给他
  • 客户C希望建立自己的系统,该系统将轮询我提供的web服务以接收他的数据
我想使用NServiceBus已经有一段时间了,看起来这是一个很好的应用程序。我认为我可以通过设置端点以所需的格式/协议向客户A和客户B交付数据,从而很好地处理客户A和客户B。顾客C:不过,我很挣扎

我在N服务总线中看到的所有示例都涉及到订阅队列并在消息传入时触发事件。我想我想在这里要做的是,当客户打电话索要他的数据时,我会为他抓取队列中的所有消息并传递它们


我的问题是,这是NServiceBus的正确应用还是这是一个错误的工具?如果是这样,是否有任何代码示例可以向我展示如何处理客户C?

可以通过WCF公开端点,但用于将消息传送到总线上。如果有人想对某个服务进行投票,我会单独主持该服务,并让他们在它被调用时进行管理

这是一个很好的问题,因为它直接切入了基于消息的系统——特别是NServiceBus——如何解决许多问题的核心

对于A和B,您无疑朝着正确的方向前进——只需订阅适当的消息,然后使用客户选择的机制将数据转发/推送给客户。如果他们离线,没什么大不了的,基于消息的系统比其他系统更优雅地处理故障

非常有趣的是,客户C可以用与A和B几乎完全相同的方式提供服务,但只需几个额外的步骤。首先,只需设置另一个订阅适当消息的NSB端点,然后使用客户C指示的所需结构将其写入持久性存储。您可以将消息写入本地数据库、JSON文件,甚至Amazon S3 blob。从这里开始,您只需要设置某种HTTP端点(不使用NServiceBus),允许客户查询和检索适当的数据。如果您使用S3并发布JSON blob,您甚至可能不需要设置HTTP服务器——只需让Amazon完成所有工作即可


另一个非常酷的副作用是,如果未来的客户D和E决定他们也要投票,但他们需要彼此之间以及客户C之间稍有不同的格式,您可以通过设置另一个写出文件(或DB插入)的处理程序来适应他们根据他们指定的格式--所有这些都不会改变系统的行为。

我担心这将是答案,因为这意味着增加一些复杂性和更多的存储等,但它会完成工作。在您提出的解决方案中,我是否也会将NSB放在web服务和持久性之间(在您的示例中是s3),还是应该以“正常”的同步方式构建它?每当客户直接查询数据时,只要以最简单的方式将其提供给他们,而不必担心将NServiceBus添加到组合中。此外,您现在可能正在添加“复杂性”,但您实际上并没有——您通过将关注点分开来保持事情的简单性。这有助于在您成长的过程中保持体系结构的整洁和可扩展性。这可能是一个不同的问题,但拥有一个队列,然后根据客户(消息中的数据)切换交付机制是否更有意义,还是为每个客户拥有一个单独的队列更好?我倾向于后者。这取决于每个客户的SLA要求。如果有人有严格的SLA,并为高可用性和集群支付更多费用,我绝对会隔离队列。否则,只会增加开销。