AWS Lambda执行环境可以在同一实例中重用网络连接。这样可以显著减少启动时间和内存使用,从而提高性能。它可以通过两种方式来实现:SocketOptions 和HttpClientConnectionManager。
SocketOptions:如果需要控制传出连接的套接字选项,则必须使用SocketFactory和SocketOptions。但是,要使用这种方法,您需要实现一个自定义的socker factory。
import org.apache.http.HttpHost; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.params.SyncBasicHttpParams; import org.apache.http.params.SyncHttpParams; import java.net.InetAddress; import java.net.Socket; import java.net.SocketTimeoutException;
public class CustomSocketFactory extends PlainConnectionSocketFactory {
@Override
public Socket createSocket(final HttpContext context) throws IOException {
return new Socket() {
@Override
public synchronized void close() throws IOException {
super.close();
}
};
}
@Override
public Socket connectSocket(int connectTimeout, Socket socket, HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpContext context) throws IOException {
if (socket == null) {
socket = createSocket(context);
}
if (localAddress != null) {
socket.bind(localAddress);
}
try {
socket.setReuseAddress(true);
socket.setSoTimeout(connectTimeout);
socket.connect(remoteAddress, connectTimeout);
}
catch (SocketTimeoutException e) {
throw new ConnectTimeoutException(e, host, remoteAddress.getAddress());
}
return socket;
}
}
然后,您可以使用以下代码在lambda中的httpclient中注册自定义socker factory:
// use custom socket factory
Registry
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); httpClientBuilder.setConnectionManager(connectionManager); httpClientBuilder.setDefaultSocketConfig(SocketConfig.custom() .setSoKeepAlive(true) .setTcpNoDelay(true) .build());
httpClientBuilder.setDefaultRequestConfig(RequestConfig.custom() .setConnectTimeout(5000) .setConnectionRequestTimeout(5000) .setSocketTimeout(5000) .build());
httpclient = httpClientBuilder.build();
HttpClientConnectionManager的实现也可以用于在AWS Lambda中重用连接。
如果使用此方式,您可以通过以下方式在Lambda中使用Apache Httpclient:
static final HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
public static String method1() {
HttpPost httpPost = new HttpPost(generateURL());
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
CloseableHttpResponse response = httpClient.execute(httpPost);
try {
if(response.getStatusLine().getStatusCode() !=200) {
throw new Exception("execute http post exception");
}
ResponseHandler rh = new BasicResponseHandler();
return (String) rh.handleResponse(response);
} finally {
response.close();
}
}
在这种情况下,您不需要自定义socker factory。但是,请确保代码