Рубрики
Без рубрики

Обработка более 200 транзакций в секунду с использованием Python-RQ

Общий вариант использования для любого программного продукта – это возможность запускать определенную бизнес -логику, когда … Tagged с Python, Redis.

Общий вариант использования для любого программного продукта – это возможность запустить определенную бизнес -логику всякий раз, когда запускается конкретное событие. Это событие может произойти в виде веб -крючка, запускаемого сторонним службой на ваш сервер, или он может быть сгенерирован через ваш продукт. Дело в том, что это событие запускает транзакцию в вашей системе, и потеря даже одной транзакции недопустима.

Это кажется достаточно простым при работе с низким уровнем таких событий, но если ваш сервер получает эти события со скоростью 200 запросов в секунду, и каждое из этих событий требует значительных ресурсов для их обработки, это больше не является тривиальным, что нужно сделать Анкет

У нас было аналогичное требование при создании нашего продукта, который является инструментом, который помогает торговцам электронной коммерции уведомлять своих клиентов, когда заказы подтверждаются/отправляются через WhatsApp. Чтобы реализовать это, мы регистрируем Webhooks для получения событий жизненного цикла заказа всякий раз, когда новый магазин электронной коммерции подписывается с нашим продуктом.

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

Ожидания от системы очереди сообщений

Есть 4 основных вещах, которые необходимы, если вы хотите стоять в очереди и обработать их асинхронно.

  1. Мониторинг : Панель инструментов, где вы можете просмотреть все текущие асинхронные задания и убедиться, что все они работают гладко, и нигде нет засорения.
  2. Обработка ошибок : Способность повторить неудачные транзакции без необходимости снова получить событие.
  3. Нулевая потеря : Ни одно из событий не должно быть потеряно и не должно оставаться в очереди, пока они не пойдут.
  4. Масштабируемость : Если объем сообщений поднимается, обработка их должна быть таким же простым, как добавление другого работника в бассейн.

Доступные методы для этого

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

  1. AWS SQS как очередь и AWS Lambda в качестве обработчика для заданий в очереди.
  2. Сельдерея – это отличная структура, которая решает именно это, и она совместима с AWS SQS, Redis и Rabbit MQ.
  3. Python-RQ с Redis в качестве очереди.

Я сразу исключил первый метод, потому что он будет включать в себя слишком много блокировки поставщиков с AWS и из оставшихся двух методов, я лично немного напугал документацию Celerys, так как это кажется немного подавляющим для моего простого использования. Развернуть работники программ, которые собирают предметы из очереди и обрабатывают их.

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

Мониторинг

Чтобы процитировать одну из строк из документации Python-RQ, «мониторинг-это то, где сияет RQ». Вы получаете доступ к приборной панели, где вы можете просмотреть задания, которые в настоящее время обрабатываются, ожидают работы и неудачные работы.

Если вы не указаете какую -либо очередь при развертывании услуги, есть одна очередь, созданная под названием «По умолчанию», и все задания, которые вы включают в эту очередь.

В качестве альтернативы вы можете определить столько очередей, сколько хотите, и поместить задания в соответствующие очереди на основе их приоритета. Все это очень хорошо задокументировано.

Если вам нужно отслеживать еще несколько вещей, например, сколько заданий в очереди в данный момент времени в форме базы данных временных рядов или максимальных заданий в очереди в течение данного времени, вы можете экспортировать эти метрики, используя rq_exporter и отображать их на Графана приборная доска.

Обработка ошибок

У Python-R

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

Наконец, вы также можете указать различные задержки между каждой попыткой повторения и достичь системы, в которой, если работа не сработает, вы повторяете через 10 минут, и если она снова выйдет из строя, вы можете повторно повторить через 20 минут и т. Д. И т. Д.

Даже если вы не указаете какое -либо подсчет попыток, существует встроенная сеть безопасности по умолчанию, в которой сбой работы в «неудачной» очереди отображаются, и то же самое отображается на панели инструментов. Вы можете повторить их вручную, нажав на «Requeue».

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

Python-RQ также позволяет вам определить пользовательский обработчик исключений во время запуска ваших работников, которые вы можете использовать, чтобы делать такие вещи, как отправка предупреждения о себе по электронной почте/Slack всякий раз, когда есть исключение.

Нулевая потеря

Когда вы перезапустите Python-RQ, он выполняет теплое закрытие, когда новые задания из очереди больше не принимаются, и существующие задания будут полностью выполнять работу, прежде чем закрыть обслуживание. Это гарантирует, что в данных нет потерь.

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

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

Масштабируемость

Прелесть этой настройки в том, что если ваше приложение масштабируется и начнете получать слишком много событий, сервер, ответственный за включение событий Встреча и время, которое он выполняется.

Если вам нужно уменьшить эту задержку, все, что вам нужно сделать, это развернуть другого работника RQ, который слушает в одной и той же очереди Redis, и задачи автоматически будут переданы между всеми существующими работниками, которые подписаны на эту очередь. В зависимости от того, как масштабируется ваш трафик, вы можете продолжать развертывать новых работников в новых случаях, не изменяя что -либо еще.

Задачи планирования с Python-RQ

Дополнительным преимуществом этой инфраструктуры является то, что она также заботится о случае, когда нужно запланировать задачу, которая будет выполнена в более позднее время. Конечно, есть много способов достижения этого, включая рабочие места Cron, но наличие этой способности в вашей инфраструктуре очереди очень удобно, потому что все другие аспекты, такие как обработка ошибок и мониторинг, автоматически применяются к этому.

Чтобы добавить способности планирования работы в Python-RQ, вам придется установить RQ-Scheduler и запустить его как отдельную услугу. Эта услуга позаботится о том, чтобы поднять задания, которые должны быть выполнены в определенный момент времени, и внедрить их в очередь, на которой прослушивает Python-RQ.

Заключительные заметки

Для нашего конкретного варианта использования мы получаем около 200 транзакций в секунду, и, поскольку все они входят прямо в очередь, 99% этих запросов имеют время отклика 25 миллисекунд или менее.

Что касается результатов работников, то в настоящее время мы развернули 5 работников, а их мощность в зависимости от их свободного времени по сравнению с напряженным временем имеет соотношение примерно 67:17, а максимальные работы в очереди в данный момент составляют около 200.

Но совершенно ясно, что в определенное время дня рабочие используются довольно много, пока остальное время они свободны.

С точки зрения стоимости запуска этой настройки, у нас есть один экземпляр AWS Lightsail, который отвечает за получение всех веб -крючков и внедрение всех рабочих мест, которые стоят 20 долларов в месяц, и у нас есть еще один экземпляр, когда мы запускаем Redis и всех работников 5 RQ Это стоит 40 долларов в месяц, поэтому в общей сложности мы тратим 60 долларов в месяц на 4 транзакции в секунду.

Ссылка на оригинальное сообщение в блоге

Оригинал: “https://dev.to/sankalpjonna/handling-more-than-200-transactions-per-second-using-python-rq-4dg5”