На собеседовании задали такие вопросы , как бы вы ответили?
Вопрос №1 Достоверно известно, что некоторый API периодически отваливается по таймауту или с 5хх ошибкой. Аналогов нет, заменить данный сервис нечем. Использование этого API критически важно для асинхронных задач внутри приложения. Что будем делать? Какие библиотеки и паттерны будем использовать чтобы минимизировать потери и повысить стабильность приложения? * Мой ответ
Вопрос №2 В ответ на входящий вебхук приложение должно сделать несколько запросов в БД, пару запросов к стороннему API, вернуть 200OK в ответ на вебхук вне зависимости от результатов вышеперечисленных запросов. Сервис, дергающий вебхук, требует чтобы ответ пришел в течение трех секунд. Что будем делать? *
Ответы (1 шт):
Паттерн Command инкапсулирует запрос как объект, позволяя тем самым задавать параметры клиентов для обработки соответствующих запросов, ставить запросы в очередь или протоколировать их, а также поддерживать отмену операций. Паттерн «Команда» позволяет спрятать действие в объекте и отвязать источник этого действия от места его исполнения. Классический пример — проектирование пользовательского интерфейса. Пункт меню не должен знать, что происходит при его активизации пользователем, он должен знать лишь о некотором действии, которое нужно выполнить при нажатии кнопки.
Когда использовать Паттерн Command Когда необходимо обеспечить выполнение очереди запросов, а также их возможную отмену. Когда надо поддерживать логгирование изменений в результате запросов. Использование логов может помочь восстановить состояние системы - для этого необходимо будет использовать последовательность запротоколированных команд. Когда необходимо параметризировать объекты выполняемым действием, ставить запросы в очередь или поддерживать операции отмены (undo) и повтора (redo) действий.
"вернуть 200OK в ответ на вебхук вне зависимости от результатов вышеперечисленных запросов." - обработать запрос и поставить в очередь, после вставки в очередь отправить сообщение 200OK с номером сообщения, что далее можно было вытащить данные с этого запроса. Далее каждое сообщение обрабатывается поочерёдно в заданной последовательности (асинхронно). т.е. 1. запрос получили 2. ответили вот вам номер в очереди. 3. обработка очереди. 4. Если нужны результаты запроса отправляйте отдельно запрос по номеру в очереди.
Очереди в случае обоих вопросов можно организовать на основе СУБД, kafka, или другого постоянного хранилища, чтобы в случае падения нашего приложения сообщения не терялись.