Быстрый старт
Скачиваем бинарники. Далее описание будет под window, есть так же docker-compose, запускается с пол пинка
Разархивируем все в папку C:\nsq-1.2.0\
, будем запускать приложения с учетом предварительного перехода в эту директорию 'cd /d C:\nsq-1.2.0'
- В первую очередь из командной строки запускаем
nsqlookupd
- это своего рода сервис дискавери, он в курсе обо всех запущенных экземплярах основного сервисаnsqd
, официальная документация
cd /d C:\nsq-1.2.0 nsqlookupd
- В новом экземпляре командной строки, запускаем
nsqd
- это основной сервис, который получает, кладет в очередь и отдает клиентам сообщения, официальная документация
cd /d C:\nsq-1.2.0 nsqd --lookupd-tcp-address=127.0.0.1:4160 --max-msg-size 52428800
--lookupd-tcp-address
- это установка адреса nsqlookupd
, в первую очередь nsqd сообщает nsqlookupd, что он запущен и адрес как к нему можно обратиться
--max-msg-size
- максимальный размер принимаемых сообщений, по умолчанию 1048576 байт, около 1 мб. В примере ставим 52МБ.
- в новом экземпляре командной строки запускаем
nsqadmin
- это веб интерфейс администратора для выполнения различных задач с кластером
cd /d C:\nsq-1.2.0 nsqadmin --lookupd-http-address=127.0.0.1:4161
Теперь можно перейти в админку по адресу http://localhost:4171/
- В админ панели заходим в раздел
Lookup
- Создадим новый топик с именем
test-messages
и в поле channel укажемgroup-app-1
В идеологии NSQ, понятие topik является потоком данных, а channel выступает в роли логической группы подписчиков. Балансировку нагрузки на несколько экземпляров сервиса-подписчика как раз можно реализовать с помощью channels.
- в новом экземпляре командной строки запускаем
nsq_tail
- это один из вариантов реализации подписчика, который выводит данные в stdout. Этот экземпляр будет подключен только к топику, без указания канала, т.е будет получать все сообщения по топику.
cd /d C:\nsq-1.2.0 nsq_tail --topic=test-messages --lookupd-http-address=localhost:4161
Существуют другие варианты реализации подписчиков:
nsq_to_file
- клиент записывающий данные в файлnsq_to_http
- клиент, который перенаправляет сообщение по http (get или post) по другому адресу.nsq_to_nsq
- перенаправляет сообщения в другой nsqd по TCP, как вариант реализации федерации.
Про все утилиты в официальной документации
- в новом экземпляре командной строки еще раз запускаем
nsq_tail
, но добавим указание канала
cd /d C:\nsq-1.2.0 nsq_tail --topic=test-messages --channel=group-app-1 --lookupd-http-address=localhost:4161
- еще раз повторим пункт 7, что бы у нас было несколько экземпляров одной группы (channel)
В итоге, у нас запущено 6 командных строк, 3 сервисных, 3 клиента
- одно из преимуществ nsq в том, что из коробки мы имеем возможность опубликовать сообщение по http, выполним cURL запрос
curl -d 'evening in the hut 1' 'http://127.0.0.1:4151/pub?topic=test-messages'
После выполнения отправки сообщения, в 2х из 3х клиентов мы увидим наше сообщение, в экземпляр без канала, сообщение пришло 100%, а вот из группы group-app-1
сообщение получил только один из экземпляров.
- выполним еще одну отправку сообщения
curl -d 'evening in the hut 1' 'http://127.0.0.1:4151/pub?topic=test-messages'
Опять, без канала получил сообщение, а из группы скорей всего сообщение уже пришло другому экземпляру
Вместо итога
nsq легко разворачивать и сопровождать, что бывает очень важным условием. надо отметить что сообщений хранятся в памяти, а не на диске, но сохранение на диск есть как опция. Тут встает вопрос, зачем нам нужно хранение на диске, если у нас вообще возможны ситуации когда сообщение может и не прийти вовсе от поставщика. В случаи когда мы уже решили проблему переотправки от поставщика, нам нет необходимости использовать гарантию сохранности сообщения в сервисе очередей.
Есть официальные библиотеки на go и python, список из официальной документации