TongWeb中通道的线程任务队列大小(queueSize)和TCP等待队列大小(acceptCount)参数的含义和关系

TongWeb中通道maxQueueSize和acceptCount参数的含义和区别

在 TongWeb中,maxQueueSize 和 acceptCount 是两个与请求处理队列相关的核心参数,它们共同作用于并发请求的接收和处理流程,但所处的层面和作用机制有显著区别。理解两者的差异和协作关系,对优化 TongWeb 高并发性能至关重要。

  • 参数定义与作用

1. acceptCount(操作系统层面的连接队列)

  • 作用:控制操作系统内核维护的 TCP 连接队列(backlog 队列) 的最大长度。当 TongWeb 的工作线程全部忙碌时,新到来的 TCP 连接会先进入该队列等待,直到有线程空闲后再被处理。
  • 本质:这是操作系统层面的队列,用于暂存 “已建立但未被 TongWeb 应用层处理” 的 TCP 连接。
  • 默认值:TongWeb8企业版默认值为500;TongWeb7嵌入式版本默认值为100。
  • 队列满时的行为:若队列已满,新的 TCP 连接会被操作系统直接拒绝,客户端会收到 “Connection Refused” 错误(无法建立连接)。

2. maxQueueSize(TongWeb 应用层面的请求队列)

  • 作用:控制 TongWeb 应用内部维护的 请求处理队列 的最大长度。当所有工作线程(由 maxThreads 控制)都在处理请求时,已建立 TCP 连接的请求会进入该队列等待线程空闲。
  • 本质:这是 TongWeb 应用层的队列,用于暂存 “已建立连接但未被线程处理” 的 HTTP 请求。
  • 默认值:TongWeb8企业版默认值为100000;TongWeb7嵌入式版本默认值未知(无限制?),且只能通过代码配置。
  • 队列满时的行为:若队列已满,TongWeb 会直接拒绝请求,并返回 HTTP 503 Service Unavailable 错误(连接已建立,但请求被拒绝处理)。
  • 工作流程与协作关系

当客户端向 TongWeb 发送请求时,流程如下:

  1. 建立 TCP 连接:客户端先与 TongWeb 服务器建立 TCP 连接,若此时 TongWeb 工作线程空闲,连接会直接被处理;
  2. 进入 acceptCount 队列:若工作线程全部忙碌,新的 TCP 连接会进入操作系统的 acceptCount 队列等待;
  3. 进入 maxQueueSize 队列:当工作线程从 acceptCount 队列中取出连接后,若线程仍忙碌,请求会被放入 TongWeb 应用层的 maxQueueSize 队列等待;
  4. 处理请求:工作线程空闲时,从 maxQueueSize 队列中取出请求并执行。

示意图

客户端请求 → TCP 握手 → [acceptCount 队列(操作系统)] → [maxQueueSize 队列(TongWeb 应用)] → 工作线程处理

  • 核心区别

维度

acceptCount

maxQueueSize

作用层面

操作系统内核(TCP 连接层)

TongWeb 应用层(HTTP 请求处理层)

队列内容

暂存 “已建立但未被 TongWeb 处理” 的 TCP 连接

暂存 “已被 TongWeb 接收但未被线程处理” 的 HTTP 请求

满队列行为

拒绝 TCP 连接(返回 Connection Refused)

拒绝 HTTP 请求(返回 503 错误)

依赖条件

与操作系统内核参数(如 net.core.somaxconn)相关

仅依赖 TongWeb 应用配置,与操作系统无关

版本支持

所有 TongWeb 版本均支持配置

TongWeb7嵌入式版本只能通过代码配置

默认值

TongWeb8企业版本500、TongWeb7嵌入式版100

TongWeb8企业版100000;TongWeb7嵌入式版本未知(无限制?)

  • 配置建议
  1. 高并发场景
    • 若客户端频繁出现 Connection Refused,说明 acceptCount 过小,需增大(如调整为 200-500);
    • 若频繁出现 503 错误,说明 maxQueueSize 或工作线程(maxThreads)不足,需根据请求处理耗时调整队列长度或增加线程数。
  2. 参数配合
    • 通常 maxQueueSize 应大于 acceptCount,避免应用层队列先满导致请求被拒绝;
  3. TongWeb8企业版本配置示例

在TongWeb8的通道配置中,有

<connector SSLDisableCompression="true" SSLDisableSessionTickets="false" SSLEnabled="false" SSLHonorCipherOrder="false" SSLVerifyClient="NONE" SSLVerifyDepth="10" URIEncoding="UTF-8" acceptCount="500" address="0.0.0.0" algorithm="SunX509" allowHostHeaderMismatch="false" allowMethods="GET,POST" asyncTimeout="30000" clientAuth="false" compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml" compression="off" compressionMinSize="2048" connectionLinger="-1" connectionTimeout="60000" connectionUploadTimeout="300000" defaultSSLHostConfigName="_default_" disableUploadTimeout="true" discardFacades="false" enableKAE="false" enableLookups="false" encodedSolidusHandling="reject" gmEnabled="false" http2Enabled="false" httpRedirect="true" ignoreHeader="false" keepAliveTimeout="60000" keystoreFile="conf/server.keystore" keystoreType="JKS" maxConnections="10000" maxCookieCount="200" maxExtensionSize="8192" maxHeaderCount="100" maxHttpHeaderSize="8192" maxKeepAliveRequests="1000" maxParameterCount="10000" maxPostSize="-1" maxSavePostSize="4096" maxSwallowSize="2097152" maxThreads="3" maxTrailerSize="8192" minSpareThreads="3" name="server" noCompressionStrongETag="true" parseBodyMethods="POST,PUT" pollerThreadCount="1" pollerThreadPriority="5" port="8088" portOffset="0" processorCache="1000" protocol="com.tongweb.coyote.http11.Http11NioProtocol" proxyPort="1" queueSize="100000" redirectPort="443" relaxedPathChars="&quot;&lt;&gt;[\]^`{|}" relaxedQueryChars="&quot;&lt;&gt;[\]^`{|}" scheme="http" secure="false" selectorTimeout="1000" sendfileSize="48" serverRemoveAppProvidedValues="false" sessionCacheSize="-1" sessionTimeout="86400" skipCharsValidate="false" sniParseLimit="65536" systemManaged="true" tcpNoDelay="true" threadKeepAliveTime="60" threadPriority="5" throwOnFailure="false" trustMaxCertLength="10" truststoreAlgorithm="PKIX" truststoreType="JKS" useBodyEncodingForURI="false" useIPVHosts="false" useKeepAliveResponseHeader="false" useNetworkMonitor="false" useSendfile="false" useServerCipherSuitesOrder="false" useVirtualThreads="false" xpoweredBy="false"/>

  1. TongWeb7企业版配置示例

在TongWeb7嵌入式版本中的配置

server.port=8089

#设置tongweb的最大工作线程数

server.tongweb.max-threads=3

#最小工作线程,连接池中应用保护的最小空余线路数

server.tongweb.min-spare-threads=1

#最大的线程等待队列数,当线程满后,线程的请求会进入次队列数,如果等待队列满了会拒绝请求

server.tongweb.max-queue-size=3

#最大连接数

server.tongweb.max-connections=3

#最大的连接等待队列大小,当连接数满后,连接会进入次等待队列,等待队列满后,连接会被拒绝

server.tongweb.accept-count=3

TongWeb7.0..e.7之前版本的max-queue-size不能直接配置,需要在代码中添加配置参数,如下:

@Configuration
public class TongWebConfig {

    @Value("${server.tongweb.max-queue-size:100}")
    private int maxQueueSize;

    @Bean
    public WebServerFactoryCustomizer<TongWebServletWebServerFactory> webServerFactoryCustomizer() {
        return factory -> factory.addConnectorCustomizers(
                (TongWebConnectorCustomizer) connector -> {
                    // 从配置文件读取 maxQueueSize 的值,默认为 100
                    //int maxQueueSize = 3; // 可以替换为从配置文件读取的值
                    connector.setAttribute("maxQueueSize", maxQueueSize);
                }
        );
    }
}

  1. 监控与调优
    • 通过 JMX 监控队列长度(如 acceptCount 使用率、maxQueueSize 排队数),避免队列过长导致请求超时;
    • 结合请求处理时间调整:若请求处理快(如 100ms 内),队列可设小些;若处理慢(如 1s+),队列可适当增大。
  • 总结
  • acceptCount 是 “连接入口” 的第一道防线,控制操作系统能暂存的最大连接数;
  • maxQueueSize 是 “请求处理” 的第二道防线,控制 TongWeb 应用能暂存的最大请求数;
  • 两者需配合 maxThreads(工作线程数)共同优化,避免因队列过小导致请求被拒,或队列过大导致内存溢出(OOM)。

Read more

如何前端对接豆包api并在抖音直播间实现互动(1/3):注册豆包apikey

如何前端对接豆包api并在抖音直播间实现互动(1/3):注册豆包apikey

前段时间,我女朋友公司正忙着抖音直播买红酒的业务,头疼的是,直播间的在线人数一直少得可怜,每次开播都是寥寥无几的观众,愁得唉声叹气。正好那段时间我手头没什么急事,闲着也是闲着,突然蹦出一个想法,能不能做个插件帮她盘活直播间的氛围。         核心思路就是用前端技术打通几个关键环节:一方面对接豆包的智能对话接口,另一方面嵌入计时器功能,再加上网页元素捕捉的模块。         我去市面上搜了一圈,发现好像还真没有类似的工具。其实这个插件的技术难度不算高,无非是把前端的页面交互、接口调用和网页抓取这些基础技能整合到一起,但感觉特别有意思,看到插件在直播间里正常运转,那种成就感真的很难得。更重要的是,这个小玩意儿能帮到她,让她不用再为直播间没说话而发愁,这就足够了。 首先我们要先去豆包api的官网,进行相关注册和申请权限。 1.访问官网进行相关注册: 火山引擎-你的AI云https://www.volcengine.com/ 2.注册完成后点击上面产品找到豆包大模型 3.进入控制台后点击进入apikey管理并创建apikey 此时我们已经完成api

前端也能玩转:用Fabric.js轻松实现图形拖拽缩放旋转(附实战技巧)

前端也能玩转:用Fabric.js轻松实现图形拖拽缩放旋转(附实战技巧)

前端也能玩转:用Fabric.js轻松实现图形拖拽缩放旋转(附实战技巧) * 小白前端也能玩转:用Fabric.js轻松实现图形拖拽缩放旋转(附实战技巧) * 原生API写拖拽?那简直是手搓发动机啊 * Fabric.js其实就是Canvas的"美颜滤镜"加"自动挡" * 三分钟搭个能"动"的画布 * 平移旋转缩放?鼠标手势随心所欲 * 那些文档里不写的坑,我血都吐出来了 * 性能优化:别让网页变成PPT * 懒人开发技巧:让代码又稳又省事 * 你以为这就完了?Fabric还能搞更多骚操作 * 线上翻车实录:文档没告诉你的那些破事 * 调试Fabric就像修水管 * 别把Fabric当银弹,但也别自己手搓轮子 小白前端也能玩转:用Fabric.js轻松实现图形拖拽缩放旋转(附实战技巧) 小白前端也能玩转:用Fabric.js轻松实现图形拖拽缩放旋转(附实战技巧) 说实话,第一次接到要在网页里做个"

WebVOWL 终极安装配置指南:快速实现本体可视化

WebVOWL 终极安装配置指南:快速实现本体可视化 【免费下载链接】WebVOWLVisualizing ontologies on the Web 项目地址: https://gitcode.com/gh_mirrors/we/WebVOWL WebVOWL 是一个专业的开源本体可视化工具,能够将复杂的 OWL 本体和 RDF 数据转换为直观的图形化表示。本指南将为您提供完整的安装配置方案,让您轻松上手这款强大的数据可视化工具。 环境准备与前置要求 在开始安装之前,请确保您的系统满足以下基本要求: 系统环境检查清单: * Node.js 运行时环境(版本 12 或更高) * Git 版本控制工具 * 至少 2GB 可用磁盘空间 四步快速安装流程 第一步:获取项目源码 打开命令行工具,执行以下命令克隆项目: git clone https://gitcode.

Wfuzz 全面使用指南:Web 应用模糊测试工具详解

Wfuzz 全面使用指南:Web 应用模糊测试工具详解

Wfuzz 是一款功能强大的开源 Web 应用模糊测试(Fuzzing)工具,主要用于自动化发现 Web 应用中的隐藏资源、注入漏洞、目录遍历等问题。它由 Python 编写,支持多种 payload(有效载荷)注入方式,能够对 HTTP 请求的各个部分进行暴力破解或模糊测试,包括 URL 路径、GET/POST 参数、Cookie、HTTP 头、认证信息等。Wfuzz 的设计理念是模块化和可扩展性强,适合渗透测试人员、安全研究员和开发人员用于 Web 安全评估。 Wfuzz 的核心机制是通过在目标 URL 或请求中用特殊的占位符(如 FUZZ、FUZ2Z 等)标记需要模糊测试的位置,然后用指定的 payload 列表逐一替换这些占位符,发送