NATS С GOLANG С ИСПОЛЬЗОВАНИЕМ DOCKER


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

Оцените статью
devanswers.ru
Добавить комментарий