Как избежать того, чтобы одно и то же задание в очереди обрабатывалось более одного раза при масштабировании по нескольким динам в Heroku

У нас есть приложение Node.js, работающее с обратной связью, основной целью которого является обработка заказов, полученных от клиента. В настоящее время весь процесс заказа обрабатывается в течение одного http-запроса на выполнение заказа, включая оплату, вставку в базу данных и отправку писем с подтверждением и т. Д.

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

Кроме того, у нас также есть потенциальное состояние гонки; мы должны назначить "короткий код" каждому заказу для удобства обращения со стороны клиента - они должны вращаться, поэтому, если начальный номер равен 1, а максимальный равен 100, 101-му заказу должен быть присвоен номер 1. На данный момент мы смотрим на предыдущий ордер и либо увеличиваем предыдущую ссылку на 1, либо возвращаем ее к началу - очевидно, в данный момент это нормально из-за низкого трафика - однако, если мы масштабируем это, это может привести к тому, что нескольким ордерам будет назначен один и тот же номер ссылки

Поэтому мы хотим создать очередь для управления всем этим. Наше приложение в настоящее время развернуто в Heroku, где мы уже используем рабочий процесс для некоторых ежемесячных вычислений, которые требует наше приложение. Прочитав некоторые статьи Heroku о реализации очереди ( https://devcenter.heroku.com/articles/asynchronous-web-worker-model-using-rabbitmq-in-node, https://devcenter.heroku.com/articles/background-jobs-queueing) неясно, как на нескольких рабочих dyno мы могли бы обеспечить порядок, в котором эти элементы в очереди обрабатываются, и одна и та же работа не обрабатывается более чем один раз несколькими dyno. Порядок обработки не так важен, однако отсутствие повторения крайне важно, поскольку, если два заказа обрабатываются одновременно, мы рискуем получить вышеуказанное состояние гонки.

По сути, мой вопрос заключается в следующем; как избежать повторения одного и того же задания очереди более одного раза при масштабировании по нескольким динамам в Heroku?

1 ответ

То, что вам нужно, уже предоставлено RabbitMQ, брокером сообщений, используемым дополнением CloudAMQP Heroku.

Вам не нужно беспокоиться о состоянии расы нескольких рабочих. Задание, помещенное в очередь, сохраняется до тех пор, пока его не получит потребитель. Когда работник использует задание из очереди, другие работники не смогут его использовать. RabbitMQ управляет всеми такими аспектами парадигмы очереди сообщений.

Несколько ссылок, полезных для вашего проекта:

Другие вопросы по тегам