Несколько экземпляров 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.

Вернуться на верх