C# 有关如何组织后台队列操作的文章

C# 有关如何组织后台队列操作的文章,c#,asp.net,.net,wcf,msmq,C#,Asp.net,.net,Wcf,Msmq,现在我在考虑如何组织系统的体系结构。该系统将包括一个网站,用户可以在该网站上载一些文档,然后将其处理回来,以及一个后台守护进程,该后台守护进程带有一个任务队列,该队列应处理提供的文档 我的问题是: 我是否应该实现我上面告诉过你的守护进程,将其作为一个只具有命名管道的WCF服务(不需要对该服务进行netowork访问) 有什么建议吗 用户可以提供的数据只是一堆XML文件。ASP.NET网站将公开获取此XML文件的功能,然后以某种方式将它们传递给守护进程 你能给我介绍一些关于这个话题的文章吗。 提前

现在我在考虑如何组织系统的体系结构。该系统将包括一个网站,用户可以在该网站上载一些文档,然后将其处理回来,以及一个后台守护进程,该后台守护进程带有一个任务队列,该队列应处理提供的文档

我的问题是: 我是否应该实现我上面告诉过你的守护进程,将其作为一个只具有命名管道的WCF服务(不需要对该服务进行netowork访问)

有什么建议吗

用户可以提供的数据只是一堆XML文件。ASP.NET网站将公开获取此XML文件的功能,然后以某种方式将它们传递给守护进程

你能给我介绍一些关于这个话题的文章吗。 提前谢谢


后期编辑 经过几个小时的探索,我发现了大家在这里提出的MSMQ,我认为这项技术更适合分布式体系结构(处理节点位于不同的机器上,不同的计算机之间通过网络交换消息)

目前,不需要分离到独立的机器。在这台机器上会有一个ASP.NET网站和一些处理程序

使用MSMQ有必要吗


后期编辑#2 由于我在这里使用.NET Framework,请建议仅提供与.NET兼容的产品。这里真的没有任何选择。

看看


它有点过时,但可以让您从一开始就对它有一个基本的了解。

如果您的部署将在一台服务器上进行,那么您对WCF服务的最初想法可能是一个不错的选择-有关在IIS或Windows服务中托管的讨论,请参阅

正如@JeffWatkins所说,调用该服务时要遵循的一个好模式是简单地将需要处理的文件在磁盘上的位置传递给它。在处理大型文件时,这将更加有效

我认为这里采用的精确方法将取决于您从用户处收到的文件的性质。对于非常小的文件,您可能会发现将它们从您的网站流式传输到您的服务中更有效,这样它们就不会接触到磁盘。在这种情况下,您的服务将公开处理小文件时使用的附加方法

编辑

引入文件可能被流式传输的条件可能是一个好主意,但对您来说,进行一些测试是很有价值的,这样您就可以了解:

  • 是否值得去做
  • 流式传输与写入磁盘的最佳大小是多少
  • 我的回答基于这样一个假设,即您正在部署到一台机器上。如果您想要更具可伸缩性的东西,那么是的,使用MSMQ将是扩展应用程序的好方法


    有关构建WCF/MSMQ演示应用程序的示例代码,请参阅。

    我设计了类似的东西。我们使用WCF服务作为连接点,然后使用RabbitMQ对消息进行排队。然后,一个单独的服务处理队列中的项目,在任务完成时发送异步回调,从而完成WCF调用(WCF有许多内置功能来处理此问题)

    您可以在每一侧设置超时,或者甚至可以选择断开WCF连接并使用异步回调通知用户“处理已完成” 我在RabbitMQ上的运气比MSMQ好得多,仅供参考


    我没有任何链接给你,因为这是我们的团队提出的,并且工作得很好(1000 TPS,4服务器池,100%无状态)-只是一个想法。

    我会认真考虑ServiceStack。此功能是内置的,您只需进行最少的编程。此外,ServiceStack的体系结构非常好,如果遇到任何问题,都很容易调试


    另一方面,我的公司使用基于web的RESTAPI前端(REST服务使用ServiceStack)进行大量异步后台处理。我们使用多台机器,并实现了RabbitMQ后端;然而,RabbitMQ.NET库的设计非常糟糕,而且不必要地繁琐。我重新设计了核心类来解决这个问题,但是由于我们还没有将项目发布到生产环境中,我们还无法将其发布到社区。

    谨慎的做法是设置WCF,以便您可以在单独的框中运行处理和网站-这样繁重的后台处理不会影响web服务器性能。通过MSMQ将wbesite连接到守护程序对我来说似乎更简单me@JonEgerton在项目的当前阶段,我们不适合使用单独的服务器。但是谢谢你的建议@你能分享一下这方面的知识吗?这似乎正是我所需要的。即使您不需要MQ系统提供的分发灵活性,您也应该只为了它提供的方便而使用它。任何自制的异步/调度程序代码都会比最初预期的更容易出现错误,更复杂,也不太适合未来。MSMQ是否允许广播巨大的消息(XML数据文件可能需要1GB大小)?或者我应该只发送一条带有文件路径的消息,而不是将其嵌入到消息中?我会选择“仅”路径,当您有文件系统时,传输1GB似乎有点多余,如果您有队列和大的有效负载,请考虑“索赔支票”模式。i、 e.把你的有效载荷放在一个可以访问的地方,比如数据库或文件系统,然后传递一张索赔支票,而不是有效载荷或路径。@JeffWatkins好像你给我指出了一条正确的道路。你能提供一些链接到该材料吗?谢谢你的回复。实际上,用户XML数据文件的大小从100KB到1GB不等。也许我们应该在大小上引入一些条件/算法,以便将其通过stram或作为文件传递?你觉得这里的MSMQ怎么样?另一个想法是该系统如何可扩展?我可以在将来的某个时候再加一些e吗