Django 频道“组订阅中 N 个频道中的 ERROR Y 超出容量”

Posted

技术标签:

【中文标题】Django 频道“组订阅中 N 个频道中的 ERROR Y 超出容量”【英文标题】:Django channels "ERROR Y of N channels over capacity in group subscriptions" 【发布时间】:2020-06-23 05:06:06 【问题描述】:

我正在使用我的 Django 应用程序进行负载测试,该应用程序使用 Django 通道和 redis 通道层(djangographene-djangochannelsgraphene-subscriptionschannels-redis)提供 GraphQL 订阅。作为 ASGI 服务器,我现在使用daphne。我使用nginx 作为代理。后端通过 GraphQL 订阅发布消息的周期取决于后端通过 MQTT 接收的消息的周期。我正在增加外部数据提供者向 MQTT 代理发布消息的周期,这意味着后端必须处理这些消息并通过 GraphQL 订阅发布消息的周期。我面临以下错误:

2020-03-11 08:33:58,464 ERROR    2 of 12 channels over capacity in group subscriptions

这个问题似乎是由channels_redis 引起的。我可以扩展基础架构以解决此问题吗?

【问题讨论】:

从那个问题看来,您可以调整配置中的默认数字。您是否尝试过这样做? 可能我必须在CHANNELS_LAYERS配置中调整和优化capacityexpire。尽管有该配置选项,但后端可能无法足够快地获取和处理排队的消息。意味着我必须提高后端的性能。 【参考方案1】:

默认容量为100条消息,默认消息过期时间为 60 秒。因此,如果在这些容量/时间内从未读取过频道 约束,它将被填满。

频道可能会被填满的一个原因是连接永远不会正确 关闭。在这种情况下,通道将保留在组中并最终填满。

缓解这种情况的一种方法是拥有足够的容量和较短的超时时间。你 可以通过以下方式更改 Django 设置中的配置:

CHANNEL_LAYERS = 
    "default": 
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": 
            "hosts": REDIS_URL,  # or where your redis server lives
            "capacity": 1500,  # default 100
            "expiry": 10,  # default 60
        
     

【讨论】:

您的回答引导我找到了真正的根本原因。我有一个事件驱动系统,在“清除”缓存中的数据之前,必须将数据保存到数据库中。我使用的是开发 SQLite 数据库而不是生产数据库。迁移到性能更好的生产数据库解决了这个问题。

以上是关于Django 频道“组订阅中 N 个频道中的 ERROR Y 超出容量”的主要内容,如果未能解决你的问题,请参考以下文章

使用 django 频道时如何使用频道而不是组?

Django 频道“组订阅中 N 个频道中的 ERROR Y 超出容量”

使用 django 频道的 heroku 的正确 procfile / 要求是啥?

django 频道集成问题,websocket.receive 不听

未处理 Django 频道 websocket.receive

在 nginx 上部署 django 频道