当我开始使用Python(在这种情况下为Django Channels)通过网络套接字工作时,我开始想知道公司如何扩展聊天应用程序。
解决这个具体问题: 用户A具有他们参与的“组消息”列表。用户A能够接收来自每个组的通知。假设用户A有5个不同的组,他想要实时通知。
用户A是否有5个单独的Web套接字连接?这是最简单的,但最庞大,肯定不会扩展(如果我们每个用户有20个聊天怎么办)。制作一个侦听并向一个特定人群发送通知的Django频道“群组”非常容易。
用户A是否有1个网络套接字连接从所有不同位置接收所有通知?如果是这样,用户A在后端订阅了什么?在Django Channels中,当用户订阅“Group”时会生成websocket。如果我们想要每个“组”一个用户,这似乎是反直觉的。在这种情况下,用户A订阅他们自己的个人“组”,其他后端服务正在根据其他逻辑向该特定“组”传递消息。在使用该服务的任何用户收到消息时实施。
这是非常冗长和文字繁重,但它描绘了一个有趣的问题,在过去已经扩展到其他公司。我感谢任何信息或见解!
(这是我认为基本相同的问题列表(忽略语言和库使用)) 1. Websocket multiple Channels vs. One Channel + Server Side handling [GroupChat]
答案 0 :(得分:1)
首先创建个人资料模型:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name=_("user"))
channel = models.CharField(unique=True, max_length=255, blank=True, null=True, verbose_name=_("channel")) # channel for notify user
然后创建一个消息模型:
class Message(models.Model):
to_user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name=_("user"))
from_user = models.ForeignKey(User)
text = models.TextField(blank=True, null=True)
然后使用Django信号发送通知:
@receiver(post_save, sender=Message)
def send_notify(instance, created, **kwargs):
if created:
Group('chat-{}'.format(instance.to_user.profile.channel)).send({'text': {'message': 'you have a new message'}})
抱歉我的英语:))