기본 "롱 폴링"을 어떻게 구현합니까?


776

Long Polling의 작동 방식 (예 : thisthis ) 에 대한 많은 정보를 찾을 수 있지만 이를 코드로 구현하는 간단한 예는 없습니다 .

내가 찾을 수있는 것은 cometd 입니다. Dojo JS 프레임 워크와 상당히 복잡한 서버 시스템에 의존합니다.

기본적으로 Apache를 사용하여 요청을 처리하는 방법과 새 메시지를 위해 서버를 "장시간 폴링"하는 간단한 스크립트 (예 : PHP)를 작성하는 방법은 무엇입니까?

이 예제는 확장 가능하거나 안전하거나 완벽 할 필요는 없으며 작동 만하면됩니다!

답변:


512

처음에 생각했던 것보다 간단합니다. 기본적으로 보내려는 데이터를 사용할 수있을 때까지 (예 : 새 메시지가 도착할 때) 아무 작업도 수행하지 않는 페이지가 있습니다.

다음은 2-10 초 후에 간단한 문자열을 보내는 매우 기본적인 예입니다. 오류 404를 리턴 할 가능성의 3 분의 1 (다음 Javascript 예제에서 오류 처리를 표시하기 위해)

msgsrv.php

<?php
if(rand(1,3) == 1){
    /* Fake an error */
    header("HTTP/1.0 404 Not Found");
    die();
}

/* Send a string after a random number of seconds (2-10) */
sleep(rand(2,10));
echo("Hi! Have a random number: " . rand(1,10));
?>

참고 : 실제 사이트의 경우 Apache와 같은 일반 웹 서버에서이를 실행하면 모든 "작업자 스레드"가 빠르게 연결되어 다른 요청에 응답 할 수 없게됩니다.이 방법에는 여러 가지 방법이 있지만 작성하는 것이 좋습니다. 파이썬의 twisted 와 같은 "장점 서버" 는 요청 당 하나의 스레드에 의존하지 않습니다. cometD 는 널리 사용되는 언어이며 여러 언어로 제공되며 Tornado 는 이러한 작업을 위해 특별히 만들어진 새로운 프레임 워크입니다 (FriendFeed의 긴 폴링 코드 용으로 빌드 됨). 그러나 간단한 예로 Apache가 적합합니다. ! 이 스크립트는 어떤 언어로도 쉽게 작성할 수 있습니다 (아파치 / PHP는 매우 일반적이므로 로컬로 실행하고 있습니다)

그런 다음 Javascript에서 위 파일 ( msg_srv.php) 을 요청하고 응답을 기다립니다. 하나를 얻으면 데이터에 따라 행동합니다. 그런 다음 파일을 요청하고 다시 기다렸다가 데이터를 처리하고 반복하십시오.

다음은 이러한 페이지의 예입니다. 페이지가로드되면 msgsrv.php파일에 대한 초기 요청을 전송 합니다. 성공하면 #messagesdiv에 메시지를 추가 한 후 1 초 후에 waitForMsg 함수를 다시 호출합니다. 대기를 트리거합니다.

1 초 setTimeout()는 실제로 기본 속도 제한 기이며, 이것 없이는 잘 작동하지만 msgsrv.php 항상 즉시 오류 (예 : 구문 오류와 함께)가 반환되면 브라우저가 넘쳐 빠르게 정지 할 수 있습니다. 파일에 유효한 JSON 응답이 포함되어 있는지 확인하거나 분당 총 요청 수를 유지하고 적절하게 일시 중지하는 것이 좋습니다.

페이지 오류가 발생하면 #messagesdiv에 오류가 추가되고 15 초 동안 기다렸다가 다시 시도합니다 (각 메시지 후 1 초 동안 대기하는 방식과 동일)

이 방법의 좋은 점은 복원력이 뛰어나다는 것입니다. 클라이언트의 인터넷 연결이 끊어지면 시간 초과되고 다시 연결됩니다. 이는 폴링 작동 시간에 내재되어 있으며 복잡한 오류 처리가 필요하지 않습니다.

어쨌든 long_poller.htmjQuery 프레임 워크를 사용 하는 코드 :

<html>
<head>
    <title>BargePoller</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"></script>

    <style type="text/css" media="screen">
      body{ background:#000;color:#fff;font-size:.9em; }
      .msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
      .old{ background-color:#246499;}
      .new{ background-color:#3B9957;}
    .error{ background-color:#992E36;}
    </style>

    <script type="text/javascript" charset="utf-8">
    function addmsg(type, msg){
        /* Simple helper to add a div.
        type is the name of a CSS class (old/new/error).
        msg is the contents of the div */
        $("#messages").append(
            "<div class='msg "+ type +"'>"+ msg +"</div>"
        );
    }

    function waitForMsg(){
        /* This requests the url "msgsrv.php"
        When it complete (or errors)*/
        $.ajax({
            type: "GET",
            url: "msgsrv.php",

            async: true, /* If set to non-async, browser shows page as "Loading.."*/
            cache: false,
            timeout:50000, /* Timeout in ms */

            success: function(data){ /* called when request to barge.php completes */
                addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
                setTimeout(
                    waitForMsg, /* Request next message */
                    1000 /* ..after 1 seconds */
                );
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                addmsg("error", textStatus + " (" + errorThrown + ")");
                setTimeout(
                    waitForMsg, /* Try again after.. */
                    15000); /* milliseconds (15seconds) */
            }
        });
    };

    $(document).ready(function(){
        waitForMsg(); /* Start the inital request */
    });
    </script>
</head>
<body>
    <div id="messages">
        <div class="msg old">
            BargePoll message requester!
        </div>
    </div>
</body>
</html>

7
이 아이디어를 사용하여 일부 메시지를 확인할 수 없습니까? 그 1 초의 시간 초과, 즉 1000 개의 채팅 메시지가 전송되었다고하면, 서버는 1000 개의 메시지를 해당 클라이언트에게 구체적으로 보내는 것을 어떻게 알 수 있습니까?
DevDevDev

15
아마. 이것은 개념을 설명하기 위해 매우 단순화 된 예입니다.이를보다 잘 수행하려면보다 구체적인 서버 측 코드가 필요합니다. 여기서는 특정 클라이언트에 대해 1000 개의 메시지를 저장하고 한 덩어리로 보낼 것입니다. waitForMsg 시간 초과를 안전하게 줄일 수도 있습니다
dbr

21
nodejs 는 긴 폴링 요청을위한 또 하나의 뛰어난 서버 측 솔루션이며, Javascript로 서버 코드를 작성할 수 있다는 추가 이점 (Twisted보다)입니다.
Husky

8
이것은 1 초 간격으로 서버에 대한 일반적인 반복 AJAX 연결입니다. 이것은 "긴 폴링"과 관련이 없습니다. 긴 폴링은 클라이언트 시간 초과가 발생하는 한 연결을 유지해야합니다.
Deele

6
문제는 실제 PHP 스크립트 대신 sleep(rand(2,10));무엇 을하는 것 입니까? 아무것도하지 않으려면 100 밀리 초마다 데이터베이스를 폴링합니까? 언제 죽기로 결정합니까?
Luis Siquot

41

slosh의 일부로 간단한 채팅 예제가 있습니다 .

편집 : (모든 사람이 여기에 코드를 붙여 넣었으므로)

long-polling 및 slosh를 사용하는 완전한 JSON 기반 다중 사용자 채팅 입니다. 이것은 호출을 수행하는 방법에 대한 데모 이므로 XSS 문제를 무시하십시오. 아무도 먼저 소독하지 않고 배포해서는 안됩니다.

클라이언트는 항상 서버에 연결되어 있으며 누구나 메시지를 보내면 즉시 거의 즉시 볼 수 있어야합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Copyright (c) 2008 Dustin Sallings <dustin+html@spy.net> -->
<html lang="en">
  <head>
    <title>slosh chat</title>
    <script type="text/javascript"
      src="http://code.jquery.com/jquery-latest.js"></script>
    <link title="Default" rel="stylesheet" media="screen" href="style.css" />
  </head>

  <body>
    <h1>Welcome to Slosh Chat</h1>

    <div id="messages">
      <div>
        <span class="from">First!:</span>
        <span class="msg">Welcome to chat. Please don't hurt each other.</span>
      </div>
    </div>

    <form method="post" action="#">
      <div>Nick: <input id='from' type="text" name="from"/></div>
      <div>Message:</div>
      <div><textarea id='msg' name="msg"></textarea></div>
      <div><input type="submit" value="Say it" id="submit"/></div>
    </form>

    <script type="text/javascript">
      function gotData(json, st) {
        var msgs=$('#messages');
        $.each(json.res, function(idx, p) {
          var from = p.from[0]
          var msg = p.msg[0]
          msgs.append("<div><span class='from'>" + from + ":</span>" +
            " <span class='msg'>" + msg + "</span></div>");
        });
        // The jQuery wrapped msgs above does not work here.
        var msgs=document.getElementById("messages");
        msgs.scrollTop = msgs.scrollHeight;
      }

      function getNewComments() {
        $.getJSON('/topics/chat.json', gotData);
      }

      $(document).ready(function() {
        $(document).ajaxStop(getNewComments);
        $("form").submit(function() {
          $.post('/topics/chat', $('form').serialize());
          return false;
        });
        getNewComments();
      });
    </script>
  </body>
</html>

1
이것이 항상 어떻게 연결되는지 알 수 있습니까? 어리석은 짓을한다면 미안하지만 알고 싶습니다.
Rocky Singh

4
HTTP GET을 수행하고 서버는 사용 가능한 데이터가있을 때까지 GET을 차단합니다. 데이터가 서버에 도착하면 서버는 데이터를 클라이언트에 반환하고, 들어오는 모든 것을 큐에 넣은 다음 클라이언트가 다시 연결하여 누락 된 메시지가있는 경우 선택합니다. 그렇지 않으면 다시 차단됩니다.
더스틴

4
처음에는하지 분명하지만, 일이 그 '항상 연결 상태'에 대한 책임 수 있습니다 ajaxStopgetNewComments그냥 모든 Ajax 요청의 끝을 발사 있도록 끊임없이,이 콜백
baldrs

32

토네이도 는 긴 폴링을 위해 설계되었으며 서버 코드와 JS 클라이언트 코드를 포함하여 / examples / chatdemo에 아주 적은 (수백 줄의 Python) 채팅 앱 을 포함합니다. 다음과 같이 작동합니다.

  • 클라이언트는 JS를 사용하여 이후의 업데이트를 요청합니다 (마지막 메시지 수). 서버 URLHandler는이를 수신하고 클라이언트에 대한 콜백을 큐에 추가합니다.

  • 서버가 새 메시지를 받으면 onmessage 이벤트가 발생하고 콜백을 반복하여 메시지를 보냅니다.

  • 클라이언트 측 JS는 메시지를 수신하여 페이지에 추가 한 다음이 새 메시지 ID 이후로 업데이트를 요청합니다.


25

클라이언트가 정상적인 비동기 AJAX 요청처럼 보이지만 다시 돌아 오는 데 시간이 오래 걸릴 것으로 예상합니다.

그러면 서버는 다음과 같습니다.

while (!hasNewData())
    usleep(50);

outputNewData();

따라서 AJAX 요청은 서버에 전송되며, 아마도 마지막 업데이트 시간을 포함하여 hasNewData()이미 가지고있는 데이터를 알 수 있습니다. 그런 다음 서버는 새 데이터를 사용할 수있을 때까지 루프 휴면 상태에 있습니다. 그 동안 AJAX 요청은 여전히 ​​연결되어 있으며 데이터를 기다리는 중입니다. 마지막으로, 새 데이터를 사용할 수있게되면 서버는 해당 데이터를 AJAX 요청에 제공하고 연결을 닫습니다.


10
현재 스레드를 차단하는 바쁜 대기입니다. 전혀 확장되지 않습니다.
Wouter Lievens

10
아니요, usleep은 바쁜 대기가 아닙니다. "대기"의 요점은 잠시 동안 스레드를 차단하는 것입니다. 아마도 그는 50 마이크로 초가 아니라 50 밀리 초 (usleep (50000))를 의미했습니다! 어쨌든 일반적인 Apache / PHP 설정을 사용 하면 다른 방법이 있습니까?
Matt

자, 우선, 기다리지 않고 채팅 메시지에 대한 차단 기능을 만들 수 없습니다.
Tomáš Zato-복원 모니카

대단해! 새로운 데이터를 확인하기 위해 서버에 재귀 함수를 만들었습니다. 그러나 긴 폴링을 효율적으로 사용하는 가장 좋은 제품은 무엇입니까? 내가 이상 4/5 브라우저 탭을 열 때 나는 보통 아파치를 사용하고 서버가 응답하지 않습니다 :(는 PHP와 함께 사용할 수 뭔가를 찾고
현대인

17

다음 은 C #에서 롱 폴링에 사용하는 클래스입니다. 기본적으로 6 개의 수업이 있습니다 (아래 참조).

  1. 컨트롤러 : 유효한 응답을 생성하는 데 필요한 작업을 처리합니다 (db 작업 등).
  2. 프로세서 : 웹 페이지와의 비동기 통신을 관리합니다 (자체)
  3. IAsynchProcessor : 서비스가이 인터페이스를 구현하는 인스턴스를 처리합니다.
  4. 서비스 : IAsynchProcessor를 구현하는 요청 객체를 처리합니다.
  5. 요청 : 응답 (객체)을 포함하는 IAsynchProcessor 래퍼
  6. 응답 : 사용자 정의 객체 또는 필드를 포함합니다

2
알았어 .. 왜 투표가 취소 되었나요? 이 클래스는 실제로 장거리 폴링의 유효한 예입니다.
죄수 제로

실제 긴 폴링은 자원에 대해 일반 폴링을 수행하는 동안 간격을 늘리는 관행이 아닙니다. 그것은 해석의 대상이되는 다소 큰 패턴의 일부이지만 전체 구현의 특정 영역에서만 가능합니다. 그것은 말했다 ...이 수업은 위의 패턴을 따릅니다! 따라서 당신이 이것을 거부 할 이유가 있다면 ... 나는 그 이유에 정말로 관심이있을 것입니다.
죄수 제로

아마도 간단한 코드 예제의 문제를 직접 다루지 않기 때문에 투표에 실패했을 수도 있습니다. 물론 투표하지 않았기 때문에 추측 만 할 수 있습니다.
Andrew

16

다음은 PHP 및 jQuery를 사용하여 긴 폴링을 수행하는 방법에 대한 멋진 5 분 스크린 캐스트입니다. http://screenr.com/SNH

코드는 위의 dbr 예제 와 매우 유사합니다 .


3
필자는 이것을 장기 폴링에 대한 소개로만보아야한다고 생각합니다.이 구현은 많은 동시 사용자가있는 서버를 죽일 수 있기 때문입니다.
Alfred

나는 단지이 모든 것에 대해 배우고 ... 어떻게 신뢰할 수 있는지 아닌지, 몇 명의 사용자와 함께하는가 ... 10 다시 채팅을합니까?
somdow

12

다음은 Erik DubbelboerContent-type: multipart/x-mixed-replace헤더를 사용하는 PHP의 간단한 폴링 예제입니다 .

<?

header('Content-type: multipart/x-mixed-replace; boundary=endofsection');

// Keep in mind that the empty line is important to separate the headers
// from the content.
echo 'Content-type: text/plain

After 5 seconds this will go away and a cat will appear...
--endofsection
';
flush(); // Don't forget to flush the content to the browser.


sleep(5);


echo 'Content-type: image/jpg

';

$stream = fopen('cat.jpg', 'rb');
fpassthru($stream);
fclose($stream);

echo '
--endofsection
';

그리고 여기 데모가 있습니다 :

http://dubbelboer.com/multipart.php


11

내가 사용 혜성과 그립에 도착, 나는 또한 자바 글래스 피시 서버를 사용하여 혜성을 설정하고 cometdaily.com에 가입하여 다른 사례를 많이 발견했다



9

아래는 Inform8 Web을 위해 개발 한 긴 폴링 솔루션입니다. 기본적으로 클래스를 재정의하고 loadData 메서드를 구현합니다. loadData가 값을 반환하거나 작업 시간이 초과되면 결과가 인쇄되고 반환됩니다.

스크립트 처리에 30 초 이상 걸릴 수있는 경우 set_time_limit () 호출을 더 길게 변경해야 할 수도 있습니다.

아파치 2.0 라이센스. github의 최신 버전 https://github.com/ryanhend/Inform8/blob/master/Inform8-web/src/config/lib/Inform8/longpoll/LongPoller.php

라이언

abstract class LongPoller {

  protected $sleepTime = 5;
  protected $timeoutTime = 30;

  function __construct() {
  }


  function setTimeout($timeout) {
    $this->timeoutTime = $timeout;
  }

  function setSleep($sleep) {
    $this->sleepTime = $sleepTime;
  }


  public function run() {
    $data = NULL;
    $timeout = 0;

    set_time_limit($this->timeoutTime + $this->sleepTime + 15);

    //Query database for data
    while($data == NULL && $timeout < $this->timeoutTime) {
      $data = $this->loadData();
      if($data == NULL){

        //No new orders, flush to notify php still alive
        flush();

        //Wait for new Messages
        sleep($this->sleepTime);
        $timeout += $this->sleepTime;
      }else{
        echo $data;
        flush();
      }
    }

  }


  protected abstract function loadData();

}

8

코드 dbr 감사합니다 . long_poller.htm에 작은 오타 가 있습니다.

1000 /* ..after 1 seconds */

나는 그것이 있어야한다고 생각

"1000"); /* ..after 1 seconds */

작동합니다.

관심있는 사람들을 위해 Django와 동등한 것을 시도했습니다. 긴 폴링을 위해 lp 로 새 장고 프로젝트를 시작하십시오 .

django-admin.py startproject lp

메시지 서버 의 앱 msgsrv 를 호출하십시오 .

python manage.py startapp msgsrv

settings.py 에 다음 줄을 추가하여 템플릿 디렉토리를 만듭니다 .

import os.path
PROJECT_DIR = os.path.dirname(__file__)
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, 'templates'),
)

urls.py 에서 URL 패턴을 다음과 같이 정의하십시오 .

from django.views.generic.simple import direct_to_template
from lp.msgsrv.views import retmsg

urlpatterns = patterns('',
    (r'^msgsrv\.php$', retmsg),
    (r'^long_poller\.htm$', direct_to_template, {'template': 'long_poller.htm'}),
)

그리고 msgsrv / views.py 는 다음과 같아야 합니다 :

from random import randint
from time import sleep
from django.http import HttpResponse, HttpResponseNotFound

def retmsg(request):
    if randint(1,3) == 1:
        return HttpResponseNotFound('<h1>Page not found</h1>')
    else:
        sleep(randint(2,10))
        return HttpResponse('Hi! Have a random number: %s' % str(randint(1,10)))

마지막으로, templates / long_poller.htm 은 오타가 수정 된 위와 동일해야합니다. 도움이 되었기를 바랍니다.


실제로 "15000"구문 오류입니다. setTimeout은 두 번째 매개 변수로 정수를 사용합니다.
앤드류 헤지스

이 답변은 효과가 필요합니다. 하나 이상의 의견과 별도의 답변의 정점입니다.
브라이언 웹스터

8

이것은 PHP가 매우 좋지 않은 시나리오 중 하나입니다. 앞에서 언급했듯이 모든 Apache 작업자를 다음과 같이 매우 빠르게 묶을 수 있습니다. PHP는 시작, 실행, 중지를 위해 만들어졌습니다. 시작, 대기 ... 실행, 중지를 위해 만들어지지 않았습니다. 서버를 매우 빠르게 시작하고 놀라운 확장 문제가 있음을 알게됩니다.

즉, 여전히 PHP 로이 작업을 수행 할 수 있으며 nginx HttpPushStreamModule을 사용하여 서버를 죽이지 않도록 할 수 있습니다 : http://wiki.nginx.org/HttpPushStreamModule

Apache (또는 다른 것) 앞에 nginx를 설정하면 동시 연결을 열어 놓는 작업을 처리합니다. 백그라운드 작업으로 할 수있는 내부 주소로 데이터를 보내거나 새로운 요청이 올 때마다 대기중인 사람들에게 메시지를 보내도록하여 페이로드로 응답하기 만하면됩니다. 이렇게하면 긴 폴링 중에 PHP 프로세스가 열려 있지 않습니다.

이것은 PHP에만 국한된 것이 아니며 모든 백엔드 언어와 함께 nginx를 사용하여 수행 할 수 있습니다. 동시 개방 연결로드는 Node.js와 동일하므로 가장 큰 장점은 이와 같은 이유로 NEEDING Node에서 벗어날 수 있다는 것입니다.

긴 폴링을 달성하기 위해 다른 언어 라이브러리를 언급하는 다른 사람들이 많이 있습니다. 그럴만한 이유가 있습니다. PHP는 이러한 유형의 행동을 위해 자연스럽게 잘 구축되지 않았습니다.


이것은 Apache 문제입니까 아니면 PHP 문제입니까? PHP 코드가 nginx 또는 lighttpd에서 직접 실행 된 경우 긴 폴링에 문제가 있습니까?
David

PHP 문제가 적고 PHP 오용이 더 많습니다. 모든 요청에서 PHP는 스크립트를 처음부터 실행하여 필요에 따라 라이브러리를로드하고 코드를 실행 한 다음 요청에서 시작된 모든 것을 가비지 수집하는 동안 종료합니다. 최근 정적 바인딩, 지연 로딩, 메모리 바이트 코드 캐시에서 디스크 I / O를 제거하는 등의 영향을 최소화하기 위해 PHP에 대한 많은 수정이있었습니다. PHP는 빠르게 시작하고 중지해야한다는 문제가 남아 있습니다 가능한 한. 한 번로드 / 부팅하고 요청에 대한 스레드를 여는 언어는 긴 폴링에 훨씬 적합합니다.
brightball

그러나 질문에 대답하기 위해 아파치를 사용하든 다른 것을 사용하든 관계없이 문제가 발생합니다. PHP가 작동하는 방식입니다. 알려진 최대 트래픽로드를 얻으려면 PHP가 좋을 것이라고 말하기 위해 이것을 수정해야합니다. 몇 개의 연결 만 있기 때문에 문제가없는 PHP를 사용하는 임베디드 시스템을 보았습니다. 잠재적으로 회사 인트라넷에서 이것은 통과 가능할 수도 있습니다. 그러나 공개 응용 프로그램의 경우 트래픽이 증가함에 따라 서버가 완전히 종료됩니다.
brightball

4

긴 폴링 대신 웹 소켓을 고려해보십시오. 그것들은 훨씬 효율적이고 설정하기 쉽습니다. 그러나 최신 브라우저에서만 지원됩니다. 다음은 빠른 참조 입니다.


일단 웹 소켓이 모든 곳에서 구현되면 (아마도 몇 년이 아닌) 이런 종류의 응용 프로그램의 표준이 될 것이라고 생각합니다. 불행히도 현재로서는 프로덕션 앱에 의존 할 수 없습니다.
Richard

3
@Richard 그러나 자동 폴백 전송을 제공하는 소켓 .IO와 같은 것을 사용할 수 있으며 IE 6까지 웹 소켓과 같은 기능을 제공합니다.
Brad



2

libevent로 빌드 된 C1000K C ++ 혜성 서버 인 icomet ( https://github.com/ideawu/icomet )을 사용해 볼 수 있습니다 . icomet은 JavaScript 라이브러리도 제공합니다.

var comet = new iComet({
    sign_url: 'http://' + app_host + '/sign?obj=' + obj,
    sub_url: 'http://' + icomet_host + '/sub',
    callback: function(msg){
        // on server push
        alert(msg.content);
    }
});

icomet은 Safari (iOS, Mac), IE (Windows), Firefox, Chrome 등 광범위한 브라우저 및 OS를 지원합니다.


0

가장 간단한 NodeJS

const http = require('http');

const server = http.createServer((req, res) => {
  SomeVeryLongAction(res);
});

server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

server.listen(8000);

// the long running task - simplified to setTimeout here
// but can be async, wait from websocket service - whatever really
function SomeVeryLongAction(response) {
  setTimeout(response.end, 10000);
}

response미들웨어에서 얻을 수 있는 뛰어난 현명한 프로덕션 시나리오 . 수행해야 할 작업을 수행하고, 긴 폴링 된 모든 메소드를 맵 또는 다른 플로우에 표시되는 <Response> response.end()것으로 범위를 지정하고 준비가 될 때마다 호출 할 수 있습니다. 긴 폴링 연결에는 특별한 것이 없습니다. 나머지는 응용 프로그램을 정상적으로 구성하는 방법입니다.

당신이 내가 스코핑함으로써 의미하는 것을 모른다면, 이것은 당신에게 아이디어를 줄 것입니다

const http = require('http');
var responsesArray = [];

const server = http.createServer((req, res) => {
  // not dealing with connection
  // put it on stack (array in this case)
  responsesArray.push(res);
  // end this is where normal api flow ends
});

server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

// and eventually when we are ready to resolve
// that if is there just to ensure you actually 
// called endpoint before the timeout kicks in
function SomeVeryLongAction() {
  if ( responsesArray.length ) {
    let localResponse = responsesArray.shift();
    localResponse.end();
  }
}

// simulate some action out of endpoint flow
setTimeout(SomeVeryLongAction, 10000);
server.listen(8000);

보시다시피, 모든 연결에 실제로 응답 할 수 있습니다. 이 id당신이 API 호출에서지도 및 액세스 특정을 사용할 수 있어야하므로 모든 요청에 대해.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.