Являются ли WCF "односторонними" связями на самом деле UDP?
В этой статье (ближе к концу в разделе "Windows Communication Foundation") автор предполагает, что односторонняя передача в WCF - это, по сути, UDP. Это правильно? Должен ли я предположить, исходя из содержания этой статьи, что пометка моих служебных операций как "односторонних" означает, что я использую UDP?
Кроме того, он предлагает использовать UDP в сочетании с WS-ReliableMessaging, чтобы свести на нет необходимость самостоятельно писать эти аспекты транспортного протокола... Хорошо, но если я хочу использовать преимущества производительности UDP в ситуации, которая этого требует, я должен, согласно предложению этой статьи, просто используйте "one way" и WS-ReliableMessaging, и я готов идти!? Звучит немного далеко от меня...
Так в чем здесь дело? Какие предостережения о том, что эта статья предлагает?
4 ответа
Нет, вы неправильно поняли статью. В статье говорится о двух разных вещах:
Односторонние операции WCF в некоторой степени аналогичны дейтаграмм UDP.
При желании WS-ReliableMessaging может быть реализован поверх UDP.
Даже односторонние операции требуют подтверждений, повторных передач и т.п., чтобы сделать их надежными.
WS-ReliableMessaging полагается на то, что получатель отправляет подтверждения ("подтверждения") обратно отправителю. В противном случае отправитель не сможет узнать, нужно ли повторно отправить сообщение. В TCP это встроено в транспортный протокол (это одно из различий между TCP и UDP).
В UDP вы отказываетесь от "издержек" TCP, но если вам нужен надежный обмен сообщениями, ваш сервер все еще отправляет что-то обратно клиенту.
На самом деле, если вы прочтете этот раздел статьи более внимательно, вы увидите, что в нем есть нечто большее, чем просто использование одностороннего обмена сообщениями и WS-ReliableMessaging. Вы также должны добавить элемент привязки UDP (.eg, bindingElements.Add(new UdpTransportBindingElement());
) и другие подобные вещи. Если вы не добавите эти вещи, вы все равно будете использовать TCP.
В качестве дополнительного примечания, я подозреваю, что вам нужно побаловать себя довольно сложными тестами, прежде чем вы решите, что UDP на самом деле будет иметь более высокую производительность, чем TCP для веб-сервисов. Я не делал эти тесты сам, но я подозреваю, что к тому времени soap.udp://
привязка завершается добавлением всех надежных битов обмена сообщениями и чего-то еще к вашему сервису, вы будете иметь почти все те же издержки, что и TCP. Я подозреваю, что причина, по которой UDP доступен в качестве транспортной привязки, заключается не в каких-либо превосходных характеристиках производительности, а в том, чтобы предоставить альтернативу для углового случая сценариев, где TCP (по какой-либо причудливой причине среды) недоступен.
Из статьи вы упомянули:
WCF предоставляет несколько сетевых протоколов (особенно TCP) и расширяется для других сетевых протоколов путем записи транспортного канала WCF. WCF поддерживает UDP посредством своей модели расширяемости, и код для базового канала UDP будет предоставлен в качестве примера кода в WinFX® SDK.
Они используют транспорт UDP в своих настройках, так что в их ситуации, да. Если у вас есть служба, использующая транспорт на основе TCP, то односторонняя связь не будет UDP.
И далее в статье:
Реализация UDP на основе WCF является односторонним каналом
Таким образом, они на самом деле говорят только о том, как реализован UDP в WCF, а не WCF вообще.