Какова правильная технология сердечного ритма / поддержки активности для Java REST?Http?Tcp?Кодировка: чанки? - PullRequest
0 голосов
/ 25 февраля 2019

Настройка:

У нас есть сайт 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-данных заполняются так постепенно, что между порциями нет 10-секундного промежутка, и поэтому readTimeout никогда не превышается, иногда есть 10-секундный интервал и время ожидания HttpClient...

Мы могли бы попытаться увеличить время ожидания на главной стороне, но это могло бы легко раздувать / перегружать пул слушателей (просто обычным трафиком, даже не будучи DDOSed).Нам нужен способ различать внутренний сайт, который все еще работает над генерацией ответа, и случаи, когда он действительно аварийно завершился / network_lost / etc.И самое приятное во время разговора - это какое-то сердцебиение (каждые 5 секунд).

Мы думали, что Keep-Alive спасет нас, но, похоже, только обеспечивает разрывы между запросов (не во время запросов), и кажется, что он не вызывает пульса во время перерыва (просто наличие / wait_ для тайм-аута).

Мы думали, что chunked-кодирование может спастимы отправили несколько тактовых импульсов (0-bytes-size-chunks), чтобы дать понять другой стороне, но, похоже, нет такой реализации / реализации по умолчанию для поддержки любого тактового импульса таким образом, и более того, кажется, что 0-байтовый размер - это EODсам индикатор ...

Вопрос (ы):

Если мы правы в предположении, что KeepAlive / ChunkedEncoding не поможет нам в достижении keepAlive / hearbeat/ fastDetectionOfDeadBackend затем:

1) в каком слое должен быть реализован такой ритм?Http?tcp?

2) какие-нибудь стандартные фреймворки / библиотеки / настройки / и т. д. уже реализуют его?(если возможно: Java, REST) ​​


ОБНОВЛЕНИЕ

Я также изучил реализации контрольных сигналов для WADL / WSDL, хотя не нашел ни одного для REST,проверил WebSockets ... Также посмотрел TCP-keepalive, которые, кажется, правильное решение для этой задачи:

НО в соответствии с теми, что я имеюустановить что-то вроде:

  • tcp_keepalive_time = 5
  • tcp_keepalive_intvl = 1
  • tcp_keepalive_probes = 3

, который выглядит каквстречная рекомендация (2 часа - рекомендуемое, 10 минут уже представлены как нечетное значение, переход к 5 с вменяемым / безопасным, если это так - может быть, мое решение заранее ...)

также где я должен настроитьэтот?на London04 один или на мэйн тоже?(если я настрою его на Main - не затопит ли он клиента -> Main frontend communication? или могут ли NAT / etc между сайтами легко испортить намерение / поддержку keepalive?)

PS любая ссылка наRTFM приветствуется - я могу просто упустить что-то очевидное:)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Взгляните SSE

пример кода: https://github.com/rsvoboda/resteasy-sse

или шина событий vertx: https://vertx.io/docs/apidocs/io/vertx/core/eventbus/EventBus.html

0 голосов
/ 26 февраля 2019

Мой совет: не используйте биение сердца.Пусть ваш внешний API возвратит 303 See Other с заголовками, которые указывают, когда и где может быть доступен желаемый ответ.

Так что вы можете позвонить:

POST https://public.api/my/call

и получить обратно

303 See Other
Location: "https://public.api/my/call/results"
Retry-After: 10

Если ваш сервер может угадать, сколько времени потребуется для создания ответа, он должен учитывать это значение Retry-After.Если более поздний вызов GET сделан в новое местоположение, и результаты еще не сделаны, возвращаются ответ с обновленным значением Retry-After.Поэтому, возможно, вы попробуете 10, и если это не сработает, вы скажете клиенту подождать еще один 110, что в общей сложности составит две минуты.

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

...