2013-03-27 90 views
3

我目前有一個使用Django的網站設置。我添加了Gevent Socketio來添加聊天功能。我需要擴展它,因爲網站上已有相當多的用戶,並且無法找到這樣做的方法。Scale Gevent Socketio

我試圖https://github.com/abourget/gevent-socketio/tree/master/examples/django_chat/chat

我使用Gunicorn &的socketio.sgunicorn.GeventSocketIOWorker工人類,所以起初我以爲增加了工人數的。不幸的是,這似乎間歇性地失敗了。我已經開始重寫它,以便從我發現的幾個源中使用redis,並且在每個正在進行負載平衡的服務器上都有一名工作人員。但是,這似乎有同樣的問題。我想知道在gevent socketio代碼本身中是否存在一些不允許縮放的問題。

這裏是我如何開始這只是提交消息的代碼。

def redis_client(): 
    """Get a redis client.""" 
    return Redis(settings.REDIS_HOST, settings.REDIS_PORT, settings.REDIS_DB) 

class PubSub(object): 
    """ 
    Very simple Pub/Sub pattern wrapper 
    using simplified Redis Pub/Sub functionality. 

    Usage (publisher):: 

     import redis 

     r = redis.Redis() 

     q = PubSub(r, "channel") 
     q.publish("test data") 


    Usage (listener):: 

     import redis 

     r = redis.Redis() 
     q = PubSub(r, "channel") 

     def handler(data): 
      print "Data received: %r" % data 

     q.subscribe(handler) 

    """ 
    def __init__(self, redis, channel="default"): 
     self.redis = redis 
     self.channel = channel 

    def publish(self, data): 
     self.redis.publish(self.channel, simplejson.dumps(data)) 

    def subscribe(self, handler): 
     redis = self.redis.pubsub() 
     redis.subscribe(self.channel) 

     for data_raw in redis.listen(): 
      if data_raw['type'] != "message": 
       continue 

      data = simplejson.loads(data_raw["data"]) 
      handler(data) 


from socketio.namespace import BaseNamespace 
from socketio.sdjango import namespace 
from supremo.utils import redis_client, PubSub 
from gevent import Greenlet 

@namespace('/chat') 
class ChatNamespace(BaseNamespace): 
    nicknames = [] 
    r = redis_client() 
    q = PubSub(r, "channel") 

    def initialize(self): 
     # Setup redis listener 
     def handler(data): 
      self.emit('receive_message',data) 

     greenlet = Greenlet.spawn(self.q.subscribe, handler) 

    def on_submit_message(self,msg): 
     self.q.publish(msg) 

回答