【问题标题】:Managing multiple outgoing TCP connections管理多个传出 TCP 连接
【发布时间】:2011-02-22 09:42:36
【问题描述】:

我的程序需要向多个(大约 50 个)“客户”站发送数据。重要的数据位必须通过 TCP 发送以确保到达。连接大多是固定的,预计不会在程序的单个活动期间发生变化。

您认为最好的架构是什么?我听说通常不建议为每个连接创建一个新线程,但是当连接预计不会改变时,这个建议是否有效?具有可扩展性固然不错,但由于客户端站的数量预计不会增长,因此不必担心。

如果重要的话,程序是用 Java 编写的。

谢谢,

亚历克斯

【问题讨论】:

    标签: java tcp connection


    【解决方案1】:

    如果可伸缩性、吞吐量和内存使用不是问题,那么使用 50 个线程就足够了。它的优点是简单,简单是好事。

    如果您希望能够扩展,或者您担心内存使用(N 个线程意味着 N 个线程堆栈),那么您需要考虑使用 NIO 选择器的架构。然而,最好的架构可能取决于以下几点:

    • 每个客户端工作站需要执行的工作量,
    • 工作是否均匀分布(平均),
    • 工作是否涉及其他 I/O、访问共享数据结构等以及
    • 聚合工作与单个处理器饱和的接近程度。

    【讨论】:

      【解决方案2】:

      50 个线程很好,去吧。这几乎无关紧要。超过 200 个线程,开始担心..

      【讨论】:

      • 我自己会说 2000 年。
      • 是否有专门设计用于处理 TCP 连接的池,例如有数据库连接池? java.util.concurrent.ExecutorServicejava.util.ThreadPoolExecutor 是唯一的方法吗?
      【解决方案3】:

      无论如何我都会使用线程池。根据您的线程池配置,它将根据需要创建尽可能多的线程,但此解决方案更具可扩展性。不仅对 50 个客户而且对 5000 个客户都可以。

      【讨论】:

      • 问题是,当我发送 TCP 数据时,它需要同时发送到所有客户端(对不起,应该在原始问题中提到它),所以我看不到使用的好处一个游泳池。
      【解决方案4】:

      为什么不使用连接池之类的东西来限制线程的数量?

      【讨论】:

        猜你喜欢
        • 2011-11-06
        • 2011-06-25
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        • 2013-06-27
        • 2016-11-19
        相关资源
        最近更新 更多