Про костыли. Ну а как ты хотел? У нас тут про такое будет ой как много. Это в идеальном мире есть кодстайл, кубернейтс с аптаймом 100500%, кодревью, юнит-тесты и т.п. А в реальном мире дела обстоят иначе.

Короче, кейс. Есть у меня клиент, у клиента есть RabbitMQ.

RabbitMQ — программный брокер сообщений на основе стандарта AMQP — тиражируемое связующее программное обеспечение, ориентированное на обработку сообщений.

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

В RabbitMQ есть очередь, в очередь попадают транзакционные письма, которые неспешно нужно отправить пользователям. Очередь обрабатывается микросервисом, который написан в 90-е года на каком-то форке perl’а, да-да именно так! Тот кто его писал, давным-давно нянчит внуков, либо кормит рыб

В какой-то момент этот микро-сервис-динозавр начинает троить и просто зависает при работе по протоколу amqp. Хотя визуально с ним все в порядке, в логах ошибок нет, собственно как нет и самих логов. Просто он в какой-то момент перестает выгребать очередь и на этом всё!

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

Ну раз клиент просит быстро решить проблему и согласен на костыли, да пожалуйста! Пишем ему bash’ник, забираем 50к рублей и идем пить чай/кофе/смузи/пиво.

#!/bin/bash

COUNT_Q=$(ssh user@bashdayz-d1 rabbitmqctl list_queues | grep 'email.send.mass'|awk '{print $2}')

if [ $COUNT_Q -gt 500 ]
then
    su - amqp-daemon -c "cd ~/daemon && daemon.pl stop"
    su - amqp-daemon -c "cd ~/daemon && daemon.pl start"
fi

Разбор скрипта:

Скрипт работает в кроне на сервере рядом с микросервисом. Запускается каждые полчаса. После запуска, он подключается по ssh к серверу с очередями RabbitMQ. Проверяет общее количество писем в очереди email.send.mass. Если писем скопилось более 500, то значит ПРИПЛЫЛИ!

Оператор -gt в bash означает: Больше А конструкция su - amqp-daemon -c означает, что запускаем команды от пользователя amqp-daemon

Ну а далее срабатывает логика перезапуска микросервиса, остановка и запуск. Профит. Клиент доволен как слон, а мы при деньгах. Не забываем прописать ssh public ключи, чтобы скрипт мог ходить на другие сервера без пароля. Ну про это ты должен знать. Если не знаешь, то обязательно погугли как работают ssh ключи, это база.

Также можно сюда прикрутить логирование, оповещения, экспортер в prometheus и на графиках в grafana все красиво вывести. Когда чо упало, когда перезапустилось, пустая ли очередь и т.п.

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

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Костыльно? Конечно! Но клиент всегда прав, а богатый клиент прав вдвойне.

Рабочие будни

С пятницей ребят! Всем хороших предстоящих выходных и самое главное — берегите себя.