2013-03-05 2 views
0

Я занимаюсь разработкой web-сервисов и задаю вопрос о подходах обработки тайм-аутов/исключений.Тайм-ауты и обработка ошибок в webservices - подход к архитектуре

У меня есть webservice (WS1) и клиент C. Клиент получает некоторые действия от пользователя и вызывает WS1 для некоторой операции, которая не требует доставки ответа пользователю.

Я могу спроектировать обработку ошибок в приложении, в 2-х возможных путей -

  1. вызовов WS от C. Если вызов успешен, WS возвращает маркер. Если C по какой-либо причине не получает токен (может быть сбой в WS или тайм-аут сети), он будет храниться в БД, и некоторое задание wil повторит операцию позже.

  2. Звоните WS от C и заканчивайте сообщение. Если есть какие-либо проблемы, WS вернется к C (в отдельном вызове). Если нет ответа, предположите, что транзакция прошла.

В общем, каковы варианты обеспечения успешного выполнения WS-вызова. Каковы способы повторить операцию, если транзакция завершилась с первой попытки?

ответ

1

Оба подхода являются действительными. То, что у вас есть, - это просто синхронная операция и асинхронная операция. например сокеты имеют два режима, доступные в течение многих лет; так, например, функции чтения файла.

Выбор сводится к следующему: может ли ваша клиентская программа дождаться завершения операции или нет. Если это возможно, синхронные операции проще программировать. Else делает асинхронную модель с обратными вызовами.

Что касается повторных попыток - это снова зависит. Повторите попытку? Многие программы просто пробуют 2-3 раза в цикле при сбое. Если повторная попытка повторяется после определенного времени, вы должны хранить информацию о том, что вы пытаетесь сделать где-то. Это где-то может быть программная память или какое-то постоянное хранилище. Для синхронного и асинхронного режимов требуется повторная попытка хранения информации. Асинхронно, потому что, когда вы получаете обратный вызов, вам нужно проверить свой магазин, чтобы выяснить, что вы пытаетесь сделать. В синхронном режиме эта информация много раз неявно хранится в стеке программ, для переменных данных.

Затем также следует повторить попытки выживания программы? Если это так, вам необходимо сохранить информацию в каком-то автономном хранилище. У меня когда-то было приложение для телекоммуникаций; это приложение telecom записывает запись подробностей о вызове в БД. Если по какой-то причине это не удалось, программа просто напишет этот CDR в локальный файл и продолжит работу. Задание cron придет и очистит записи в локальном файле, отправив их в БД. Таким образом, записи звонков, которые предоставили платежную информацию, выдержали даже сбои в работе программы.

Некоторые люди делают такие вещи, используя очереди сообщений. Очереди сообщений обеспечивают гарантированную доставку. клиент отправляет сообщение. Серверная сторона получает его. Сервер удаляет сообщение из Q только в том случае, если он успешно обрабатывает сообщение. Остается сообщение; опасность здесь состоит в том, что сообщение может иметь некоторый постоянный отказ, а затем он попадает в бесконечный цикл.

Получение бесконечных циклов из-за некоторых постоянных сбоев, таких как поставка неправильных параметров для WS, - это то, что вам нужно обрабатывать в любом случае.

+0

Благодарим за подробное объяснение и описание его с точки зрения синхронизации и асинхронности. В приложении, над которым я работаю, крах программы маловероятен.Окружающая среда сильно контролируется и самокорректируется. Более актуальной проблемой является проблема повторного судебного разбирательства. Наиболее целесообразный подход заключается в реализации механизма на основе очереди для вызова WS от клиента. – thcricketfan

Смежные вопросы