Является ли разумным компромиссом использование `sleep` в асинхронной работе? - PullRequest
0 голосов
/ 06 февраля 2019

Предположим, у меня есть сценарий, в котором я обрабатываю фоновое задание на рабочем месте.Он просто получает URL-адрес файла (изображения, видео, pdf, ..), размещенного на удаленном CDN, и рабочий выполняет свою работу следующим образом:

  1. Некоторая обработка содержимого файла в памяти
  2. Затем вызывает сторонний API для получения подписанного действительного URL для загрузки контента тому же третьему лицу.
  3. Загрузка контента в сторонний API - ответсодержит уникальный идентификатор файла
  4. Отправляет сообщение пользователю через сторонний API с уникальным идентификатором файла, полученным ранее

Теперь проблема заключается вэтап (3) и (4).Ограничение здесь заключается в том, что стороннему API требуется несколько секунд для обработки файла (шаг 3), прежде чем мы действительно отправим сообщение, содержащее идентификатор файла, который мы только что загрузили (шаг 4).

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

Возможные подходы

  • Самый наивный путьиспользование sleep 5 между шагами (3) и (4) может привести к серьезным ошибкам, так как я не совсем уверен, сколько секунд нужно стороннему API для обработки, но, согласно моим испытаниям, 5 секунд сна показалосьхорошо.

  • Я мог бы выполнить экспоненциальную повторную попытку в течение 3 (или X) раз для шага (3), поймать исключение от третьей стороны и попытаться выполнить шаг (4)) когда шаг (3) выполнен успешно - это то, что у меня сейчас, он работает нормально.

  • Возможно, я мог бы использовать планировщик заданий или библиотеку параллелизма ruby ​​для выполнения шага (4)) в отложенной модена.Я не ценю этот путь, поскольку мне кажется, что он способствует сложности.

Эта часть логики построена на Ruby, хотя вопрос может быть не очень специфичным для Ruby и может быть применимна других языках я хотел бы услышать, что думают ребята из Ruby.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

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

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

Если приложение не предполагает достижения максимальной производительности (язык Ruby ориентирован на производительность?), то сон может быть действительно самым простым, но не самым оптимальным решением.

0 голосов
/ 06 февраля 2019

Документы API , на которые вы ссылались, чтобы сказать:

Внимание!Некоторое время, необходимое серверу для обработки загруженного файла.Файл должен быть отправлен в чат через короткий промежуток времени (пара секунд)лучший вариант.

...