Pregunta

Estoy haciendo envíos HTTP con mucha frecuencia (> = 1 / seg) a un punto final de la API y yo quiero estar seguro de que estoy haciendo de manera eficiente. Mi objetivo es tener éxito o fracasar tan pronto como sea posible, sobre todo porque tengo código separado para volver a intentar POST fallidos. Hay una bonita página de HttpClient consejos de rendimiento , pero no estoy seguro de si su implementación de manera exhaustiva todos tendrán beneficios reales. Aquí está mi código en este momento:

public class Poster {
  private String url;
  // re-use our request
  private HttpClient client;
  // re-use our method
  private PostMethod method;

  public Poster(String url) {
    this.url = url;

    // Set up the request for reuse.
    HttpClientParams clientParams = new HttpClientParams();
    clientParams.setSoTimeout(1000);  // 1 second timeout.
    this.client = new HttpClient(clientParams);
    // don't check for stale connections, since we want to be as fast as possible?
    // this.client.getParams().setParameter("http.connection.stalecheck", false);

    this.method = new PostMethod(this.url);
    // custom RetryHandler to prevent retry attempts
    HttpMethodRetryHandler myretryhandler = new HttpMethodRetryHandler() {
      public boolean retryMethod(final HttpMethod method, final IOException exception, int executionCount) {
        // For now, never retry
        return false;
      }
    };

    this.method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, myretryhandler);
  }

  protected boolean sendData(SensorData data) {
    NameValuePair[] payload = {
      // ...
    };
    method.setRequestBody(payload);

    // Execute it and get the results.
    try {
      // Execute the POST method.
      client.executeMethod(method);
    } catch (IOException e) {
      // unable to POST, deal with consequences here
      method.releaseConnection();
      return false;
    }

    // don't release so that it can be reused?
    method.releaseConnection();

    return method.getStatusCode() == HttpStatus.SC_OK;
  }
}

¿Tendría sentido deshabilitar la comprobación de las conexiones rancio? Debo buscar en el uso de la MultiThreadedConnectionManager ? Por supuesto, la evaluación comparativa real ayudaría pero quería comprobar si el código está en el camino correcto en primer lugar.

¿Fue útil?

Solución

La mayor parte del impacto en el rendimiento de las conexiones HTTP es el establecimiento de la conexión de socket. Esto se puede evitar mediante el uso de conexiones keep-alive '' http. Para ello, lo mejor es utilizar HTTP 1.1 y asegúrese de que "Content-Length: xx" siempre se establece en las solicitudes y respuestas, "Connecction: cerrar" está ajustado correctamente cuando sea apropiado y se actúa adecuadamente en cuando se reciben

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top