Извините, это вместе с документом.
СТАРЫЕ НАСТРОЙКИ
У меня есть клиентское приложение J2ME, которое подключается к серверу с интервалом в 3 секунды.Соединения обрабатываются в отдельном потоке.Поток работает в цикле while и выполняет следующие действия:
- Открытое HTTP-соединение
- Получение ответа и отправка в главный поток пользовательского интерфейса для обработки
- Спящий режим в течение 3 секунд
Повтор
Сервер Apache и KeepAlive выключен.HTTP-запросы от клиента имеют время ожидания 10 секунд.Каждый цикл занимает около 4,5 секунд (общая задержка 1,5 секунды).
Время от времени (раз в 1 или 2 часа) в условиях низкого покрытия (слабый сигнал 3G / GPRS) поток получает блок ввода-вывода и зависает на шаге 1 выше.Я думаю, что происходит, когда соединение где-то вдоль линии умерло, но приложение не знает об этом и ждет ответа.Я считаю, что виновата сеть (в данном случае O2).Соединение остается активным в течение, возможно, 30 минут и в конечном итоге умирает и возвращает -1 длину ответа приложению, и поток в конечном итоге продолжается.Чтобы бороться с этой относительно редкой проблемой, я просто отказался от темы, если ответ занял более 60 секунд, и создал новую.
До недавнего времени это не было серьезной проблемой, однако мы изменили настройки сети следующим образом:
NEW SETUP
- Из-за более низких ограничений пропускной способности мы сократили интервал до 5 секунд.
- Теперь мы направляем все соединения через туннель SSL к нашему серверу.
- У запросов HTTP от клиента все еще есть время ожидания 10 секунд в приложении *
Цикл занимал около 7,5 секунд (2,5 секунды общей задержки), чтобы завершить эти изменения.Причиной увеличения задержки было то, что для каждого отдельного соединения требовалось подтверждение связи по SSL (из-за отключения KeepAlive).Нам посоветовали включить KeepAlive ON на сервере apache, что означало бы одно рукопожатие, а затем постоянное соединение http для последующих запросов.Мы сделали это, и по большей части это значительно улучшило скорость соединения.Цикл уменьшился до 6,5 секунд.
Итак, теперь мы можем добавить это к изменениям нашей конфигурации для новой настройки:
- HTTP KeepAlive был включен на сервере (для включения постоянного соединения TCP)
Однако в бедных зонах 3G / GPRS проблема блокирования потоков встречается гораздо чаще и стала серьезной проблемой - это происходит в 50% случаев в действительно плохих зонах покрытия.Я несколько раз получал исключение Java из-за нехватки памяти, сообщая, что приложение не может создать новый поток. Кроме того, в хороших областях 3G мы также видим проблему блокирования потоков, чего раньше не было.
Я явно сделал что-то не так в этой настройке, так как постоянные http-соединения и базовый TCP довольно надежны
* Мы справились со всеми этими изменениями без перезаписи приложения, но таймаут http10 секунд потребует переписать приложение.Возможно, этот тайм-аут вызывает проблему?
Заранее благодарим за любую помощь в этом.