C# 异步处理的服务器实现

C# 异步处理的服务器实现,c#,.net,c#-4.0,asynchronous,task-parallel-library,C#,.net,C# 4.0,Asynchronous,Task Parallel Library,以下是场景: 有客户端向服务器发送请求(这将是套接字或wcf服务器,这并不重要) 服务器将保持一个开放的双工通道,并使用它向客户端发送应答(序列化数据)。服务器将处理请求,并涉及查询生成(基于请求的参数)和针对各种类型的数据源(sql Server、文件系统、analysis services Server-OLAP、脱机多维数据集等)执行。如此繁重的IO任务——肯定经常是长时间运行的 性能是重要的,同时考虑数百或数千个请求。它必须是可伸缩的 我从未使用过TPL,也没有编写过异步服务器。但这几天

以下是场景:

有客户端向服务器发送请求(这将是套接字或wcf服务器,这并不重要)

服务器将保持一个开放的双工通道,并使用它向客户端发送应答(序列化数据)。服务器将处理请求,并涉及查询生成(基于请求的参数)和针对各种类型的数据源(sql Server、文件系统、analysis services Server-OLAP、脱机多维数据集等)执行。如此繁重的IO任务——肯定经常是长时间运行的

性能是重要的,同时考虑数百或数千个请求。它必须是可伸缩的

我从未使用过TPL,也没有编写过异步服务器。但这几天我读了很多书。。。我还是无法控制自己

  • 第三方物流(4.0,而不是4.5)是一个不错的选择吗
  • 我是否应该为到达服务器的每个请求创建tpl任务?(用于异步处理)
  • 我应该使用LongRunning选项创建这些任务吗?(因此不涉及线程池)
  • 我应该为请求实现任何队列机制吗?怎么做
  • 我应该将请求处理的所有部分(a.查询生成b.针对数据源的查询执行)与单独的任务(延续)链接起来,还是可以将单个任务用于两个a。b
  • 我应该使用.fromsync任务生成来执行查询吗?或者标准。新的就足够了吗
  • 鉴于上述要求,我还应该注意哪些重要方面

  • 关于这个话题有很多讨论。。。例如,见。这里提到了Chris Mullins的帖子,这些帖子已经丢失了。我有一个链接到一些网络档案,其中有一个帖子的缓存版本,我将寻找它

    更新: 找到了Chris Mullins的帖子:

    我们在一些实验室使用巨大的IA64进行了相当多的可伸缩性测试 服务器。结果,以及相当多的最好的 我们提出的实践详情如下:

    请参见此处的存档副本:

    我仍在为正在开发的类似应用程序绞尽脑汁。到目前为止我所学到的几点:

    • Socket
      异步操作(开始*、结束*、*异步)使用IOCP
    • TPL是实现多线程的一种简单而健壮的方法
    • 如果您想要异步-那么您应该为请求处理创建一个任务。可能除了“已知”为轻量级的请求之外
    • 如果您在创建长时间运行的任务时同时有数百个或数千个请求,那么您可能会得到使系统瘫痪的线程数。需要时可以使用长跑。使用自定义
      TaskScheduler
      进行并发控制
    • 队列将不可避免地出现在您的代码中:用于批处理作业以避免退出锁定和上下文切换,或者在生产者-消费者场景中
    • 某些资源(SQL Server、文件系统…)具有也使用IOCP的异步API。有些资源没有。在前一种情况下,fromsync将有效地使用IOCP。但请注意,IOCP线程池也不是无限的:它可能会被数据库查询和网络服务耗尽
    • 如果可能的话-通过实现应用内缓存来避免数据库访问 (.NET
      MemoryCache
      或custom)或批处理不支持的DB请求 需要响应(例如,进行批量插入)
    • 有一个开源库 部分成为.NET4.5Async的一部分。所以你可以有尼特第三方物流 .NET4.0中的扩展。参观

    c#异步套接字服务器有很多幼稚和有缺陷的实现。阅读,但要重新检查。

    我认为你的问题太笼统了,无法正确回答。你问了很多问题,我想大多数问题的答案都是“视情况而定”。另外,如果你想异步,我真的会考虑使用.NET 5的C ^ 4.5,或者至少使用C .NET 5的.NET 4和.NET 4。它的建设性如何不如?非常好的链接,谢谢。更新了Chris Mullins帖子的链接。添加了ParallelExtensionsExtras参考