如何查询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
相关产品推荐
相关产品推荐

