Обработка тайм-аута на стороне клиента с помощью веб-службы Sinatra

#ruby #sinatra #salesforce

#ruby #sinatra #salesforce

Вопрос:

Я новичок в Ruby и Sinatra, но мне удалось создать веб-сервис, который работает довольно хорошо, работает на Heroku. Я получаю доступ к этой веб-службе из Salesforce.com .

Класс HttpRequest, который я использую в Salesforce / Apex, имеет максимальное время ожидания 60 секунд. Если я нажимаю этот тайм-аут (или, когда я нажимаю тайм-аут в 1 секунду, который я использую для тестирования), я получаю исключение на стороне Salesforce, с которым я могу легко справиться. Меня интересует, как справиться с этим на стороне Sinatra.

Если мой клиент получает тайм-аут и каким-то образом закрывает соединение, есть ли способ «ощутить» это в моем приложении Sintra? Я хотел бы отметить тайм-аут клиента, продолжить выполнение работы, которую запустило приложение, а затем отправить электронное письмо, чтобы сообщить пользователю о завершении задания после тайм-аута.

Я должен отметить, что, когда я получаю тайм-аут сейчас, приложение Sinatra с радостью завершает то, что оно делало, и, я предполагаю, возвращает данные JSON, которые оно должно. Только на стороне клиента нет ничего, чтобы получить эти данные.

Есть мысли?

Ответ №1:

Забавная проблема. Как протокол без состояния, я не верю, что HTTP включает в себя метод «определения», когда клиент закрывает соединение. Я действительно ничего не знаю о том, что делает SalesForce, но вот некоторые стандартные HTTP-решения (я предполагаю, что веб-сокеты отсутствуют).

Самый простой, но подверженный ложным срабатываниям

Поскольку вы знаете максимальное время ожидания, засеките время вашего запроса Sinatra. Если это заняло больше 60 секунд, предположите, что время ожидания истекло, и отправьте электронное письмо. Очевидно, что это может привести к ошибке где-то в районе 59-61 секунды, и вы можете получить некоторые ложные срабатывания и ложные отрицательные результаты.

Сложнее, но склонен к совершенству

Вы могли бы реализовать «квитанцию о прочтении». Ваш ответ JSON будет включать UID. Если ваш запрос SalesForce не истекает, отправьте UID обратно в виде квитанции. Тогда Синатра будет знать, что все в порядке.

Если приложение Sinatra не получит квитанцию в течение n секунд / минут (потому что время ожидания SalesForce истекло, и вы так и не получили UID), приложение Sinatra может отправить электронное письмо (или что-то еще) через n секунд / минут.

Это может быть реализовано несколькими способами. Самый простой, вероятно, включает базу данных, скрипт и cron. Наиболее сложным, вероятно, является потоковая передача HTTP (теперь тривиальная в Sinatra 1.3) и, возможно, многопоточные или событийные серверы, такие как Thin или Zbattery. Я был бы рад уточнить.

Комментарии:

1. Отличная обратная связь. Спасибо. Оказывается, что 60-секундный тайм-аут Salesforce даже не имеет значения, поскольку Heroku устанавливает 30-секундный тайм-аут (если вы не находитесь в стеке Cedar и не хотите отправлять запросы на поддержание работоспособности, чего я не делаю).). Учитывая этот тайм-аут в 30 секунд и тот факт, что большинство наших пользователей будут использовать эту службу способом, который потребует много времени, мы просто будем каждый раз сразу отправлять электронное письмо и позволять Heroku выполнять тяжелую работу с отложенным заданием.