【问题标题】:Ask about how jetty works embedded in maven询问jetty如何嵌入maven中
【发布时间】:2020-06-17 08:37:34
【问题描述】:

我一直在 maven 项目中使用码头。

它正在使用以下流程:

我覆盖了码头服务器类的QueueThreadPool

QueuedThreadPool threadPool = new QueuedThreadPool(StaticConfig.JETTY_MAX_THREADS, 
StaticConfig.JETTY_MIN_THREADS, StaticConfig.JETTY_IDE_TIMEOUT, 
new BlockingArrayQueue<Runnable>(maxCapacity));

JETTY_MAX_THREADS=50JETTY_MIN_THREADS=5

但我在启动服务器时在监视器中创建了 5 个线程:

xxx_thread-14
xxx_thread-15
xxx_thread-16
xxx_thread-17-acceptor-0@3d01ec3d-ServerConnector@11758f2a{HTTP/1.1, (http/1.1)}{0.0.0.0:90}
xxx_thread-18

threads 14,15,16,18是线程池中的线程(img图)? 什么是连接队列?

如何创建 mutils 接受线程?

请帮助我处理对服务器的请求,第一个图像中的图表在配置中创建了编号线程。

非常感谢。

【问题讨论】:

  • 我有这个问题的信息,但我不知道它是如何工作的 ^.^ 谢谢你的意见。
  • 该图是错误的(或至少已过时 10 年)。接受者线程和请求处理线程不是分开的。此外,使用 50 个最大线程,您将没有太多处理请求的能力(平均网页将使用 8 到 12 个连接,这意味着您将能够同时处理大约 4 到 6 个客户端,最大线程数为 50 )。你永远不会接近需要另一个接受者。

标签: java maven server embedded-jetty jetty-9


【解决方案1】:

这是一个过早优化的案例,不了解 Jetty 以及您自己的 Web 应用程序的实际工作原理。

建议,不要过早配置QueuedThreadPool

保持默认,测试,再次测试,然后进行负载测试,然后再次进行负载测试,但方式不同。全程收集有关默认 QueuedThreadPool 行为方式的信息。

然后,只有这样,您才应该调整 QueuedThreadPool 以满足您的需求。

但永远不要停止监视您的服务器和 Web 应用程序,因为您会经常调整配置。 (尤其是如果您将QueuedThreadPool 配置为小于默认值)

重要提示:如果您需要限制请求或连接的数量,或者控制请求或连接的数量或速率,尝试在 ThreadPool 级别这样做是行不通的。 p>

该图是错误的(或至少已过时 10 年)。

从 Jetty 7 开始,没有连接队列,也没有接受器和请求线程的分离。

线程池(实际上只是一个java.util.concurrent.Executor)用于所有 Jetty 服务器上的线程需求。这可能是接受连接、处理 nio 托管选择器、处理单个 nio 选择器、处理来自网络的读取事件、处理请求的初始分派、处理从 Web 应用程序到网络的写入事件、处理来自Servlet 3.0、QoSFilter、DoSFilter、处理来自 Servlet 3.1 的异步 I/O、升级连接、websocket、HttpSession 管理、热部署处理、字节码扫描等。

最大线程数限制为 50:

  • 您永远不需要另一个接受者。
  • 您会饿死客户并引发大量问题。
  • 浏览器加载的典型网页将使用 8 到 12 个连接,这意味着在这个最大 50 线程配置上将能够同时处理 4 到 6 个客户端。

需要另一个接受器的应用程序类型是那些处理大量新连接的应用程序(对于 Eclipse Jetty,当您超过每秒 30,000 个新连接的阈值时,您通常需要另一个接受器)。

Jetty 使用的接受器数量是在 ServerConnector 级别配置的,而不是在 ThreadPool 级别。

查看 ServerConnector 构造函数并选择最适合您的环境的构造函数。

【讨论】:

    【解决方案2】:

    @Joakim Erdfelt,非常感谢您的回复!

    我的服务器存在于图表微服务中,而不是 Web 服务器,连接数无法达到 30,000,可能是 Google ^.^。

    我只想让任务序列在图表中退出网络服务器,因为如果不是任务序列,我会收到来自合作伙伴服务器的响应 TIMEOUT。

    响应时间大约为 10 秒,因此在最小线程中没有线程忙。

    我一直在使用:

    <jetty.version>9.4.30.v20200611</jetty.version>
    

    我认为上面的图表是码头的核心,因为我仍然发现它允许这样做,但是我有配置我的服务器的解决方案高级图表:

    boolean checkOOM = threadPool.getThreadPoolBudget().check(StaticConfig.JETTY_MAX_THREADS);
    LOGGER.info("check maxThread allow with memory : "+checkOOM);
    if(!checkOOM) {
       LOGGER.info("please increase merory server or decrease maxThread.");
       System.exit(1);
    }
    //depend info system
    //get core processor of server
    int coreProcessor = Runtime.getRuntime().availableProcessors();
    LOGGER.info("coreProcessor : "+coreProcessor);
    
    Server server = new Server(threadPool);
    int port = 0;
    
    try {
       port = Integer.parseInt(System.getProperty("server.port"));
    } catch (NumberFormatException ex) {
      LOGGER.error("Property server.port not found. " + ex.getMessage(), ex);
      System.exit(1);
    }
    // if acceptor 0 then the selector threads are used to accept connections
    // selector backup for acceptor
    // only init with limit system
    try (ServerConnector httpConnector = new ServerConnector(server, coreProcessor, coreProcessor)) {
        httpConnector.setAcceptQueueSize(StaticConfig.JETTY_MAX_QUEUED);
        LOGGER.info("acceptors : "+httpConnector.getAcceptors());
        LOGGER.info("queueSize : "+httpConnector.getAcceptQueueSize());
        httpConnector.setPort(port);
        server.setConnectors(new Connector[]{httpConnector});
    } catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
        System.exit(1);
    }
    server.start();
    server.join(); << init thread pool.
    

    上面的代码初始化配置允许服务器运行,我将为接受器备份 coreProcessor 编号接受器和 coreProcessor 编号选择器。

    我使用的 ServerConnector 与您的建议类似。

    我尝试使用默认的 QueueThreadPool(初始化构造函数服务器未在上面的代码中输入参数 threadPool),我将日志打印为 4 个线程 init:

    int cntThread = server.getThreadPool().getThreads();
    LOGGER.info("idleThread server : "+cntThread);
    

    我只是想知道图中线程池的作用是否正确!

    ps:你有最新的jetty当前版本图吗?

    非常感谢。

    【讨论】:

      【解决方案3】:

      亲爱的@Joakim Erdfelt,

      我应用了上面的配置,但我的服务器内存有问题(当前设置为 3GB),每次处理的总请求数约为 2500!!

      我不明白为什么内存满了?因为当线程关闭的时候HeapByteBuffer会reset free!!

      而且我已经打开了 8 个接受器和 8 个选择器,当包码头的类服务器时,我看到评论选择器将在接受器已满时使用,但我监控我看到选择器使用的线程,接受器是免费的 :(

      请给我建议,谢谢。

      【讨论】:

        猜你喜欢
        • 2012-08-25
        • 2015-08-02
        • 2015-09-26
        • 1970-01-01
        • 2011-05-30
        • 2012-11-17
        • 1970-01-01
        • 2018-11-22
        • 2012-01-27
        相关资源
        最近更新 更多