Предположим, у меня есть сценарий, в котором я обрабатываю фоновое задание на рабочем месте.Он просто получает URL-адрес файла (изображения, видео, pdf, ..), размещенного на удаленном CDN, и рабочий выполняет свою работу следующим образом:
- Некоторая обработка содержимого файла в памяти
- Затем вызывает сторонний API для получения подписанного действительного URL для загрузки контента тому же третьему лицу.
- Загрузка контента в сторонний API - ответсодержит уникальный идентификатор файла
- Отправляет сообщение пользователю через сторонний API с уникальным идентификатором файла, полученным ранее
Теперь проблема заключается вэтап (3) и (4).Ограничение здесь заключается в том, что стороннему API требуется несколько секунд для обработки файла (шаг 3), прежде чем мы действительно отправим сообщение, содержащее идентификатор файла, который мы только что загрузили (шаг 4).
Еще одно предположение заключается в том, чтоМне нужно убедиться, что все 4 шага выполняются за один раз, как, например, чтобы не было возможности частичного сбоя.
Возможные подходы
Самый наивный путьиспользование sleep 5
между шагами (3) и (4) может привести к серьезным ошибкам, так как я не совсем уверен, сколько секунд нужно стороннему API для обработки, но, согласно моим испытаниям, 5 секунд сна показалосьхорошо.
Я мог бы выполнить экспоненциальную повторную попытку в течение 3 (или X) раз для шага (3), поймать исключение от третьей стороны и попытаться выполнить шаг (4)) когда шаг (3) выполнен успешно - это то, что у меня сейчас, он работает нормально.
Возможно, я мог бы использовать планировщик заданий или библиотеку параллелизма ruby для выполнения шага (4)) в отложенной модена.Я не ценю этот путь, поскольку мне кажется, что он способствует сложности.
Эта часть логики построена на Ruby, хотя вопрос может быть не очень специфичным для Ruby и может быть применимна других языках я хотел бы услышать, что думают ребята из Ruby.