Несколько экземпляров websocket для приложения чата
Я создаю Django-Vue чат приложение, я уже создал основную функциональность приложения.
При установке компонента SideBar выполняется HTTP-запрос для получения всех комнат, участником которых является пользователь, при нажатии на какую-либо комнату создается экземпляр WebSocket на компоненте Chat.
Мое сомнение в том, что если я отправлю сообщение в эту комнату, но другие пользователи не подключены в той же комнате (предположим, что они подключены в другой комнате), они не получат сообщение, правильно? Так как же мне послать ему уведомление о новом сообщении? Как в 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
Вы можете использовать WSS в качестве транспортного уровня, но реализовать собственный логический протокол.
Конечно, можно использовать несколько соединений, но это избыточно. Давайте использовать что-то вроде "событий". Например, для пользователя, подключенного к чату, можно послать событие "соединение":
{
"event": "connection",
"user": {
"id": 1,
"username": "Foo",
...
}
}
Вы можете обработать такое событие с помощью простого подхода:
if event == "connection":
...
elif event == "exit":
elif event == "message":
...
И тот же подход, но на стороне клиента с JS-кодом.
Таким образом, вы можете использовать только одно соединение как для приложения Vue, так и для приложения Django.