NATS
NATs — это легкая и высокопроизводительная система сообщений с открытым исходным кодом, разработанная на языке go. Она обеспечивает уровень абстракции между приложением или сервисом и базовой физической сетью. Данные кодируются и отправляются в виде сообщения издателем. Сообщения принимаются, декодируются и обрабатываются одним или несколькими подписчиками.
NAT упрощает взаимодействие программ в различных средах, языках, облачных провайдерах и внутренних системах.
Преимущества
- Простота использования
- Высокая производительность
- Масштабирование с нулевым временем простоя
- Поддержка граничных, облачных и гибридных развертываний
Установите NATS в windows локально
choco install nats-server
Чтобы запустить простой демонстрационный сервер локально, просто запустите:
nats-server
nats-server -m 8222 (если вы хотите включить функцию мониторинга HTTP).
Вы также можете протестировать конечную точку мониторинга, просматривая http://localhost:8222 с помощью браузера.
Установка через Docker
docker pull nats:latest
Чтобы запустить NATS на docker
docker run -p 4222:4222 -ti nats:latest
Контейнеризация сервера NATS
docker pull nats
docker run nats
По умолчанию сервер NATS открывает несколько портов:
4222 — для клиентов.
8222 — порт управления HTTP для передачи информации.
6222 — порт маршрутизации для кластеризации.
Используйте -p или -P для настройки.
Или
docker run -it nats:alpine sh
docker run -itd nats:alpine
Чтобы запустить сервер с выставленными портами в сети docker:
docker network create nats
docker run --name nats --network nats --rm -p 4222:4222 -p 8222:8222 nats --http_port 8222
or
docker run --itd --restart always --name nats-alpine --network nats --rm -p 4222:4222 -p 8222:8222 nats:alpine --http_port 8222
NATS CLI
Загрузка сборки релиза
Вы можете найти последнюю версию nats-server https://github.com/nats-io/nats-server/releases.
Вы можете вручную загрузить zip-файл, соответствующий архитектуре вашей системы, и разархивировать его. Вы также можете использовать curl для загрузки определенной версии
Скачайте эту сборку (https://github.com/nats-io/nats-server/releases) «nats-0.0.33-windows-amd64» с этого URL, распакуйте на вашей машине, перейдите по указанному пути и выполните команду nats account info, которая покажет информацию об учетной записи. Выполните следующие команды для публикации или подписки на указанные сообщения
nats-server -js
nats account info
Опубликовать сообщение
nats publish hello my-data
Подписаться
nats subscribe hello
Запрос-ответ
nats request hello
Ответить
nats ответ hello данные
Контрольный образец
nats bench —msgs 1000 —pub 2 —sub 2 test
Сообщение на основе темы
По сути, NATs — это публикация и прослушивание сообщений. И то, и другое в значительной степени зависит от темы сообщения. Проще говоря, subject — это строка символов, которую издатели и подписчики могут использовать для поиска имен друг друга.
Публикация-подписка
NATS реализует модель распространения сообщений «публикация-подписка» для связи «один-ко-многим». Издатель посылает сообщение на тему, и любой активный подписчик, прослушивающий эту тему, получает сообщение. Подписчики могут также регистрировать интерес к темам с подстановочными знаками, которые работают немного как регулярные выражения (но только немного). Этот шаблон «один ко многим» иногда называют «веерным».
Пример
Pub
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
nc.Publish("foo", []byte("Hello World!"))
Sub
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
nc.Subscribe("foo", func(m *nats.Msg) {
fmt.Printf("Received a message: %sn", string(m.Data))
})
Ответ на запрос
Запрос-ответ — распространенный паттерн в современных распределенных системах. При отправке запроса приложение либо ожидает ответа с определенным таймаутом, либо получает ответ асинхронно. С ростом требований к сложности современных систем, многие технологии нуждаются в дополнительных компонентах для завершения полного набора функций.
NATs поддерживает эту модель благодаря своим основным механизмам коммуникации (публикация и подписка). Запрос публикуется вместе с темой ответа в определенной теме, а ответчик прослушивает эту тему и отправляет ответ в тему ответа. Темой ответа обычно является тема под названием «inbox», которая будет динамически направлена обратно запрашивающему, независимо от местонахождения любой из сторон.
Способность NATs даже позволяет использовать несколько ответов, первый из которых используется, а дополнительные ответы система отбрасывает. Это позволяет сложной схеме иметь несколько ответчиков для уменьшения задержки и дрожания ответа.
Перейдите по пути /nats-0.0.33-windows-amd64 и выполните следующие команды
1.Start the first member of the queue group (In new window)
nats reply hello "service instance A Reply# {{Count}}"
2.Start the second member of the queue group [In new window]
> nats reply hello "service instance B Reply# {{Count}}"
3.Start the thrid member of the queue group [In new window]
> nats reply hello "service instance C Reply# {{Count}}"
4.Publish NATS Message [In new window]
> nats request foo "Simple request"
5.Publish another Message [In new window]
> nats pub foo "Another simple request"
Вы должны увидеть, что только один из подписчиков группы hello получает сообщение и отвечает на него, а также вы можете увидеть, какой из доступных подписчиков hello обработал запрос из полученного ответного сообщения (т.е. экземпляр службы A, B или C).
Пример
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
nc.Subscribe("foo", func(m *nats.Msg) {
nc.Publish(m.Reply, []byte("I will help you"))
})
reply, _ := nc.Request("foo", []byte("help"), 50*time.Millisecond)
fmt.Println(string(reply.Data))
Группа очередей
NATs предоставляет встроенную функцию балансировки нагрузки, называемую распределенными очередями. Использование абонентов очереди балансирует обмен сообщениями между набором абонентов, что может быть использовано для обеспечения отказоустойчивости приложений и обработки крупномасштабных рабочих нагрузок.
Чтобы создать подписку на очередь, необходимо, чтобы абонент зарегистрировал только имя очереди. Все абоненты с одинаковым именем очереди образуют группу очереди. Конфигурация не требуется. Когда сообщение публикуется в зарегистрированной теме, случайным образом выбирается член группы для получения сообщения. Хотя группа очереди имеет несколько абонентов, каждое сообщение используется только одним абонентом.
Важной особенностью NAT является то, что группы очередей определяются приложением и его подписчиками очередей, а не конфигурацией сервера.
Подписчики очередей идеально подходят для расширенных сервисов. Увеличение масштаба — это просто запуск другого приложения, а уменьшение масштаба — завершение работы приложения сигналом, исчерпывающим запущенный запрос. Такая гибкость и отсутствие необходимости изменения конфигурации делают NAT отличной технологией коммуникации сервисов, которая может работать со всеми технологиями платформы.
Пример:
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
received := 0
nc.QueueSubscribe("foo", "worker_group", func(_ *nats.Msg) {
received++
})
Благодарности
В системах, имеющих до одной семантики, сообщения иногда теряются. Если ваше приложение выполняет ответ на запрос, оно должно использовать тайм-аут для обработки любых сбоев сети или приложения. Всегда полезно устанавливать тайм-аут на запрос и использовать код, который обрабатывает тайм-аут. При публикации события или потока данных одним из способов обеспечения доставки сообщения является преобразование его в ответ на запрос с помощью концепции ACK. В сетях NAT ACK может быть пустым сообщением, сообщением без полезной нагрузки.
Пример:
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
nc.Subscribe("foo", func(m *nats.Msg) {
//nc.Publish(m.Reply, []byte("I will help you"))
m.Respond([]byte(""))
})
reply, _ := nc.Request("foo", []byte("help"), 50*time.Millisecond)
fmt.Println("ack:", string(reply.Data))
NATS-TOP
nats-top — это похожий на top инструмент для мониторинга серверов nats-серверов.
Инструмент nats-top обеспечивает динамическое представление сервера NATS в реальном времени. nats-top может отображать различную системную сводную информацию о сервере NATS, такую как подписка, ожидающие байты, количество сообщений и многое другое, в реальном времени.
Установка в GO
go install github.com/nats-io/nats-top
Если вы хотите запустить включенный мониторинг сервера nats, мы можем воспользоваться следующими командами
nats-server -m 8222
Запустить Nats-top
nats-top
Ссылки
- Ссылка 1
- Ссылка 2
- Ссылка 3