2010-07-21 5 views
6

자바로 HTTP 클라이언트를 구현해야하며 가장 효율적인 방법은 HTTP 파이프 라인 (RFC2616)을 구현하는 것입니다.HTTP 1.1 파이프 라이닝

제쳐두고, 나는 파이프 라인을 만들고 싶습니다. (또한 멀티플렉싱에 대해 이야기하는 것이 아닙니다. HTTP 요청의 응답 일괄 처리를 받기 전에 하나의 연결을 통해 많은 요청을 처리하는 것에 대해 말하고 있습니다.)

파이프 라이닝을 지원하는 명시 적으로 제 3 자 라이브러리를 찾을 수 없습니다. 하지만 예를 들어 그러한 클라이언트를 빌드하려면 Apache HTTPCore을 사용하거나 직접 작성해야합니다.

내가 가진 문제는 좋은 생각입니다. HTTP 파이프 라이닝이 이론적 인 모델 이상이며 HTTP 서버에 의해 올바르게 구현된다는 권위있는 참고 자료를 찾지 못했습니다. 또한 파이프 라이닝을 지원하는 모든 브라우저는 기본적으로이 기능을 해제합니다.

그런 클라이언트를 구현하려고하면 서버의 구현 (또는 프록시)으로 인해 많은 문제가 발생할 것입니다. 이것들에 대한 지침을 제공하는 참고 자료가 있습니까?

효율면에서 대체 프로그래밍 모델은 무엇이 좋지 않은 생각 인가요? 별도의 TCP 연결이 필요합니까?

+0

필요한 것은 아니지만 serf는 HTTP 파이프 라이닝을 구현하는 C 라이브러리입니다. http://code.google.com/p/serf/ 파이프 라인 된 게시물을 지원한다면 100 % 확실하지는 않습니다. – Rup

+0

감사합니다. 자바로해야만합니다. – Cratylus

+0

@ user384706 세프는 절대로 시도하지 않았지만 실제로 원하는 것을 수행하고 다른 모든 것이 실패하면 JNI/JNA를 시도 할 수 있습니다. – luiscubal

답변

8

나는 파이프 라인 HTTP 클라이언트를 구현했습니다. 기본 개념은 쉽게 들리지만 오류 처리는 매우 어렵습니다.성능 향상은 그리 중요하지 않으므로 오래 전에 개념을 포기했습니다.

제 의견으로는 일반적인 사용 사례에는 의미가 없습니다. 요청에 논리 연결이있을 때만 이점이 있습니다. 예를 들어, 3 요청 트랜잭션이 있으며 일괄 적으로 트랜잭션을 모두 보낼 수 있습니다. 그러나 파이프 라인 될 수 있다면 일반적으로 하나의 요청으로 결합 할 수 있습니다. 다음

TCP의 킵 얼라이브는 영구 연결을 보장 할 수 없습니다

  1. 내가 기억하는 단지 몇 가지 장애물이다. 연결에서 파이프 된 3 개의 요청이 있으면 서버는 첫 번째 응답 후에 연결을 끊습니다. 다음 두 요청을 다시 시도했습니다.

  2. 연결이 여러 개있을 경우 부하 분산 또한 까다 롭습니다. 유휴 연결이 없으면 사용중인 연결을 사용하거나 새 연결을 만들 수 있습니다.

  3. 타임 아웃 또한 까다 롭습니다. 하나의 요청 시간이 초과되면 순서대로 돌아와야하기 때문에 모든 요청을 폐기해야합니다.

+0

@ZZ 코더 감사합니다! 당신 클라이언트에서 당신은 또한 파이프 라인을 POST 했습니까? 내 경우가 정상이 아니야. 콜센터에서 작업을 트리거하는 실시간 POST를 파이프 라인으로 보내고 싶습니다. 특히 서버/프록시 동작에 관해 기억할만한 정보는 높이 평가됩니다! – Cratylus

+0

예. POST를 처리합니다. 재시도 논리를 구현하면 본문을 기억해야한다는 점 외에는 차이가 없습니다. –

+0

@ZZ Coder - 1과 관련 : HTTP의 경우, 어쨌든 재시도 논리를 구현해야하며 파이프 라인 연결에 대한 재시도 논리는 크게 다르지 않습니다 (파이프 라인이 끊어진 후 다시 시도하는 경우에만 첫 번째 응답이 파이프 라인 연결인지 여부를 기다리는 것).그리고 요즘 대부분의 서버는 기본적으로 파이프 라이닝을 지원하므로 매우 나쁜 네트워크 연결을 제외하고는 파이프 라인 드롭이 자주 발생하지 않아야합니다. –

9

POST는

8.1.2.2 파이프 라인

"파이프 라인"의 요청 (즉, 각각의 응답을 기다리지 않고 여러 요청 을 보내) 수도 지속적 연결을 지원하는 클라이언트를 파이프 라인되어서는 안된다 . 서버는 요청을받은 과 동일한 순서로 응답을 에게 보내야합니다. 지속적인 연결 및 연결 설정 후 파이프 라인 바로 가정

클라이언트는 첫 파이프 라인 시도가 실패 할 경우 연결 을 재 시도 할 준비가되어 있어야한다. 클라이언트가 이러한 재 시도를 수행하는 경우 연결이 지속된다는 것을 알기 전에 파이프 라인이 아니어야합니다 ( ). 클라이언트는 응답을 모두 보내기 전에 서버가 연결을 닫을 경우 요청을 다시 보내야합니다 ( ).

클라이언트가 아닌 나무 등의 방법이나 비 나무 등 시퀀스 방법 (9.1.2 참조)의를 사용하지 않는 파이프 라인 요청 해야한다. 그렇지 않으면 전송이 조기 종료되면 연결이 불확실한 결과로 이어질 수 있습니다. 멱등 원이 아닌 요청을 보내려는 클라이언트는 이 이전 요청 인 에 대한 응답 상태를 수신 할 때까지 이 해당 요청을 보내야한다고 제안해야합니다.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

+4

답장을 보내 주셔서 감사합니다. 그러나 "특정 행동이 용인되거나 심지어 유용 할 때 특별한 이유가있을 수있다"는 것을 의미하지 않아야한다. 이것은 rfc 2119에 따른다. ~ NOT 정의에 함축 된 의미가없는 한 – Cratylus

+0

@ user384706 요청이 실제로 멱등수라면 아마도 PUT을하고있을 것입니까? –

+0

@ user384706, 그것은 당신이 파이프 라인에 게시 할 때 치사한 서버가 엉망이 될 수 있음을 의미합니다. 그러나 사실, 그것은 당신의 잘못이 아니지만, 일이 잘 안되면 일이 잘되지 않습니다. 잘못이있는 사람은 문제가되지 않습니다. – Pacerier

-1

파이프 라이닝은 http 서버와 거의 차이가 없습니다. 그들은 대개 연결에서 연속적으로 요청을 처리합니다 - 요청을 읽고 응답을 작성한 후 다음 요청을 읽습니다. ...

클라이언트는 멀티플렉싱을 통해 처리량을 향상시킬 가능성이 큽니다. 웹 사이트는 일반적으로 여러 개의 cpus가있는 여러 대의 컴퓨터가 있습니다. 왜 자발적으로 요청을 한 줄로 제한하고 싶습니까? 오늘은 수평 확장 성 (동시 요청)에 관한 것입니다. 물론 벤치마킹하는 것이 가장 좋습니다.

+1

파이프 라이닝에서 최소한 정의마다 요청이 일괄 적으로 처리되므로 상호 작용이 연속적이지 않습니다. 또한 동일한 서버에 대한 열린 연결 수에 제한이 있다면 어떻게해야합니까? – Cratylus

+2

대기 시간이 긴 연결 (전화 접속)을 사용할 때 차이가 있습니다. "뚱뚱한 파이프"(인공위성) 일 때 더욱 그렇습니다. 여러 TCP 연결의 오버 헤드를 피할 수 있지만 대부분의 이점을 유지합니다. – lxgr

관련 문제