웹 백엔드, 앱 백엔드, SOA 서비스 중 무엇을 하든 긴 연결은 한편으로는 매번 연결을 설정하는 데 드는 리소스 소비를 절약하는 좋은 선택입니다. 적시에 응답하고 향상된 경험을 제공합니다.
다음은 Nginx 모듈을 통해 긴 연결을 구현하는 방법입니다. 엄밀히 말하면 http 프로토콜 자체는 요청-응답 유형이며 엄격한 긴 연결이 없습니다. 소위 긴 연결이란 응답이 없을 때 응답이 있을 때까지 유지했다가 즉시 연결을 다시 설정할 수 있음을 의미합니다.
이를 달성하는 방법에 대해 이야기해 보겠습니다.
1. 먼저 이 두 tar 파일인 NGiNX_HTTP_Push_Module과 Nginx를 다운로드합니다.
2. linux 시스템을 설치하고 nginx 디렉터리에서 실행합니다:
./configure --add-module=path/to/nginx_http_push_module ... make make install
4. nginx가 설치된 후 /use nginx에서
긴 연결을 구성합니다. conf 파일
/local/nginx/conf 추가:
location /publish { set $push_channel_id $arg_id; push_publisher; push_store_messages on; push_message_timeout 2h; push_max_message_buffer_length 10; } location /activity { push_subscriber; set $push_channel_id $arg_id; push_subscriber_concurrency broadcast; default_type text/plain; }
public void testNginx(){ String http = "http://172.16.4.108/publish?id=my"; PostMethod postMethod = new PostMethod(http); RequestEntity requestEntity = new StringRequestEntity("444"); postMethod.setRequestEntity(requestEntity); try{ int status =this.client.executeMethod(postMethod); if (status == HttpStatus.SC_OK) { String text = postMethod.getResponseBodyAsString(); System.out.println(text); } }catch (Exception e){ e.printStackTrace(); } }
다음은 간단한 청취 터미널입니다. 구현하려면 청취 측에서 항상 lastModified를 기록해야 합니다. 이 시간은 수신된 마지막 새 메시지의 시간을 나타냅니다.
private static String etag = ""; private static String lastModified = ""; public static void main(String[] args){ while (true) { HttpClient httpClient = new HttpClient(); String http = "http://172.16.4.108/activity?id=my"; GetMethod getMethod = new GetMethod(http); getMethod.setRequestHeader("Connection","keep-alive"); getMethod.setRequestHeader("If-None-Match", etag); getMethod.setRequestHeader("If-Modified-Since", lastModified); try { int status = httpClient.executeMethod(getMethod); if(getMethod.getResponseHeader("Etag") != null) { etag = getMethod.getResponseHeader("Etag").getValue(); } if(getMethod.getResponseHeader("Last-Modified") != null) { lastModified = getMethod.getResponseHeader("Last-Modified").getValue(); } System.out.println("etag=" + etag + ";lastmodif=" + lastModified + ";status=" + status); if (status == HttpStatus.SC_OK) { String text = getMethod.getResponseBodyAsString(); System.out.println(text); } } catch (Exception e) { e.printStackTrace(); } } }
public void testNginx(){ String http = "http://172.16.4.108/publish?id=my"; PostMethod postMethod = new PostMethod(http); RequestEntity requestEntity = new StringRequestEntity("444"); postMethod.setRequestEntity(requestEntity); try{ int status =this.client.executeMethod(postMethod); if (status == HttpStatus.SC_OK) { String text = postMethod.getResponseBodyAsString(); System.out.println(text); } }catch (Exception e){ e.printStackTrace(); } }이제 솔루션이 완성되었습니다.
위에서는 애플리케이션의 측면을 포함하여 긴 연결 애플리케이션을 구현하기 위해 Nginx를 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.