将 websockets 集成到 Django Rest Framework 应用程序的简单方法?

Posted

技术标签:

【中文标题】将 websockets 集成到 Django Rest Framework 应用程序的简单方法?【英文标题】:Simple way to integrate websockets to Django Rest Framework application? 【发布时间】:2020-03-05 11:26:20 【问题描述】:

我的游戏应用使用 Vue 前端和带有 DRF 的 Django 后端。多个客户端连接到同一个游戏会话。有时,某些用户所做的事情也必须反映给其他用户。为此,服务器必须有办法请求客户端刷新数据。

Django 应用程序部署在 Elastic beanstalk 上。典型的游戏会话有 10 名玩家,每 15 秒向玩家发送一次更新请求,我相信在可预见的将来我们不会同时有超过 50 场比赛,因此性能要求较低。

我正在寻找一种将更新请求消息推送给客户端的简单解决方案。

我当前的解决方案使用在 ec2 上运行的 Redis 服务器。当 Django 视图发生变化时,Django 会向 Redis 发布更新请求:

r = redis.Redis(host=settings.REDIS_IP, port=6379, db=0)
r.publish(game_identifier, type)

“类型”包含应该更新哪种数据的信息。

此外,我还实现了一个简单的 Node 应用程序。所有客户端都使用 Websocket 连接到此应用程序。该应用程序还订阅了 Redis,只要有通知,它就会使用他们的游戏标识符作为频道发送给订阅者。在此之后,客户端使用 REST 刷新他们的状态。节点应用程序也在 Elastic Beanstalk 上运行。

一切正常,但拥有一个 Elastic Beanstalk 应用程序和一个 ec2 实例仅用于向客户端发送简单通知似乎有点过头了。我很想听听如何用更少的移动部件构建这个简单的通知。如果后端是使用 Node 构建的,我只需几行代码就可以做到这一点。

一些可能性/问题:

用 Elasticache 替换 Redis 实例? 用 Django Channels 替换 Node 应用程序? 有没有办法在没有 Redis / Elasticache 的情况下完全应对?禁用通道层? (我对频道还不太熟悉。) 还有别的吗?

【问题讨论】:

【参考方案1】:

为了模块化、可扩展性和可重用性,您最好让通知服务器独立运行。但是,如果您坚持使用单个服务器,则可以使用 Django 通道来代替节点服务器,并将 Redis 实例用作通道层,这样您就可以将其与 DRF 应用程序放在相同的代码库中。已经有几个库集成了 DRF 和 Channels。我用这个DjangoChannelsRestFramework

【讨论】:

嘿,肯,你能看看我的问题吗? https://***.com/questions/66731783/django-channels-rest-framework-how-to-get-a-serialized-queryset-to-the-front-en。谢谢

以上是关于将 websockets 集成到 Django Rest Framework 应用程序的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

Django使用Channels实现WebSocket--下篇

django 通道 websocket 在握手期间关闭

将 SimpleWebSocketServer 与 django 和 apache 集成

Django Channels 2.4 和 Websockets 在 Elastic Beanstalk 和 ElastiCache 上给出 502 错误

如何通过nextjs将ssl集成到websocket中?

Django Channels 没有检测到 NGINX 的 WebSocket 请求