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

问题描述 投票:1回答:1

我的游戏应用程序使用带有DRF的Vue前端和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通道替换节点应用程序?
  • 没有Redis / Elasticache可以完全应对吗?禁用渠道层? (我对渠道还不太熟悉。)
  • 还有什么?
django amazon-web-services websocket django-rest-framework django-channels
1个回答
0
投票

您最好保留通知服务器的模块化,可伸缩性和可重用性。但是,如果您坚持使用单个服务器,则可以使用Django通道代替Node服务器和Redis实例作为Channel层,因此可以将其与DRF应用程序放在相同的代码库中。已经有几个库集成了DRF和Channels。我用这个DjangoChannelsRestFramework

© www.soinside.com 2019 - 2024. All rights reserved.