django Web-Sockets 设计和内存数据存储

Posted

技术标签:

【中文标题】django Web-Sockets 设计和内存数据存储【英文标题】:django Web-Sockets design and in-memory data storage 【发布时间】:2019-01-04 15:52:14 【问题描述】:

目标:(几乎)实时向最终用户提供数量的“通知”。

为简单起见,当用户 X 提交表单 XYZ 时应该会收到通知,并且所有其他用户应该看到通知的数量增加了 1(如果用户看到数字 50,则意味着有 50 个新的 XYZ 表单)。

问题 #1: 鉴于我的 django 频道 web-socket,我应该在哪里迭代以获得结果?目前我将它放在 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】:

正如您已经建议的那样,您应该有一个Notification 表。每次提交表单时都应该创建通知,然后您可以使用通知 post_save 信号将通知发送到 websocket。

通过这种方式,您不必长时间轮询数据库,因为这违背了 websockets 的目的。

至于在哪里保存通知,在这种情况下数据库已经足够了,除非你的负载非常高。

【讨论】:

以上是关于django Web-Sockets 设计和内存数据存储的主要内容,如果未能解决你的问题,请参考以下文章

Django动态模型设计

Python-Django-BBS

django分页设计并封装

高并发服务器的设计--内存池的设计

django——简介

django-1-应用开发基本套路