Недавно Reverb начал использовать NSQ в качестве распределенной очереди сообщений. После установки производителей в нашем приложении Rails мы написали простого потребителя Go для некоторых наших сервисов, который будет использовать новую очередь.

Что за NSQ?

Прежде чем подробно рассказывать о нашем потребителе, давайте поговорим немного об очередях. Хотя существует ряд вариантов с открытым исходным кодом, мы выбрали NSQ из-за простоты развертывания, простой стратегии локального брокера, устойчивости и скорости.

Архитектура NSQ состоит из экземпляров nsqd и экземпляров nsqlookupd для обнаружения тем. При отсутствии единой точки отказа потребителям необходимо запрашивать экземпляры nsqlookupd для обнаружения тем и их производителей. В Reverb у нас есть экземпляры nsqd, развернутые в каждом ящике, где мы создаем сообщения. Это делает нашу систему устойчивой к сбоям, позволяя при этом легко масштабироваться.

Архитектура обмена сообщениями nsq также позволяет каждой очереди иметь либо тему, либо очередь, как семантику. Это позволяет нам выбирать, будем ли мы использовать циклические сообщения для нескольких потребителей по общему каналу или реплицировать сообщения для нескольких разных потребителей.

nsq предоставляет как TCP, так и простой интерфейс HTTP, в то время как мы будем использовать протокол TCP в нашем потребителе, интерфейс HTTP обеспечивает простой способ взаимодействия с nsq.

Написать потребителя на Go просто с официальным пакетом nsq go. В то время как документация не освещена, у официального клиента есть несколько примеров, которые поставляются вместе с nsq.

Наш Потребитель

Одно из преимуществ использования официального пакета NSQ заключается в том, что он заменил большой объем стандартного кода рабочих процессов, который мы использовали с предыдущей архитектурой обмена сообщениями. Go отлично подходит для этого рабочего шаблона, но пакет предоставляет все, что вам обычно нужно.

Мы хотим, чтобы один потребитель одновременно получал несколько сообщений из общей темы. Мы создадим специальный канал для нашего приложения под названием «метрики» и будем записывать все сообщения в STDOUT. Мы также позаботимся о том, чтобы завершить работу без каких-либо сообщений.

Есть вопросы? Не стесняйтесь оставлять нам комментарии. Любите писать го и любите музыку? Мы нанимаем.

Эрик Бенуа

Джо Леверинг