Настройка:
У нас есть сайт https://Main.externaldomain/xmlservlet, который выполняет аутентификацию / проверку / геолокацию и прокси-запросы (слегка измененные) к http://London04.internaldomain/xmlservlet, например.
Прямого доступа к внутреннему домену для конечных пользователей нет вообще. Связь между сайтами иногда прерывается, а иногда узлы внутреннего домена становятся недоступными / мертвыми.
На основном сайте используется org.apache.http.impl.client.DefaultHttpClient (я знаю, что он устарел, мы постепенно обновляем этот устаревший код) с readTimeout, установленным на 10.000 миллисекунд. Запрос и ответ имеют полезную нагрузку / тело xml переменной длины, и используется Transfer-Encoding: chunked
, также используется Keep-Alive: timeout=15
.
Проблема:
Иногда для выполнения London04 требуется более 10 секунд (скажем, 2 минуты). Иногда он не изящно вылетает. Иногда случаются другие (сетевые) проблемы. Иногда в течение этих 2 минут - части response-xml-data заполняются настолько постепенно, что между частями нет 10-секундных промежутков, и поэтому readTimeout никогда не превышается, иногда есть 10-секундный промежуток, и HttpClient истекает ...
Мы могли бы попытаться увеличить тайм-аут на стороне Main, но это легко раздуло бы / перегрузило пул слушателей (просто из-за обычного трафика, даже не подвергаясь DDOS-атаке). Нам нужен способ отличать внутренний-сайт-все еще-работает-над-генерированием-ответом от случаев, когда он действительно дает сбой / network_lost / и т. Д. И самое лучшее - это какое-то сердцебиение (каждые 5 секунд) во время общения.
Мы думали, что Keep-Alive спасет нас, но, похоже, он только защищает промежутки между запросами (а не во время запросов) и, кажется, не делает никаких пульсаций во время разрыв (просто наличие / wait_for тайм-аута).
Мы думали, что фрагментированное кодирование может спасти нас, посылая некоторое сердцебиение (фрагменты размером 0 байт), чтобы другая сторона знала, но, похоже, нет такой / стандартной реализации поддержки любого сердцебиения таким образом и более того, поэтому кажется, что 0- Чанк размером в байты сам по себе является индикатором EOD ...
Вопрос (ы):
Если мы правы в предположении, что KeepAlive / ChunkedEncoding не поможет нам в достижении keepAlive / Hearbeat / fastDetectionOfDeadBackend, тогда:
1) на каком слое лучше реализовать такое сердцебиение? HTTP? TCP?
2) какой-либо стандартный фреймворк / библиотека / настройка / и т.д., уже реализующий его? (если возможно: Java, REST)
ОБНОВЛЕНИЕ
Я также изучил средства поддержки активности для WADL / WSDL, хотя не нашел ни одного для REST, проверил WebSockets ... Также изучил пакеты поддержки активности TCP, которые кажутся подходящими для задачи:
- https://en.wikipedia.org/wiki/Keepalive
- http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
- Сердцебиение сокета против keepalive
- WebSockets ping / pong, почему бы не поддерживать активность TCP?
НО в соответствии с ними мне пришлось бы настроить что-то вроде:
- tcp_keepalive_time = 5
- tcp_keepalive_intvl = 1
- tcp_keepalive_probes = 3
что кажется встречной рекомендацией (рекомендуется 2 часа, 10 минут уже представлены как нечетное значение, переходят к 5 с нормальным / безопасным? если это так - может быть, мое решение заранее ...)
также где я должен это настроить? только на London04 или на Main тоже? (если я настрою его на Main - не будет ли он затоплять клиента -> Main frontend-коммуникация? или могут ли NAT и т. д. между сайтами легко разрушить намерение / поддержку keepalive?)
P.S. любая ссылка на RTFM приветствуется - возможно, мне просто не хватает чего-то очевидного :)