====== NATS ======
===== Общие сведения =====
Брокер сообщений. Состоит сервера, клиентской библиотеки и есть еще коннектор\\
Для подключения **нового узла в кластер**, достаточно ему указать адрес любого другого узла этого кластера, он получит всю топологию и определит живые/мертвые узлы.\\
Сообщения **группируются по темам** и каждый узел знает какие узлы имеют живых подписчиков и на какие темы.\\
Все сообщения в кластере **доставляются напрямую** от отправителя получателю, без промежуточных шагов. Nats не записывает сообщения на диск\\
Клиенты знают **всю топологию кластера**, поэтому способны сами переподключаться при потери связи\\
Работает на порту "**4222**"\\
**NATS & NATS Streaming**\\
NATS реализует **базовую модель** "публикации/подписки" в то время как **Streaming** предоставляет более **расширенные варианты**.\\
**NATS Streaming** устаревшее, работало через другой exe, актуальная реализация это **JetStream**, является надстройкой и встроено в тот же ехе, достаточно запустить с аргументом "-js"\\
**Авторизация** поддерживается как по логину/паролю так и по токену. Есть настройка разрешений подписки/публикации\\
Для **настройки кластера** нужно добавить параметры в файл конфигурации каждого хоста, к каждому можно настроить метод аутентификации\\
:!: Образец конфигурации
cluster {
host: '0.0.0.0'
port: 7248
routes = [
nats-route://192.168.59.103:7244
nats-route://192.168.59.103:7246
]
}
**Мониторинг**
Для мониторинга предусмотрен аргумент запуска **"-m your_port"**, очень простая, для более расширенного варианта есть утилита **"nats-top"**\\
При активном соединении работает "Ping/Pong", параметризовано вроде\\
===== Конфигурация =====
Указываются порты для хоста и для кластера отдельно и оба работают, видимо и подключения отличаются\\
:!: Пример конфигурации c tls и кластером
debug: true
trace: false
log_file: "c:/path/logs/name.log"
http_port: 8222 # HTTP monitoring port
port: 4222
tls {
cert_file: "c:/path/name.crt"
key_file: "c:/path/name.key"
ca_file: "c:/path/rootCA.crt"
}
cluster {
listen: 0.0.0.0:5222
routes = [
nats-route://ip-1:5222
nats-route://ip-2:5222
]
tls {
cert_file: "c:/path/name.crt"
key_file: "c:/path/name.key"
ca_file: "c:/path/rootCA.crt"
}
}
**Базовый функционал**\\
Обеспечивает высокую эффективность (но согласованность не гарантируется)\\
Полезно для данных не критичных к своевременности и согласованности\\
:!: Пример конфигурации
# Client port
port: 4222
# HTTP monitoring port
monitor_port: 4223
# Пользователь
authorization {
users = [
{пользователь: << имя пользователя1>>, пароль: << пароль1>>}
]
timeout: 1
}
# This is for clustering multiple servers together.
cluster {
# Интерфейс кластера
port: 4224
# Аутентификация кластерной ссылки
authorization {
пользователь: << имя пользователя2>>
пароль: << пароль2>>
timeout: 0.75
}
# Информация о кластере
routes = [
nats-route:// << имя пользователя 2 >>: << пароль 2 >> @ nats-1: 4224
nats-route:// << имя пользователя 2 >>: << пароль 2 >> @ nats-2: 4224
]
}
**Потоковая передача**\\
Обеспечивает гарантию согласованности. Методы типа ACK и "гарантия минимум одного прохода" помогают в этом\\
Вроде как можно развернуть на основе обычного кластера, из примера выше\\
Исполняемый файл уже содержит в себе данный функционал, для запуска используется аргумент "-js"\\
:!: Потоковая передача - JetStream
Тот же конфиг, добавляем только одну группу и в параметры запуска тоже добавить- "-js --cluster_name nats-js"
(...)
jetstream {
store_dir="K:/PF/Nats/data/jetstream"
}
(...)
===== Установка =====
==== Windows ====
Все предельно просто, есть несколько вариантов: какой то менеджер пакетов "choco", интерпретатор go, и скачать дистрибутив\\
В последнем случае [[https://github.com/nats-io/nats-server/releases/tag/v2.9.3|скачиваем]], утилитой "sc" назначаем службой, параметры запуска/конфиги это уже все здесь и опционально\\
Используя флаги можно запускать на одном хосте несколько экземпляров, после запуска службой можно управлять аргументом "--signal"\\
sc.exe create nats-server binPath="c:\nats\nats-server.exe --config=c:\nats\app.conf"
sc.exe start nats-server
# REM Reload server configuration (сигналы под вопросом)
nats-server.exe --signal reload
# REM Stop the server
nats-server.exe --signal stop [=]
:!: CheatSheet
nats cheat
#############################################
Сохранение параметров в контекст
#############################################
nats context save sys --user sys --password pass
nats context select
nats --tlsca=./certs/rootCA.crt --server=162.55.230.171 stream ls
nats --tlsca=./certs/rootCA.crt --server=162.55.230.171 stream add brain_activity_protobuf --config ./stream_configs/brain_activity_protobuf.json
#############################################
Системная учетка
#############################################
добавить в конфиг
accounts: {
$SYS: {
users: [{user: sys, password: pass}]
}
}
затем в cli:
nats --context sys --user sys --password pass server list
#################################
Удаление хоста из метаданных
#################################
nats server cluster peer-remove RztkeQup
*******************************************************************
Названия стримов
brain.activity.protobuf (альтернатива Ice_AccountsActivity, только на protobuf)
brain.control.protobuf (альтернатива Ice_MesControl2ServerApp, только на protobuf).
nats --tlsca=./certs/rootCA.crt --server=162.55.230.171 stream add brain_activity_protobuf --config ./stream_configs/brain_activity_protobuf.json
nats --tlsca=./certs/rootCA.crt --server=162.55.230.171 --user sys --password pass stream ls
nats --tlsca=./certs/rootCA.crt --server=162.55.230.171 stream rm brain_activity_protobuf -f
nats --tlsca=./certs/rootCA.crt --server=162.55.230.171 stream add brain_activity_protobuf --config ./stream_configs/brain_activity_protobuf.json
nats --tlsca=./certs/rootCA.crt --server=162.55.230.171 stream add brain_control_protobuf --config ./stream_configs/brain_control_protobuf.json
nats --context sys stream ls
nats-cli.exe --tlsca=./certs/rootCA.crt --server=168.119.10.29 stream ls
nats-cli.exe --tlsca=./certs/rootCA.crt --server=135.181.6.30 stream ls
===== =====
==== ====
==== ====