【问题标题】:Server implementation with asynchronous processing [closed]具有异步处理的服务器实现 [关闭]
【发布时间】:2013-01-17 18:10:42
【问题描述】:

这是场景:

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

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

性能很重要,同时考虑成百上千个请求。它必须是可扩展的。

我从未使用过 TPL,也从未编写过异步服务器。但是这几天我读了很多书,但……仍然无法理解它。

  1. TPL(4.0,而不是 4.5)在这里是一个不错的选择吗?
  2. 是否应该为到达服务器的每个请求创建 tpl 任务? (用于异步处理)
  3. 我应该使用 LongRunning 选项创建这些任务吗? (所以不涉及线程池)
  4. 我应该为请求实现任何队列机制吗?怎么样?
  5. 我应该将请求处理的所有部分(a. 查询生成 b. 针对数据源的查询执行)与单独的任务(延续)链接起来,还是可以将单个任务用于两者 a.和b.?
  6. 我应该使用 .FromAsync 任务生成来执行查询吗?还是标准的 .StartNew 就够了?
  7. 考虑到上述要求,我还应该注意哪些其他重要方面?

【问题讨论】:

标签: c# .net c#-4.0 asynchronous task-parallel-library


【解决方案1】:

已经有很多关于这个话题的讨论......例如,请参阅https://stackoverflow.com/a/908766/1876226。那里提到了 Chris Mullins 的帖子,但这些帖子都丢失了。我有一个指向某个网络存档的链接,其中包含一个帖子的缓存版本,我会查找它。

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

我们在一些使用 HUGE IA64 的实验室中进行了大量的可扩展性测试 服务器。结果,以及相当多的最好的 我们提出的做法详述于: http://www.coversant.net/Default.aspx?tabid=88&EntryID=10

在此处查看存档副本:http://nleghari.wetpaint.com/page/Windows+Sockets+and+Threading%3A+How+well+does+it+scale%3F

我仍在思考我正在开发的类似应用程序。到目前为止我想到的要点:

  • Socket 异步操作(Begin*、End*、*Async)使用 IOCP;
  • TPL 是一种实现多线程的简单而稳健的方法;
  • 如果你想要异步 - 那么你应该创建一个任务来处理请求。也许除了“已知”是轻量级的请求;
  • 如果您使用hundreds or maybe thousands of requests at the same time 创建LongRunning 任务,那么您可能会获得使系统瘫痪的线程数。需要时使用 LongRunning。使用自定义TaskScheduler 进行并发控制;
  • 队列将不可避免地出现在您的代码中:要么用于批处理作业以避免过度锁定和上下文切换,要么用于生产者-消费者场景;
  • 某些资源(SQL Server、文件系统...)具有也使用 IOCP 的异步 API。有些资源没有。在前一种情况下,.FromAsync 将有效地使用 IOCP。但请注意,IOCP 线程池也不是无限的:它可能会被数据库查询和网络服务耗尽;
  • 如果可能 - 通过实现应用内缓存完全避免 DB 访问 (.NET MemoryCache 或自定义)或批处理数据库请求 需要响应(例如,进行批量插入);
  • 有一个ParallelExtensionsExtras 开源库 部分成为 .NET 4.5 Async 的一部分。所以你可以拥有 neet TPL .NET 4.0 中的扩展。见游A Tour of ParallelExtensionsExtras

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

【讨论】:

  • 非常好的链接,非常感谢。
  • 用 Chris Mullins 帖子的链接更新了答案。
  • 添加了 ParallelExtensionsExtras 参考
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2014-11-09
  • 1970-01-01
  • 2012-08-30
相关资源
最近更新 更多