2011-09-27 28 views
2

我的安裝程序: 我有一個使用Tweepy訪問Twitter Streaming API的現有python腳本。我還有一個網站,顯示來自各種後端其他來源的彙總實時信息。從各種後端向Socket.IO客戶端發送消息的最佳方式是什麼

我的理想情景: 我想發佈實時tweets以及使用Socket.IO爲我的連接用戶實時更新我的​​其他信息。

如果我可以像HTTP POST(從任何後端)那樣簡單地將信息廣播到所有連接的客戶端,那將是非常好的。

我的問題: Socket.IO客戶端實現是超級直觀的...我可以處理它。但我無法弄清楚我所要求的功能是否已經存在...如果不存在,那麼實現它的最好方法是什麼?

[更新]

我的解決方案:我創建了一個名爲Pega.IO項目,做什麼,我一直在尋找。基本上,它可以讓你像往常一樣使用Socket.IO(0.8+),但是你可以使用HTTP POST向連接的用戶發送消息。

它將Express Web服務器與Redis後端一起使用。從理論上講,這應該是非常簡單的 - 我將繼續爲這個項目做出貢獻。

Pega.IO - github

要安裝在Ubuntu上,您只需運行此命令:

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

這將創建一旦你達到在端口8888

監聽Pega.IO服務器並運行,只是:

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上安裝一個Web服務器,您可以使用它來監聽Web請求(您可以使用Express之類的框架或許多其他框架來解析POST請求的主體並提取所需的數據)。

+0

這方面的祕訣很棒......聽起來這是一個很好的方法。我確定有很多新的node.js民間人士(包括我自己)會從實際的實施例中學到很多東西。需要記住一些事情......它需要擴展(redis),它需要使用Socket.IO 0.7+(用於hybi-10支持) – Garett

2

我發現這種事情的最佳方式是使用消息代理。就我個人而言,我已經使用過RabbitMQ,這似乎滿足您對其他答案(socket.io 0.7和可伸縮)的評論中提到的要求。如果您使用RabbitMQ,我推薦使用npm提供的節點amqp模塊,以及Python提供的Pika模塊。

使用pika的Python示例連接器。這個例子接受一個JSON序列化的說法:

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() 

上的節點結束非常基本的連接代碼可能是這樣的:

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); 
    } 

編輯:上面的示例使用,做了扇出交換不堅持消息。扇出交換很可能是您的最佳選擇,因爲可伸縮性是一個問題(即:您運行多個運行Node的客戶端可以連接到的盒子)。

+0

看起來像Socket.IO內置了對redis的支持 - 雖然我不知道如何使用它...也許我在文檔中錯過了它,但我沒有看到任何明確的示例如何水平縮放Socket.IO 0.7+ – Garett

+0

我想我在這裏有一些話題...我想要回答的問題的主要部分是設置Socket.IO以接受來自任何後端的HTTP POST請求來廣播消息,而不是通過javascript客戶端 – Garett

+0

問題是單個節點框的http POST請求不可伸縮。當您需要多個運行nodejs的盒子來正確響應請求時,這不起作用。您是否想要可伸縮性,還是希望解決方案能夠保證永遠不會超出運行nodejs的單個機器?如果是後者,則可以使用nodejs模塊Express(包含在默認的nodejs安裝中)和python模塊urllib。如果在文檔中有任何混淆,我會很樂意提供代碼示例。 – fourk

相關問題