You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询HTTP ClickHouse连接的并发请求数限制?

如何查询HTTP ClickHouse连接的并发请求数限制?

遇到429 "Too many requests" 错误确实是因为你的并发请求数超出了ClickHouse服务(或前置代理)的限制,下面我来一步步告诉你如何查询具体限制参数,以及怎么配合你的代码解决问题:

一、查询ClickHouse自身的HTTP并发限制参数

你可以直接通过ClickHouse的system.settings系统表查询所有和HTTP连接、并发相关的配置:

SELECT name, value, description
FROM system.settings
WHERE name LIKE '%http%connection%' 
   OR name LIKE '%max%session%'
   OR name LIKE '%quota%';

重点关注这几个关键参数:

  • max_http_connections:ClickHouse HTTP服务允许的最大并发连接数,这是最直接影响你并发请求数的参数。
  • max_sessions:ClickHouse全局允许的最大会话数,每个HTTP请求会占用一个会话,所以这个值也会间接限制并发请求量。
  • http_max_requests_per_connection:单个HTTP连接可以处理的最大请求数,虽然不直接限制并发,但如果你的客户端复用连接的话,也需要留意这个值。

如果你的ClickHouse是集群部署,还可以查询system.clusters表确认集群级别的配额限制:

SELECT * FROM system.clusters WHERE cluster = 'your_cluster_name';

二、检查前置代理的限制(如果有的话)

很多生产环境中,ClickHouse前面会部署反向代理(比如Nginx),此时429错误也可能是代理层的并发限制导致的。如果是你自己管理代理,可以检查代理配置中的limit_conn_zone(连接数限制)或limit_req_zone(请求频率限制)规则;如果是托管服务,可以联系服务商确认配额。

三、修改代码用信号量控制并发

查到具体限制值后,你可以用asyncio.Semaphore来严格控制同时发起的请求数,避免触发429错误。比如假设你查到允许的最大并发数是8,就把信号量设置为8(也可以留一点余量,比如6,避免接近阈值):

修改后的代码示例:

import asyncio

import clickhouse_connect

# 设置信号量,值根据查询到的限制调整
semaphore = asyncio.Semaphore(6)

async def query(order: int):
    async with semaphore:  # 每次执行query前先获取信号量,超过限制会等待
        await asyncio.sleep(0.2 * order)
        return await client.query(sleep_query)


n = 10
client = await clickhouse_connect.get_async_client(
    host=config["host"],
    username=config["username"],
    password=config["password"],
    port=config["port"],
    database=config["database"],
    secure=False,
    send_receive_timeout=7200,
)

sleep_query = "SELECT sleep(3)"

await asyncio.gather(*(query(i) for i in range(n)))

这样就能保证同时执行的请求数不会超过信号量设定的值,完美规避429错误。

备注:内容来源于stack exchange,提问作者Vovin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:00:30