architecture
description: 'Всеобъемлющий обзор архитектуры ClickHouse и его столбцового дизайна' sidebar_label: 'Обзор архитектуры' sidebar_position: 50 slug: /development/architecture title: 'Обзор архитектуры'
API ConcurrencyControl состоит из следующих функций:
- Создать распределение ресурсов для запроса:
auto slots = ConcurrencyControl::instance().allocate(1, max_threads);. Это распределит как минимум 1 и максимумmax_threadsслот. Обратите внимание, что первый слот выделяется немедленно, но оставшиеся слоты могут быть выделены позже. Таким образом, лимит является мягким, потому что каждый запрос получит как минимум один поток. - Для каждого потока слот должен быть получен из распределения:
while (auto slot = slots->tryAcquire()) spawnThread([slot = std::move(slot)] { ... });. - Обновить общее количество слотов:
ConcurrencyControl::setMaxConcurrency(concurrent_threads_soft_limit_num). Это можно сделать в рабочем режиме, без перезапуска сервера.
Этот API позволяет запросам начинать с как минимум одного потока (в условиях давления CPU) и впоследствии масштабироваться до max_threads.