проблема потери данных протокола tcp в скрученном

Я написал сервер на основе TCP с модулем Twisted.Internet. Это среда с высокой степенью параллелизма.

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

И проблема потери данных может быть вызвана каким-то другим образом.

Есть ли хороший способ контролировать это? (socket.send может возвращать состояние, у transport.write, похоже, нет возврата)


person ifocus    schedule 30.08.2011    source источник


Ответы (1)


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

Результат send() не говорит о том, что данные были получены узлом авторитетно; он просто говорит, что ядро ​​поставило его в очередь для транспортировки. С точки зрения вашего приложения, действительно не имеет значения, были ли данные поставлены в очередь Twisted, или вашей средой выполнения C, или вашим ядром, или промежуточным нижестоящим коммутатором, или ядром партнера, или кем-то еще. Может отправили, может нет. Иными словами, transport.write() заботится о дополнительной буферизации, которой нет у send(), гарантируя, что он всегда буферизует все ваши байты, тогда как send() буферизует только некоторые из них.

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

person Glyph    schedule 30.08.2011
comment
Действительно? Это меня сильно шокировало, это усложнило бы мою заявку! Есть ли какой-нибудь простой способ сделать это! - person ifocus; 30.08.2011
comment
Я только что заметил, что вы являетесь основателем скрученного проекта. Спасибо за предоставление такого хорошего проекта. - person ifocus; 30.08.2011
comment
@ifocus это то, для чего предназначено большое неуклюжее промежуточное программное обеспечение. Разработчики приложений сами выбирают, какой уровень надежности и гарантий они принимают. - person Steve-o; 30.08.2011
comment
@ifocus: вы можете использовать набор для создания протокола, такой как AMP amp-protocol.net, вместо того, чтобы писать протокол уровня байта самостоятельно. Несколько таких вещей в Twisted обеспечивают автоматическое сопоставление запросов и ответов. - person Glyph; 06.09.2011