Перейти к основному содержимому
Перейти к основному содержимому

architecture

description: 'Всеобъемлющий обзор архитектуры ClickHouse и его столбцового дизайна' sidebar_label: 'Обзор архитектуры' sidebar_position: 50 slug: /development/architecture title: 'Обзор архитектуры'

API ConcurrencyControl состоит из следующих функций:

  1. Создать распределение ресурсов для запроса: auto slots = ConcurrencyControl::instance().allocate(1, max_threads);. Это распределит как минимум 1 и максимум max_threads слот. Обратите внимание, что первый слот выделяется немедленно, но оставшиеся слоты могут быть выделены позже. Таким образом, лимит является мягким, потому что каждый запрос получит как минимум один поток.
  2. Для каждого потока слот должен быть получен из распределения: while (auto slot = slots->tryAcquire()) spawnThread([slot = std::move(slot)] { ... });.
  3. Обновить общее количество слотов: ConcurrencyControl::setMaxConcurrency(concurrent_threads_soft_limit_num). Это можно сделать в рабочем режиме, без перезапуска сервера.

Этот API позволяет запросам начинать с как минимум одного потока (в условиях давления CPU) и впоследствии масштабироваться до max_threads.