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 设计和内存数据存储的主要内容,如果未能解决你的问题,请参考以下文章