2011-09-27 3 views
2

내 설정 : Tweepy를 사용하여 Twitter Streaming API에 액세스하는 기존 Python 스크립트가 있습니다. 또한 다양한 백엔드의 다른 출처에서 수집 한 실시간 정보를 보여주는 웹 사이트도 있습니다.다양한 백엔드에서 Socket.IO 클라이언트에게 메시지를 보내는 가장 좋은 방법은 무엇입니까

내 이상적인 시나리오 : 실시간 트윗뿐만 아니라 Socket.IO를 사용하여 연결된 다른 사용자에게 내 다른 정보의 실시간 업데이트를 게시하려고합니다.

연결된 모든 클라이언트에게 정보를 브로드 캐스팅하기 위해 (백엔드에서) HTTP POST와 같은 간단한 작업을 수행 할 수 있다면 정말 좋을 것입니다.

내 문제 : Socket.IO 클라이언트 구현은 아주 간단합니다 ... 나는 그것을 처리 할 수 ​​있습니다. 그러나 내가 요구하는 기능이 이미 존재 하는지를 파악할 수는 없으며, 그렇지 않다면 어떻게 될지 가장 좋은 방법은 무엇일까요?

[업데이트]

내 솔루션 : 내가 찾던 않습니다 Pega.IO라는 프로젝트를 만들었습니다. 기본적으로 Socket.IO (0.8+)를 평소와 같이 사용할 수 있지만 HTTP POST를 사용하여 연결된 사용자에게 메시지를 보낼 수 있습니다.

Redis 백엔드가있는 Express 웹 서버를 사용합니다. 이론적으로 이것은 확장이 매우 간단해야합니다 - 앞으로도이 프로젝트에 계속 기여할 것입니다.

curl http://cloud.github.com/downloads/Gootch/pega.io/install.sh | sh 

이 당신이 일단 포트 8888

에서 수신되는 Pega.IO 서버를 생성합니다 :

Pega.IO - github

당신은이 명령을 실행, 우분투에 설치하려면 달리기 :

HTTP POST http://your-server:8888/send

의 데이터는 다음과 같습니다.

channel=whatever&secretkey=mysecret&message=hello+everyone 

그게 전부입니다. 백엔드에서 Pega.IO 서버로의 HTTP POST.

답변

1

왜 두 부분이없는 위치에서 노드 응용 프로그램을 쓰기 : 클라이언트와 직접 통신

  1. Socket.IO 부분, 그리고 어떤 종류의
  2. 하는 HTTP API가 POST를 수신하는, 요청한 다음 Socket.IO로 적절한 메시지를 브로드 캐스팅합니다.

이렇게하면 응용 프로그램이 비 노드 응용 프로그램과 사용자 브라우저 사이의 "연결"이됩니다. 여기에서 핵심은 Socket.IO를 브라우저와의 실시간 통신을 위해 만들어진 것으로 응용 프로그램의 다른 부분에 대한 다른 Node 기술에 의존하는 것입니다.

[업데이트]

나는 순간에 개발 환경에없는, 그래서 내가 당신에게 작업 예제를 얻을 수 있지만, 일부 의사는이 같은 보일 것이다 :

http = require('http'); 
io = require('socket.io'); 

server = http.createServer(function(request, response) { 
    // Parse the HTTP request to get the data you want 
    io.sockets.emit("data", whatever); // broadcast the data to Socket.IO clients 
}); 
server.listen(8080); 
socket_server = io.listen(server); 

을 이를 통해 웹 요청을 청취하는 데 사용할 수있는 8080 포트의 웹 서버를 가질 수 있습니다 (Express와 같은 프레임 워크 또는 많은 다른 서버 중 하나를 사용하여 POST 요청의 본문을 파싱하고 필요한 데이터를 추출 할 수 있음)).

+0

이 제조법은 훌륭 할 것입니다 ... 좋은 방법 일 것 같네요. 실제 구현 예제에서 많은 것을 배울 많은 새로운 node.js 포크 (자신 포함)가있을 것이라고 확신합니다. 몇 가지 염두에 두어야 할 점 ... 확장이 필요하고 (redis?) Socket.IO 0.7+ (hybi-10 지원) – Garett

2

메시지 브로커를 사용하는 것이 가장 좋은 방법입니다. 개인적으로, 나는 이것을 위해 RabbitMQ를 사용했다. 이것은 다른 대답 (socket.io 0.7 및 scalable)에 대한 귀하의 의견에서 언급 한 요구 사항을 충족시키는 것으로 보인다. RabbitMQ를 사용한다면 npm을 통해 구할 수있는 amqp 모듈과 Python을위한 Pika 모듈을 권하고 싶습니다.

pika를 사용하는 Python 용 커넥터의 예입니다.

def amqp_transmit(message): 
     connection = pika.AsyncoreConnection(pika.ConnectionParameters(host=settings.AMQP_SETTINGS['host'], 
      port=settings.AMQP_SETTINGS['port'], 
      credentials=pika.PlainCredentials(settings.AMQP_SETTINGS['username'], 
        settings.AMQP_SETTINGS['pass']))) 
     channel = connection.channel() 
     channel.exchange_declare(exchange=exchange_name, type='fanout') 
     channel.queue_declare(queue=NODE_CHANNEL, auto_delete=True, durable=False, exclusive=False) 
     channel.basic_publish(exchange=exchange_name, 
       routing_key='', 
       body=message, 
       properties=pika.BasicProperties(
         content_type='application/json'), 
       ) 
     print ' [%s] Sent %r' %(exchange_name, message) 
     connection.close() 

노드의 끝에 아주 기본 연결 코드는 다음과 같습니다 :이 예는 하나의 JSON 직렬화 인수를 받아

편집
var connection = amqp.createConnection(
     {host: amqpHost, 
     port: amqpPort, 
     password: amqpPass}); 

    function setupAmqpListeners() { 
     connection.addListener('ready', amqpReady) 
     connection.addListener('close', function() { 
      console.log('Uh oh! AMQP connection failed!'); 
     }); 
     connection.addListener('error', function(e) {throw e}); 
    } 

    function amqpReady(){ 
     console.log('Amqp Connection Ready'); 
     var q, exc; 
     q = connection.queue(queueName, 
      {autoDelete: true, durable: false, exclusive: false}, 
      function(){ 
       console.log('Amqp Connection Established.'); 
       console.log('Attempting to get an exchange named: '+exchangeName); 
       exc = connection.exchange(exchangeName, 
        {type: 'fanout', autoDelete: false}, 
        function(exchange) { 
         console.log('Amqp Exchange Found. ['+exchange.name+']'); 
         q.bind(exc, '#'); 
         console.log('Amqp now totally ready.'); 
         q.subscribe(routeAmqp); 
        } 
       ); 
      } 
     ); 
    } 


    routeAmqp = function(msg) { 
      console.log(msg); 
      doStuff(msg); 
    } 

: 위의 예는 않는 팬 아웃 교환을 사용하여 메시지를 지속시키지 마십시오. 팬 아웃 (fan-out) 교환은 확장성에 문제가 있기 때문에 최선의 선택이 될 것입니다 (즉, 클라이언트가 연결된 노드를 실행하는 둘 이상의 상자를 실행하고있는 경우).

+0

을 사용해야합니다. Socket.IO에는 redis에 대한 내장 지원 기능이 있습니다. - 어떻게 그것을 사용할지 모르겠지만 ... 어쩌면 나는 문서에서 그것을 놓치고있다. 그러나 나는 Socket.IO를 수평으로 0.7-0 스케일하는 방법에 대한 명확한 예제를 보지 못했다. – Garett

+0

나는 내가 추측한다. 여기서 주제를 조금 벗어났습니다 ... 질문의 주요 부분은 자바 스크립트 클라이언트가 아니라 백엔드에서 HTTP POST 요청을 받아들이도록 Socket.IO를 설정하는 것입니다. – Garett

+0

문제 개별 노드 상자에 대한 HTTP POST 요청은 확장 가능하지 않습니다. 이것은 요청에 적절하게 응답하기 위해 nodejs를 실행하는 하나 이상의 상자가 필요할 때 작동하지 않습니다 ... 확장 성이 필요합니까, 아니면 nodejs를 실행하는 단일 시스템 이상으로 확장 할 수없는 솔루션을 원하십니까? ? 그 후자라면, nodejs 모듈 인 Express (기본 nodejs 설치에 포함되어 있음)와 python 모듈 urllib를 사용할 수 있습니다. 자신의 문서에서 혼란스러운 부분이 있으면 코드 예제를 제공해 드리겠습니다. – fourk

관련 문제