Нужна помощь с настройкой кода кометы - PullRequest
3 голосов
/ 03 апреля 2010

Кто-нибудь знает какой-нибудь способ или, возможно, считает возможным подключить Node.js к push-модулю Nginx http для поддержания постоянного соединения между клиентом и браузером.

Я новичок в комете, поэтому просто не разбираюсь в публикации и т. Д., Может быть, кто-то может мне помочь с этим.

На данный момент я настроил следующее. Я скачал плагин jQuery.comet и установил следующий базовый код:

Клиентский JavaScript

<script type="text/javascript">

    function updateFeed(data) {
        $('#time').text(data);
    }

    function catchAll(data, type) {
        console.log(data);
        console.log(type);
    }

    $.comet.connect('/broadcast/sub?channel=getIt');
    $.comet.bind(updateFeed, 'feed');
    $.comet.bind(catchAll);

    $('#kill-button').click(function() {
        $.comet.unbind(updateFeed, 'feed');
    });
</script>

Из этого я могу понять, что клиент будет продолжать прослушивать URL-адрес, после которого следует / broadcast / sub = getIt. Когда появляется сообщение, оно запускает updateFeed.

Довольно простой и понятный ИМО.

Конфигурация Nginx http push-модуля

default_type application / octet-stream; sendfile on; keepalive_timeout 65; push_authorized_channels_only off;

server {
  listen       80;
  location /broadcast {
    location = /broadcast/sub {
      set $push_channel_id $arg_channel;
      push_subscriber;
      push_subscriber_concurrency broadcast;
      push_channel_group broadcast;
    }

    location = /broadcast/pub {
      set $push_channel_id $arg_channel;
      push_publisher;
      push_min_message_buffer_length 5;
      push_max_message_buffer_length 20;
      push_message_timeout 5s;
      push_channel_group broadcast;
    }
  }
}

Хорошо, теперь это говорит nginx прослушивать порт 80 для любых вызовов / broadcast / sub, и он возвращает все ответы, отправленные на /broadcast/pub.

.

Довольно простой тоже. Эта часть не так сложна для понимания и хорошо документирована через Интернет. В большинстве случаев за этим стоит файл ruby ​​или php, который выполняет трансляцию.

Моя идея состоит в том, чтобы трансляция node.js /broadcast/pub. Я думаю, что это позволит мне иметь persistent streaming data от сервера к клиенту без разрыва соединения. Я попробовал подход длинного опроса с циклическим запросом, но я думаю, что это будет более эффективным.

Или это не сработает.

Node.js file

Теперь, чтобы создать Node.js, я потерян. Прежде всего, я не знаю, как заставить файл node.js работать таким образом.

Настройка, которую я использовал для длинного опроса, выглядит следующим образом:

var sys = require('sys'), 
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(new Date());
    res.close();
    seTimeout('',1000);
}).listen(8000);

Это слушает порт 8000 и просто записывает в переменную ответа.

При длительном опросе мой nginx.config выглядел примерно так:

server {
  listen      80;
  server_name _;

  location / {
    proxy_pass   http://mydomain.com:8080$request_uri;
    include      /etc/nginx/proxy.conf;
  }
 }

Это просто перенаправило порт 80 на 8000, и это работало нормально.

Есть ли у кого-нибудь идеи о том, как заставить Node.js действовать так, как это понимает Comet? Было бы очень приятно, и вы мне очень поможете.

Recources

используется

Чтобы использовать faye, мне нужно установить кометный клиент, но я хочу использовать тот, который поставляется с Nginx. Вот почему я не просто использую Фэй. Тот, что использует nginx, гораздо более оптимизирован.

дополнительный

1 Ответ

2 голосов
/ 05 апреля 2010

Глядя на вашу ссылку , мне кажется, что вся работа над публикациями / подпрограммами выполняется Nginx, код Ruby используется только для его проверки и отправки сообщений. Клиенты все еще используют длинные опросы:

В приведенном выше сценарии каждые пять секунд издатель отправляет новое событие на наш сервер Nginx, который, в свою очередь, отправляет данные двум подписчикам , у которых открыты соединения с длинным опросом и ждут данных , Как только сообщение отправлено каждому подписчику, Nginx закрывает свои соединения, а клиенты немедленно восстанавливают их , чтобы дождаться следующего доступного сообщения.

Nginx служит простым ретранслятором для сообщений (кстати, очень умная настройка, спасибо за ссылку).

Короче говоря: браузеры не способны на такое соединение, которое вы пытаетесь установить. Для этого и были изобретены WebSockets .

Позже я сделаю код в Node.js, чтобы использовать эту настройку с Nginx (мне это тоже интересно).

...