Разумно ли держать HttpUrlConnection открытым неопределенно для удаленной конечной точки REST? - PullRequest
1 голос
/ 20 декабря 2008

Я стремлюсь оптимизировать процесс, который выполняется постоянно и делает частые вызовы (в среднем> 1 в секунду) внешнему API через простую HTTP-запись в стиле REST. Одна вещь, которую я заметил, это то, что в настоящее время HttpUrlConnection создается и закрывается для каждого вызова API согласно следующей структуре (необязательный код и обработка ошибок удалены для удобства чтения).

//every API call
try {
  URL url = new URL("..remote_site..");
  conn = (HttpURLConnection) url.openConnection();
  setupConnectionOptions(conn); //sets things like timeoout and usecaches false
  outputWriter = new OutputStreamWriter(new BufferedOutputStream(conn.getOutputStream()));
  //send request
} finally {
  conn.disconnect();
  outputWriter.close();
}

У меня нет большого опыта работы с протоколом http напрямую, но, исходя из здравого смысла / знания сокетов в целом, кажется, что было бы гораздо эффективнее создать соединение только один раз и использовать его повторно, и только повторно инициализируйте его для решения проблемы, чтобы каждый раз избегать согласования соединения, например:

//on startup, or error
private void initializeConnection()
{
  URL url = new URL("..remote_site..");
  conn = (HttpURLConnection) url.openConnection();
  setupConnectionOptions(conn); //sets things like timeoout and usecaches false
}

//per request
try {
  outputWriter = new OutputStreamWriter(new BufferedOutputStream(conn.getOutputStream()));
  //send request
} catch (IOException) {
  try conn.disconnect();
  initializeConnection();
} finally {
  outputWriter.close();
}

//on graceful exit
conn.disconnect();

Мои вопросы:

  • Является ли это разумной оптимизацией в целом (будет ли заметно увеличение скорости)?

Предположим, да:

  • следует ли повторно использовать выходной поток, а также соединение?
  • Разумно ли повторно инициализировать соединение при ошибке или я должен делать это после определенного количества запросов / времени?

1 Ответ

2 голосов
/ 20 декабря 2008

В принципе, да, и это экономит много времени - настройка сокета требует значительных усилий, еще хуже с SSL. Вот почему «keepalive» был реализован еще в старые времена. Это немного противоречит философии REST, но это оптимизация производительности.

Единственное, что в этом есть, сокеты - это ограниченный ресурс; в действительно интенсивной среде вы можете не иметь сокетов для новых подключений. это плохо.

...