Про костыли. Ну а как ты хотел? У нас тут про такое будет ой как много. Это в идеальном мире есть кодстайл, кубернейтс с аптаймом 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 все красиво вывести. Когда чо упало, когда перезапустилось, пустая ли очередь и т.п.
Переработав этот скрипт под свои нужды, можно получать вообще любые данные с любых серверов, не используя экспортеры. Ну и в дальнейшем строить логику в скрипте на этих данных. А самое главное это быстро реализуемо. Костыльно? Конечно! Но клиент всегда прав, а богатый клиент прав в двойне. Рабочие будни.
6