django - 缩放 Gevent Socketio

标签 django redis gevent gevent-socketio

我目前有一个使用 Django 的站点设置。我添加了Gevent Socketio来添加聊天功能。我需要扩展它,因为网站上已经有相当多的用户,但找不到这样做的方法。

我试过了 https://github.com/abourget/gevent-socketio/tree/master/examples/django_chat/chat

我正在使用 Gunicorn 和 socketio.sgunicorn.GeventSocketIOWorker worker 类,所以起初我想到增加 worker 数。不幸的是,这似乎间歇性地失败了。我已经开始重写它以使用我发现的几个来源的 redis,并且每台服务器上都有 1 个工作人员,现在正在进行负载平衡。然而,这似乎有同样的问题。我想知道 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)

最佳答案

我使用了来自 https://github.com/fcurella/django-push-demo 的部分代码和 gevent-socketio 0.3.5rc1 而不是 rc2,它现在可以与多个 worker 和负载平衡一起工作。

关于django - 缩放 Gevent Socketio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15657985/

相关文章:

django - GEvent/GUnicorn 和 C10k 问题

python - 关闭基于 socketserver 的 Python 3 服务器挂起

google-app-engine - gevent workers可以在python 3 app engine标准环境下使用吗?

python - Django:如何 'scrub' 用户列表

python - Django lighttpd FCGI 错误

gcc - 错误 jemalloc/jemalloc.h : No such file or directory when making Redis

node.js - Redis 连接到 EB 实例内部,但不会连接已部署的 sailsjs 应用程序

javascript - 如何仅使用 css 删除 django 表单中的默认值 '0'

django - 如何使用 PostgreSQL 函数定义 Django 模型字段作为默认值

Redis 从匹配键和通配符 hashKey 的哈希中获取记录?