【问题标题】:Writing Java server to handle multiple simultaneous clients编写 Java 服务器来同时处理多个客户端
【发布时间】:2011-04-10 20:43:46
【问题描述】:

在构建同时处理多个客户端的 Java 服务器时,我需要一些建议。客户端需要在相当长的时间内保持连接。我目前正在使用阻塞 IO 并产生一个线程来读取每个连接到服务器的客户端,但这显然是不可扩展的。

我找到了一些选项,包括使用具有固定大小线程池的 Selector 或 Executor。我对任何一个都不太熟悉,那么这里最好的解决方案是哪一个?谢谢!

【问题讨论】:

  • 为什么说你的解决方案不可扩展?您预计同时有多少客户?
  • 我想我低估了产生大量线程的性能。感谢大家的帮助!

标签: java client selector executor


【解决方案1】:

这取决于您对可扩展性的定义。您所描述的每个连接只有一个线程的系统可以扩展到数百甚至数千个并发连接,它会在某个时候碰壁。

您的问题是说您的客户端连接并保持连接很长一段时间,可能有一个 IO 线程来处理读取和写入,但将请求的处理分派到另一个线程使用执行者。

已经编写了一些框架/服务器来处理这种事件驱动的设计。看看:

值得注意的是,世界上充满了失败的初创公司和具有真正可扩展架构的软件产品。规模化是一个很好的问题,有问题总比没有问题和没有客户好。

【讨论】:

    【解决方案2】:

    使用多个线程是可扩展的。例如 Apache 就是这样做的,一些使用它的网站会吸引很多访问者。但是,另一种方法确实是使用选择器,尽管我没有使用它的经验。

    毕竟,这似乎是一个问题,哪种宗教是最好的。

    【讨论】:

      【解决方案3】:

      这种工作有很多框架,例子

      1. Netty
      2. Apache MINA

      【讨论】:

        【解决方案4】:

        独立于可扩展性,每个服务器应用程序都有其局限性。通过使用阻塞 IO,您的限制之一将是 VM 可以生成的线程数,因为您采用的方法是“每个客户端一个线程”。对于 NIO(其中 Selector 是其中一个类),该方法是“每个请求一个线程”,这将在稍后用完线程。

        您的应用程序的水平可扩展性 (http://en.wikipedia.org/wiki/Scalability#Scale_horizontally_vs._vertically) 将不依赖于这些选择中的任何一个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-24
          • 2013-04-02
          • 1970-01-01
          • 1970-01-01
          • 2015-05-23
          • 2015-02-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多