Precisa de ajuda para configurar o código do cometa
-
24-09-2019 - |
Pergunta
Alguém conhece uma maneira ou talvez pense que é possível conectar o Node.js ao módulo push http Nginx para manter uma conexão persistente entre o cliente e o navegador.
Eu sou novo no cometa, então não entendo a publicação, etc., talvez alguém possa me ajudar com isso.
O que eu configurei até agora é o seguinte.Baixei o plugin jQuery.comet e configurei o seguinte código básico:
JavaScript do cliente
<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>
O que posso entender disso é que o cliente continuará ouvindo a url seguida de /broadcast/sub=getIt.Quando houver uma mensagem, ele disparará updateFeed.
IMO bastante básico e compreensível.
Configuração do módulo push http Nginx
aplicação default_type/octeto-stream;enviar arquivo ativado;keepalive_timeout 65;push_authorized_channels_only desativado;
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;
}
}
}
Ok, agora isso diz ao nginx para escutar na porta 80 qualquer chamada para/broadcast/sub e retornará todas as respostas enviadas para/broadcast/pub.
Bem básico também.Esta parte não é tão difícil de entender e está bem documentada na internet.Na maioria das vezes há um arquivo Ruby ou php por trás disso que faz a transmissão.
Minha ideia é transmitir node.js
/broadcast/pub
.Eu acho que isso vai me deixar terpersistent streaming data
do servidor para o cliente sem interromper a conexão.Tentei a abordagem de pesquisa longa com loop da solicitação, mas acho que será mais eficiente.
Ou isso não vai funcionar.
Arquivo Node.js
Agora, para criar o Node.js, estou perdido.Em primeiro lugar, não sei como fazer com que o node.js funcione dessa maneira.
A configuração que usei para pesquisas longas é a seguinte:
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);
Isso escuta a porta 8000 e apenas grava na variável de resposta.
Por muito tempo pesquisando meu nginx.config
parecia algo assim:
server {
listen 80;
server_name _;
location / {
proxy_pass http://mydomain.com:8080$request_uri;
include /etc/nginx/proxy.conf;
}
}
Isso apenas redirecionou a porta 80 para 8000 e funcionou bem.
Alguém tem uma ideia de como fazer o Node.js agir de uma maneira que o Comet o entenda.Seria muito legal e você vai me ajudar muito.
Recursos
usado
- Um exemplo onde isso é feito com Ruby em vez de Node.js
- jQuery.comet
- Página inicial do módulo push HTTP Nginx
- Faye:um cliente e servidor Comet para Node.js e Rack
Para usar o faye tenho que instalar o cliente comet, mas quero usar o fornecido com o Nginx.É por isso que não uso apenas faye.Aquele que o nginx usa é muito mais otimizado.
extra
Solução
Olhando para seu link parece-me que todo o trabalho de pub/sub é feito pelo Nginx, o código Ruby é usado apenas para testá-lo e enviar mensagens.Os clientes ainda usam pesquisas longas:
No script acima, a cada cinco segundos um editor emite um novo evento para nosso servidor Nginx, que por sua vez envia os dados para dois assinantes que têm conexões de pesquisa longa abertas e estão aguardando dados.Assim que a mensagem é enviada para cada assinante, o Nginx fecha suas conexões e os clientes imediatamente restabelecê-los para aguardar a próxima mensagem disponível.
O Nginx serve como um retradutor simples para mensagens (configuração muito inteligente, aliás, obrigado pelo link).
Para resumir:os navegadores não são capazes desse tipo de conexão que você está tentando fazer.Isso é o que WebSockets foram inventados para.
Mais tarde farei alguns códigos em Node.js para usar esta configuração com Nginx (também estou interessado nisso).