2016-11-30 1 views
0

Здесь можно задать вопрос о шаблоне дизайна.Как обращаться с ThreadPool, попадающим на ограничение соединения с сервером

На Android я использую пул потоков, чтобы открыть 8 потоков для загрузки некоторых файлов.

try { 
     ExecutorService pool = Executors.newFixedThreadPool(8); 
     for (int i = 0; i < someList.size(); i++) { 
      pool.submit(new DownloadJsonTask(someList.get(i), context)); 
     } 
     pool.shutdown(); 
     pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 
    } catch (Exception e) { 
    } 

Я заметил, если я использую одну нить, чтобы загрузить один за другим, то я вряд ли получите сбой загрузки, но если я использую 8 потоков, то я иногда получаю сбой загрузки. Я не являюсь пользователем сервера/сети, поэтому я не знаю подробно, но я предполагаю, что сервер устанавливает ограничение на одно устройство (или один IP-адрес), пытающееся подключить несколько подключений.

Если это причина, то как мне создать код для решения этой проблемы? Я уже выполнил попытку загрузки 3 раза перед сбоем. Кажется, он исправил это «на данный момент». Тем не менее, я знаю, что мой код не является надежным, и он может сбой в какой-то момент.

Я подумал, что я не был бы первым, кто столкнулся с этой проблемой. Я хотел бы знать надежное решение этой проблемы.

решения я мог думать:
- Попробуйте загрузить по крайней мере 3 раза перед отказом
- После того, как не удалось, то попробуйте спать в течение случайного промежутка времени. Так что неудачные нити не просыпаются одновременно и снова сбой.
- Если сервер выдает какое-то уникальное сообщение назад, такое как занятый сервер, повторите попытку неограниченного (?) (Большого количества) раз.

Я еще не реализовал выше возможных решений. Сначала я хочу знать общее/лучшее решение и тратить время на его реализацию.

Любые идеи?

ответ

2

Этот вопрос основан на мнениях. Я делюсь своими взглядами на это.

В идеале, если вы можете проверить журналы сервера и найти что-то на конце сервера, которое должно быть исправлено, вы должны обязательно сделать это в первую очередь.

В дополнение к этому всегда могут быть сбои в сети, даже если клиент и сервер могут многопоточно обрабатывать параллелизм. Тем не менее, у вас должен быть механизм повтора на стороне клиента.

Некоторых моментов дизайна относительно политики повторных попыток

  1. Держите повторные попытки конфигурируемыми вместо фиксации его на 3. (Вы можете прийти с правильным количеством попыток по профилированию и тестированию)
  2. Вместо спать для случайного промежутка времени, попробуйте exponential backoff.
  3. Вместо повторного запуска неограниченное количество раз, мы можем пометить сообщение пользователю, чтобы повторить попытку позже после того, как экспоненциальная отсрочка повторится. (Что-то вроде «Сайт под нагрузкой. Попробуйте через некоторое время»).
  4. Ознакомьтесь с библиотеками, которые делают повторы для вас. Что-то вроде this.
  5. Полоса пропускания сети также может быть причиной неудачной загрузки. Вы можете контролировать скорость и тип сети (WiFi, LTE, 3G) и т. Д. И решать, загружаться или планироваться позже.

Другая статья here.

Надеюсь, это поможет.

Смежные вопросы