1

我希望通过一个简单的 REST 风格的 HTTP 帖子优化一个持续运行并频繁调用(平均每秒 > 1 次)外部 API 的进程。我注意到的一件事是,目前,根据以下结构,为每个 API 调用创建和关闭 HttpUrlConnection(为了便于阅读,删除了非必要代码和错误处理)。

//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();

我的问题是:

  • 一般来说,这是一个合理的优化吗(速度增加会很明显)吗?

假设是:

  • 我应该重用输出流以及连接吗?
  • 仅在错误时重新初始化连接是否合理,或者我应该在一定数量的请求/时间后这样做?
4

1 回答 1

2

基本上,是的,而且它节省了很多时间——设置一个套接字需要付出很大的努力,使用 SSL 更糟。这就是为什么在旧时代实施“keepalive”的原因。这与 REST 哲学有点相反,但它是一种性能优化。

关于它的一件事是套接字是有限的资源。在一个真正大量使用的环境中,您最终可能没有用于新连接的套接字。这是一件坏事。

于 2008-12-19T22:08:03.993 回答