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

时间:2017-12-09 04:25:56

标签: python django websocket django-channels

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

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

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

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

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

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

1 个答案:

答案 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'}})
抱歉我的英语:))