Django Дизайн веб-сокетов и хранение данных в памяти - PullRequest
0 голосов
/ 04 января 2019

Цель: предоставить конечному пользователю количество «уведомлений» в (почти) реальном времени.

enter image description here

Для простоты уведомления должны приходить, когда пользователь X отправляет форму XYZ, а все остальные пользователи должны видеть, что количество уведомлений увеличивается на 1 (если пользователь Y видит число 50, это означает, что имеется 50 НОВЫХ форм XYZ).

Вопрос № 1: с учетом моего веб-сокета на каналах django, где я должен выполнить итерацию, чтобы получить результат? На данный момент я поместил его в websocket_connect с бесконечным циклом, таким образом:

class EchoDiscussionNotificationConsumer(AsyncConsumer):

async def websocket_connect(self, event):

    await self.send({
        "type": "websocket.accept",
    })

    # NOT SURE THIS IS A GOOD DESIGN! 
    while True:
        await asyncio.sleep(2)
        rand = random.randint(1,100)
        mesg = "#"+str(rand)

        await self.send({
            'type': 'websocket.send',
            'text':  mesg,
        })

Это прекрасно работает, но я не думаю, что это хороший дизайн.

Вопрос № 2: Я не хочу запрашивать БД каждые 2 секунды. Я имел в виду, что должен запрашивать только когда (1) пользователь входит в систему и (2) другой пользователь отправляет форму XYZ. Поэтому, как только у меня есть «таблица уведомлений» из БД, где я должен хранить ее (в памяти), чтобы иметь более быстрый доступ? (сеанс?)

1 Ответ

0 голосов
/ 06 января 2019

Как вы уже предложили, у вас должна быть таблица Notification. Уведомления должны создаваться каждый раз при отправке формы, тогда вы можете использовать сигнал post_save для отправки уведомлений в веб-сокет.

Таким образом, вам не придется долго опрашивать БД, поскольку это наносит ущерб цели веб-сокетов.

Что касается того, где сохранять уведомления, БД в этом случае вполне достаточно, если у вас очень высокая загрузка.

...