Службы WCF: обработка сброшенных соединений

Вызов службы WCF для обновления записей в базе данных. Если соединение разорвано, служба продолжит обработку данных, но клиент не узнает о результатах. т.е. обработка могла быть успешной или неудачной; клиент не знает, должен ли он повторно отправить данные.

Типичным примером может быть банковский депозит. Банкомат принимает депозит и выполняет вызов WCF для обновления учетной записи клиента. Соединение обрывается, в результате чего банкомат не уверен, был ли депозит обработан или нет. Если это не так, и банкомат не высылает повторно, у клиента нет денег на счету. Если банкомат повторно отправил, но депозит был обработан, у него будет два депозита.

Включение транзакций в вызове службы WCF кажется правильным, но могут ли они справиться с разрывом соединения? т.е. клиент может откатить транзакцию, если он потеряет соединение с сервером, но как сервер узнает об откате, если клиент не подключен?


person James King    schedule 07.03.2011    source источник
comment
э... TIA, Джеймс, неуместно добавлять к вопросу? Почему ты это удалил?   -  person James King    schedule 07.03.2011


Ответы (2)


Кажется, что с какой бы стороны вы на это ни посмотрели, существует вероятность серьезного катастрофического сбоя.

Предполагая, что вы используете асинхронные клиентские вызовы и/или объем обработки, выполняемой на стороне службы, относительно велик. Если в промежутке времени соединение со службой от клиента разрывается, клиент не может узнать, в каком состоянии служба находилась в последний раз. Если это была промежуточная транзакция, транзакция на стороне службы будет отменено автоматически... если это было после транзакции, то ваша работа выполнена... но в обоих случаях клиент "никогда не узнает".

Теоретически... (и не цитируйте меня по этому поводу, но это ЗВУЧИТ как логичный сценарий), если банкомат потеряет связь в процессе внесения депозита... Я верю (и, как я уже сказал, не цитируйте меня по это), что банкомат сам хранит список транзакций в памяти, чтобы в ситуации, когда транзакция не удалась, после восстановления соединения он мог проверить себя и проверить, действительно ли транзакция была завершена. (Если на самом деле это не так... лично я был бы немного обеспокоен).

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

person Patrick    schedule 07.03.2011
comment
Проверка после восстановления соединения — это хорошо... но что проверять? Что недавно был депозит на 100$? Не очень надежно... Предложение коллеги состояло в том, чтобы запросить идентификатор транзакции из службы WCF и передать его фактическому вызову депозита... хотя это, кажется, довольно быстро усложняется. - person James King; 07.03.2011
comment
вы можете запросить все, что захотите... если вы готовы это построить... вы можете хешировать данные из самой транзакции и проверять их на стороне хеш-клиента. Твое право. Это действительно может стать очень сложным, очень быстро. - person Patrick; 07.03.2011

Я бы использовал поставщика EAI, такого как BizTalk, для оркестровки служб WCF и настройки компенсационных операций для каждой из операций, предоставляемых службами, чтобы можно было выполнить откат в случае сбоя.

person DaveRead    schedule 08.03.2011
comment
Я посмотрю на это подробнее ... пока это большая кривая обучения и много программного / аппаратного обеспечения / настройки ... не думаю, что я смогу сделать это в краткосрочной перспективе :( - person James King; 08.03.2011