首页 文章

生产环境 聊天应用程序上的Websockets:

提问于
浏览
1

当我开始使用Python(在本例中为Django Channels)的Web套接字时,我开始想知道公司如何扩展聊天应用程序 .

解决这个特定问题:用户A有一个他们参与的“群组消息”列表 . 用户A能够接收来自每个群组的通知 . 让我们假设用户A有5个不同的组,他希望实时通知 .

  • 用户A是否有5个单独的Web套接字连接?这是最简单的,但最庞大,肯定不会扩展(如果我们每个用户有20个聊天怎么办) . 制作一个侦听并向一个特定人群发送通知的Django Channels “群组”非常容易 .

  • 用户A是否有1个Web套接字连接从所有位置接收所有通知?如果是这样,用户A在后端订阅了什么?在Django Channels中,当用户订阅“Group”时会生成websocket . 如果我们想要每个“组”一个用户,这似乎是反直觉的 . 在这种情况下,用户A订阅他们自己的个人“组”,其他后端服务正在根据其他逻辑向该特定“组”传递消息 . 从使用该服务的任何用户收到消息时实现 .

这是非常冗长和文字繁重,但它描绘了一个有趣的问题,在过去已经扩展到其他公司 . 我感谢任何信息或见解!

(这是我认为基本相同的问题列表(忽略语言和库使用))1 . Websocket multiple Channels vs. One Channel + Server Side handling [GroupChat]

1 回答

  • 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'}})
    

    对不起我的英语不好 : ))

相关问题