用于聊天应用程序的多个 websocket 实例
Posted
技术标签:
【中文标题】用于聊天应用程序的多个 websocket 实例【英文标题】:multiple websocket instances for chat application 【发布时间】:2021-10-04 16:42:51 【问题描述】:我正在构建一个 Django-Vue 聊天应用程序,我已经构建了该应用程序的核心功能。
当 SideBar 组件被挂载时,会发出一个 HTTP 请求来获取用户是参与者的所有房间,当单击某个房间时,会在 Chat 组件上创建一个 WebSocket 实例。
我的疑问是,如果我向那个房间发送消息,但其他用户没有连接到同一个房间(假设他们连接到其他房间),他们将不会收到消息,对吗?那么我如何向他发送有关新消息的通知?比如 Whatsapp 侧边栏通知。
我正在考虑创建两个 WebSocket 连接,一个在 SideBar 上,将作为用户端点 (ws:127.0.0.1:8000/chat/$Username
),另一个用于实际聊天室 (ws:127.0.0.1:8000/chat/$ChatId
),这是一个好方法吗?
我的 Django 模型 =>
from django.db import models
from account.models import CustomUser
class Message(models.Model):
sender = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='messages')
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'message from self.sender.username'
class Chat(models.Model):
name = models.CharField(max_length=24)
participants = models.ManyToManyField(CustomUser, blank=True)
messages = models.ManyToManyField(Message, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
【问题讨论】:
【参考方案1】:您可以使用 WSS 作为传输层,但可以实现自己的逻辑协议。
当然,您可以使用多个连接,但这是多余的。 让我们使用类似“事件”的东西。 例如,对于连接到聊天室的用户,您可以发送“连接”事件:
"event": "connection",
"user":
"id": 1,
"username": "Foo",
...
您可以通过简单的方法处理这样的事件:
if event == "connection":
...
elif event == "exit":
elif event == "message":
...
同样的方法,但在客户端使用 JS 代码。
因此,您只能为 Vue 应用程序和 Django 应用程序处理一个连接。
【讨论】:
在您提出的解决方案中,每个用户都将连接到哪个 websocket 端点?chat/$USERNAME
?我应该复制self.channel_layer.group_send
以发送到我的用户名和目标用户名吗?我真的迷失了方向。
当然,您可以创建一个连接池来存储与每个用户的连接状态。就我个人而言,我不使用 Django 在我的项目中创建 WS 服务器。有两个原因:Django(带有 DRF)作为 API、强大的 ORM 和管理员很酷;作为一个异步框架,我正在使用 Starlette.io,它具有内置的 WS 支持和异步设计starlette.io/websockets,您可以通过相同的基础架构轻松运行它(添加一些附加功能)因此,您可以提供 2 个服务:API在 Django 上使用 DB 和 ORM; WS 服务。其他优点 - 在您的堆栈中,您将拥有第二个用于真正异步事物的工具。
频道不能像小明星那样做?我应该改变吗?网站内的所有数据均使用 DRF 进行处理。
当然,您可以使用 Channels 框架,但如果您想使用微服务方法,制作独立的 WS 服务会很舒服。您需要通过 HTTP 使用 DRF API。因此,DRF 将用于这两种方法。 Starlette 比 Channels 层简单得多,它会为您的堆栈添加额外的框架以提供简单的服务。以上是关于用于聊天应用程序的多个 websocket 实例的主要内容,如果未能解决你的问题,请参考以下文章
来自同一页面的多个 websocket,使用 java 作为服务器端
WebSocket入门教程-- WebSocket实例:简单多人聊天室