【问题标题】:Server Architecture服务器架构
【发布时间】:2011-10-02 00:45:51
【问题描述】:

希望有两个与创建服务器应用程序相关的简单问题:

  • 可以同时打开的套接字数量是否存在理论/实际限制?一旦数据到达,就忽略处理数据所需的资源!如果它相关,我的目标是 .net 框架
  • 每个连接应该在永久分配给它的单独线程中运行,还是应该使用线程池?专用线程方法似乎更简单,但一次运行 100 多个线程似乎很奇怪。这是可接受的做法吗?

非常感谢任何建议 维纳图

【问题讨论】:

  • 假设您希望多个人能够同时连接,那么每个连接至少需要一个线程。
  • 您不能在有限数量的线程上依次循环通过套接字,其中一个专用于接受传入的请求吗?
  • 这是可能的,但如果您的连接运行时间很长,您肯定会冒着排队很长的风险。当我说“线程”时,我真正的意思是“异步接收和发送数据的方法”,所以 ThreadPooling 或异步套接字也可以工作。

标签: c# .net sockets


【解决方案1】:

我没记错(很久以前做过套接字),实现它们的最佳方法是使用 ReceiveAsync (.NET 3.5) / BeginReceive 方法,使用异步回调,这将利用线程池。不要为每个连接都打开一个线程,这样很浪费资源。

【讨论】:

    【解决方案2】:

    有实际限制,是的。但是,您很可能在到达负载之前很久就用光了资源来处理负载。 CPU 或内存更有可能在连接数之前耗尽。

    为了获得最大的可扩展性,您不希望每个连接使用单独的线程,而是使用仅在为活动(如接收或发送数据)连接提供服务时使用线程的异步模型。

    【讨论】:

      【解决方案3】:

      您可能会发现following answer 很有用。它说明了如何使用 .NET 线程池和异步套接字方法(BeginAccept/EndAccept 和 BeginReceive/EndReceive)编写可扩展的 TCP 服务器。

      话虽如此,当您可以使用众多 WCF 绑定之一(甚至编写自定义绑定)并从 WCF 基础结构的全部功能中受益时,编写自己的服务器并不是一个好主意。它可能会比每个自定义编写的服务器扩展得更好。

      【讨论】:

      • 感谢提供了与我的想法相似的模式,因为我已经在使用开始/结束接受。完美解决了我的需求!虽然我很欣赏提到 wcf,但不幸的是只有服务器是 .net。客户端是安卓应用,意味着带宽很紧。此外,连接始终处于打开状态(它是一个简单的多人游戏),其中 wcf 是基于 http/soap 的?虽然与原始套接字相比,我喜欢 wcf 的简单性,但在这种情况下,我认为我别无选择。希望我对 wcf 没有错误的假设!
      • @Venatu,不,您对 WCF 的假设是错误的。它不限于基于 HTTP/SOAP。您可以通过 TCP 使用二进制绑定。它们可能不是很有互操作性,但如果您愿意并使用任何协议,您可以编写自定义绑定。它非常可定制,这就是它的强大之处。您也可以通过 HTTP 使用 REST 或 POX,这可能比 SOAP 更优化。因此,如果我对您有一个建议:如果您打算在 .NET 平台上托管服务器,请使用 WCF。
      • 我对带宽的另一个担忧是 HTTP 标头(许多小消息加剧了这种情况),但如果 Http 是可以避免的,那不是问题。忽略好的建议是个傻瓜!谢谢指正,我会调查的。
      • 我发现 WCF 不适用于长时间运行的 TCP 连接。它会遇到各种任意消息长度问题,并且通常在后面很痛苦。你会得到奇怪的超时,然后在一定数量的连接后它不会重新连接(即使在更改默认限制之后)。这就像一些内部资源被耗尽,你必须重新启动。
      猜你喜欢
      • 2019-08-17
      • 1970-01-01
      • 2011-02-06
      • 2011-04-17
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多