Как узнать ограничение количества одновременных запросов для HTTP-соединения ClickHouse?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как узнать ограничение количества одновременных запросов для HTTP-соединения ClickHouse?

Сообщение Anonymous »

Я использовал следующий код в блокноте Jupyter для одновременной отправки нескольких запросов:

Код: Выделить всё

import asyncio

import clickhouse_connect

async def query(order: int):
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)))
Пока n не превысит 6, все работает нормально. Но после этого я могу поймать следующее исключение:

Код: Выделить всё

---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
Cell In[31], line 13
1 client = await clickhouse_connect.get_async_client(
2     host=config["host"],
3     username=config["username"],
(...)
8     send_receive_timeout=7200,
9 )
11 sleep_query = "SELECT sleep(3)"
---> 13 await asyncio.gather(*(query(i) for i in range(10)))

Cell In[30], line 3, in query(order)
1 async def query(order: int):
2     await asyncio.sleep(0.2 * order)
----> 3     return await client.query(sleep_query)

File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\asyncclient.py:96, in AsyncClient.query(self, query, parameters, settings, query_formats, column_formats, encoding, use_none, column_oriented, use_numpy, max_str_len, context, query_tz, column_tzs, external_data)
89     return self.client.query(query=query, parameters=parameters, settings=settings, query_formats=query_formats,
90                              column_formats=column_formats, encoding=encoding, use_none=use_none,
91                              column_oriented=column_oriented, use_numpy=use_numpy, max_str_len=max_str_len,
92                              context=context, query_tz=query_tz, column_tzs=column_tzs,
93                              external_data=external_data)
95 loop = asyncio.get_running_loop()
---> 96 result = await loop.run_in_executor(self.executor, _query)
97 return result

File ~\miniforge3\envs\sample_size_calculator\Lib\concurrent\futures\thread.py:59, in _WorkItem.run(self)
56     return
58 try:
---> 59     result = self.fn(*self.args, **self.kwargs)
60 except BaseException as exc:
61     self.future.set_exception(exc)

File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\asyncclient.py:89, in AsyncClient.query.._query()
88 def _query():
---> 89     return self.client.query(query=query, parameters=parameters, settings=settings, query_formats=query_formats,
90                              column_formats=column_formats, encoding=encoding, use_none=use_none,
91                              column_oriented=column_oriented, use_numpy=use_numpy, max_str_len=max_str_len,
92                              context=context, query_tz=query_tz, column_tzs=column_tzs,
93                              external_data=external_data)

File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\client.py:222, in Client.query(self, query, parameters, settings, query_formats, column_formats, encoding, use_none, column_oriented, use_numpy, max_str_len, context, query_tz, column_tzs, external_data)
220         return response.as_query_result()
221     return QueryResult([response] if isinstance(response, list) else [[response]])
--> 222 return self._query_with_context(query_context)

File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\httpclient.py:229, in HttpClient._query_with_context(self, context)
227     fields = None
228     headers['Content-Type'] = 'text/plain; charset=utf-8'
--> 229 response = self._raw_request(body,
230                              params,
231                              headers,
232                              stream=True,
233                              retries=self.query_retries,
234                              fields=fields,
235                              server_wait=not context.streaming)
236 byte_source = RespBuffCls(ResponseSource(response))  # pylint: disable=not-callable
237 context.set_response_tz(self._check_tz_change(response.headers.get('X-ClickHouse-Timezone')))

File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\httpclient.py:457, in HttpClient._raw_request(self, data, params, headers, method, retries, stream, server_wait, fields, error_handler)
455 if response.status in (429, 503, 504):
456     if attempts > retries:
-->  457         self._error_handler(response, True)
458     logger.debug('Retrying requests with status code %d', response.status)
459 elif error_handler:

File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\httpclient.py:385, in HttpClient._error_handler(self, response, retried)
382 else:
383     err_str = 'The ClickHouse server returned an error.'
--> 385 raise OperationalError(err_str) if retried else DatabaseError(err_str) from None

OperationalError: HTTPDriver for https://ch..com:443 returned response code 429
Насколько мне известно, ошибка HTTP 429 означает «Слишком много запросов». Но как получить лимитные параметры явно через SELECT-запрос ClickHouse или каким-либо другим способом? Чтобы я мог настроить семафор asyncio на максимально допустимое число, чтобы избежать исключения.

Подробнее здесь: https://stackoverflow.com/questions/793 ... connection
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»