【问题标题】:Websockets on production chat apps:生产聊天应用程序上的 Websockets:
【发布时间】:2017-12-09 04:25:56
【问题描述】:

当我开始使用 Python(在本例中为 Django Channels)通过网络套接字工作时,我开始想知道公司如何扩展聊天应用程序。

拿这个具体的问题: 用户 A 有一个他们参与的“组消息”列表。用户 A 能够接收来自每个组的通知。让我们假设用户 A 有 5 个不同的组,他想要实时通知。

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

  2. 用户 A 是否有 1 个 Web 套接字连接来接收来自许多不同位置的所有通知?如果是这样,用户 A 在后端订阅了什么?在 Django Channels 中,当用户订阅“组”时会创建一个 websocket。如果我们希望每个“组”有一个用户,这似乎违反直觉。在这种情况下,用户 A 订阅了他们自己的个人“组”,而其他后端服务正在根据其他逻辑将消息传递到该特定“组”当收到来自任何使用该服务的用户的消息时实施。

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

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

【问题讨论】:

    标签: python django websocket django-channels


    【解决方案1】:

    首先创建一个profile模型:

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

    对不起我的英语:))

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 2014-07-08
      • 2015-07-30
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2020-07-04
      • 2021-03-26
      • 2011-01-31
      相关资源
      最近更新 更多