Табличный движок NATS
Этот движок позволяет интегрировать ClickHouse с NATS.
NATS позволяет:
- Публиковать сообщения в сабжекты (subjects) или подписываться на них.
- Обрабатывать новые сообщения по мере их появления.
Создание таблицы
Обязательные параметры:
nats_url– host:port (например,localhost:5672).nats_subjects– Список subject, к которым таблица NATS подписывается/в которые публикует. Поддерживаются шаблоны subject с подстановочными знаками, такие какfoo.*.barилиbaz.>.nats_format– Формат сообщений. Использует ту же нотацию, что и SQL-функцияFORMAT, напримерJSONEachRow. Дополнительные сведения см. в разделе Formats.
Необязательные параметры:
nats_schema– Параметр, который необходимо использовать, если формат требует определения схемы. Например, Cap'n Proto требует путь к файлу схемы и имя корневого объектаschema.capnp:Message.nats_stream– Имя существующего потока (stream) в NATS JetStream.nats_consumer– Имя существующего постоянного (durable) pull-консьюмера в NATS JetStream.nats_num_consumers– Количество консьюмеров на таблицу. Значение по умолчанию:1. Укажите больше консьюмеров, если пропускной способности одного консьюмера недостаточно (только для NATS core).nats_queue_group– Имя группы очереди для подписчиков NATS. По умолчанию используется имя таблицы.nats_max_reconnect– Устаревший параметр, не оказывает никакого эффекта, переподключение выполняется постоянно с таймаутомnats_reconnect_wait.nats_reconnect_wait– Время в миллисекундах для ожидания между каждой попыткой переподключения. Значение по умолчанию:5000.nats_server_list– Список серверов для подключения. Может быть указан для подключения к кластеру NATS.nats_skip_broken_messages– Допуск парсера сообщений NATS к сообщениям, несовместимым со схемой, в пределах одного блока. Значение по умолчанию:0. Еслиnats_skip_broken_messages = N, то движок пропускает N сообщений NATS, которые не могут быть разобраны (сообщение соответствует одной строке данных).nats_max_block_size– Количество строк, собираемых в результате опроса (poll) для сброса данных из NATS. Значение по умолчанию: max_insert_block_size.nats_flush_interval_ms– Таймаут для сброса данных, прочитанных из NATS. Значение по умолчанию: stream_flush_interval_ms.nats_username– Имя пользователя NATS.nats_password– Пароль NATS.nats_token– Токен аутентификации NATS.nats_credential_file– Путь к файлу учетных данных NATS.nats_startup_connect_tries– Количество попыток подключения при старте. Значение по умолчанию:5.nats_max_rows_per_message— Максимальное количество строк, записываемых в одно сообщение NATS для построчных форматов (по умолчанию:1).nats_handle_error_mode— Режим обработки ошибок для движка NATS. Возможные значения:default(будет сгенерировано исключение, если не удалось разобрать сообщение),stream(сообщение об исключении и исходное сообщение будут сохранены во виртуальных столбцах_errorи_raw_message).
SSL-подключение:
Для безопасного соединения используйте nats_secure = 1.
Поведение используемой библиотеки по умолчанию состоит в том, что она не проверяет, достаточно ли безопасно установленное TLS‑соединение. Просрочен ли сертификат, самоподписан, отсутствует или недействителен — соединение всё равно устанавливается. Более строгая проверка сертификатов может быть реализована в будущем.
Запись в таблицу NATS:
Если таблица читает только из одного subject, любая операция INSERT будет публиковаться в тот же subject.
Однако, если таблица читает из нескольких subject, необходимо указать, в какой subject мы хотим публиковать.
Поэтому при вставке в таблицу с несколькими subject требуется установить stream_like_engine_insert_queue.
Вы можете выбрать один из subject, из которых читает таблица, и публиковать туда свои данные. Например:
Параметры форматирования можно указать вместе с настройками, связанными с NATS.
Пример:
Конфигурацию сервера NATS можно задать в конфигурационном файле ClickHouse. В частности, вы можете указать пароль Redis для движка NATS:
Описание
SELECT не особенно полезен для чтения сообщений (кроме отладки), потому что каждое сообщение может быть прочитано только один раз. Гораздо практичнее создавать потоки в реальном времени с помощью материализованных представлений. Для этого:
- Используйте движок для создания потребителя NATS и рассматривайте его как поток данных.
- Создайте таблицу с нужной структурой.
- Создайте материализованное представление, которое преобразует данные из движка и помещает их в ранее созданную таблицу.
Когда MATERIALIZED VIEW подключается к движку, оно начинает собирать данные в фоновом режиме. Это позволяет постоянно получать сообщения из NATS и преобразовывать их в требуемый формат с помощью оператора SELECT.
Одна таблица NATS может иметь любое количество материализованных представлений; они не читают данные из таблицы напрямую, а получают только новые записи (блоками). Таким образом, вы можете записывать данные в несколько таблиц с разной степенью детализации (с группировкой — агрегацией и без нее).
Пример:
Чтобы прекратить приём потоковых данных или изменить логику преобразования, отсоедините материализованное представление:
Если вы хотите изменить целевую таблицу с помощью ALTER, рекомендуем предварительно отключить материализованное представление, чтобы избежать расхождений между целевой таблицей и данными из представления.
Виртуальные столбцы
_subject— тема сообщения NATS. Тип данных:String.
Дополнительные виртуальные столбцы при nats_handle_error_mode='stream':
_raw_message— исходное сообщение, которое не удалось успешно распарсить. Тип данных:Nullable(String)._error— текст исключения, возникшего при неудачном парсинге. Тип данных:Nullable(String).
Примечание: виртуальные столбцы _raw_message и _error заполняются только в случае возникновения исключения при парсинге; при успешном парсинге сообщения они всегда имеют значение NULL.
Поддержка форматов данных
Движок NATS поддерживает все форматы, поддерживаемые в ClickHouse. Количество строк в одном сообщении NATS зависит от того, является ли формат строковым или блочным:
- Для строковых форматов количеством строк в одном сообщении NATS можно управлять с помощью настройки
nats_max_rows_per_message. - Для блочных форматов блок нельзя разделить на более мелкие части, но количеством строк в одном блоке можно управлять с помощью общей настройки max_block_size.
Использование JetStream
Прежде чем использовать движок NATS с NATS JetStream, необходимо создать поток NATS (stream) и устойчивого (durable) pull‑consumer'а. Для этого можно использовать, например, утилиту nats из пакета NATS CLI:
создание stream'а
создание устойчивого pull‑consumer'а
После создания stream'а и устойчивого pull‑consumer'а можно создать таблицу с движком NATS. Для этого необходимо инициализировать параметры: nats_stream, nats_consumer_name и nats_subjects: