gpt4 book ai didi

java - Flume的HttpSource : is the Jetty server multithread?

转载 作者:行者123 更新时间:2023-12-01 11:33:26 24 4
gpt4 key购买 nike

我一直在寻找 Flume 的 HttpSource internals ,尝试弄清楚 Jetty 服务器是如何使用的。

我看到使用了连接器的单个元素列表;此连接器将监听已配置的 Http 主机和端口上的传入 Http 连接。然后为根路径创建一个 Context,并向该 Context 添加一个 HttpServlet,其中包含收到连接时要执行的逻辑。最后,Jetty服务器启动。

Connector[] connectors = new Connector[1];

if (sslEnabled) {
SslSocketConnector sslSocketConnector = new HTTPSourceSocketConnector(excludedProtocols);
...
connectors[0] = sslSocketConnector;
} else {
SelectChannelConnector connector = new SelectChannelConnector();
...
connectors[0] = connector;
}

connectors[0].setHost(host);
connectors[0].setPort(port);
srv.setConnectors(connectors);

try {
org.mortbay.jetty.servlet.Context root = new org.mortbay.jetty.servlet.Context(srv, "/", org.mortbay.jetty.servlet.Context.SESSIONS);
root.addServlet(new ServletHolder(new FlumeHTTPServlet()), "/");
HTTPServerConstraintUtil.enforceConstraints(root);
srv.start();
...

我的问题是,看到上面的实现:这样的 Jetty 服务器是否为每个传入的 Http 连接创建一个线程?或者是否有一个唯一的 HttpServlet 按顺序一一服务所有请求?

感谢您的帮助!

最佳答案

首先要注意的是:org.mortbay.jetty 表示您正在使用非常旧版本的 Jetty。可能是 Jetty 5 或 Jetty 6。这些早在 2010 年(或更早)就已经停产(EOL)。

回到 Jetty 6 天,有一个按需使用的 ThreadPool,根据您的连接器类型,它要么导致每个连接一个线程(称为阻塞连接器),要么每个 nio 选择一个线程(在这种情况下,您的 1 个连接在连接的生命周期内有许多线程,但每个连接的 Activity 线程永远不会超过 1 个)。

从 Jetty 8 和 Servlet 异步开始,这个线程模型被重构以支持更多请求处理的异步行为。

在 Jetty 9 中,所有阻塞连接器都被放弃,转而支持请求、输入流和输出流的完全异步处理。

当前模型是仅在连接需要时按需使用线程的 ThreadPool(这可以用于处理请求或响应,或读取请求正文内容,或写入响应正文内容,或 Activity 的 websocket 流等...)

此模型是基于 SPDY 和 HTTP/2 的支持的首选,在这种情况下,每个物理连接有多个请求。但要知道,在这些模型中,每个物理连接很可能有多个 Activity 线程,具体取决于 servlet 的行为。

此外,Web 应用程序本身可以选择启动更多线程来进行自己的处理,例如通过 Servlet 异步处理行为,或者向其他服务发起传出请求,或者处理与特定任务无关的其他任务请求/响应上下文。

关于java - Flume的HttpSource : is the Jetty server multithread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30231343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com