V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oooolongtea
V2EX  ›  Telegram

好奇 telegram 是如何实现保存聊天记录的,存在服务器上?

  •  
  •   oooolongtea · 2020-11-09 03:52:03 +08:00 · 9033 次点击
    这是一个创建于 1499 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在研究聊天系统软件的系统设计架构,因此遇到了这个迷思。
    因为 telegram 的 faq 页面提到了他们是云服务,那么这是不是意味 telegram 的聊天记录是存在云服务器上(前提是这个云服务器的存储空间够大)。
    还是说,每次这个云服务器其实一直向数据库同步抓取聊天记录?
    求各位指导。
    21 条回复    2020-11-18 12:40:49 +08:00
    oooolongtea
        1
    oooolongtea  
    OP
       2020-11-09 03:54:02 +08:00
    @Livid
    L 大你好,能麻烦你帮我把这个问题转发到这个版块吗? https://v2ex.com/?tab=qna
    webshe11
        2
    webshe11  
       2020-11-09 04:41:14 +08:00 via Android
    是的啊 普通聊天并不是端对端加密的,聊天记录都在云上
    Jerami
        3
    Jerami  
       2020-11-09 05:10:17 +08:00 via Android
    文字根本占不了多少信息,图片的话可以参考百度网盘模式。
    oooolongtea
        4
    oooolongtea  
    OP
       2020-11-09 05:39:36 +08:00
    @Jerami 你的意思是,针对不同的用户,比如 id=99 的用户,每次他连到 telegram 上,有一个专门的云服务器,这个服务器专门是分配给这个用户的,然后这个用户的消息、图片都存在这个云服务器上,是这样的吗?
    ochatokori
        5
    ochatokori  
       2020-11-09 07:31:14 +08:00 via Android
    @oooolongtea #4 怎么可能。
    文字消息占不了多少地方直接建索引存库,百度网盘模式大概是指记录图片散列值不同用户共享一个文件
    delectate
        6
    delectate  
       2020-11-09 08:33:29 +08:00
    @oooolongtea "这个服务器专门是分配给这个用户的",这成本得多高啊。

    实际上很简单,表这样设计就行:
    table: group
    messageID|userID|sendTime|recvTime|Read|payloadType|payloadContent|delete
    如果 userid 在消息内,且 recvTime (收到消息的时间)是空,已读为 False,一股脑推给该 userID 的客户端就行了。
    BrettD
        7
    BrettD  
       2020-11-09 09:09:39 +08:00 via iPhone
    @oooolongtea 不是专门的服务器,大家的聊天信息都存在一起
    EasonC
        8
    EasonC  
       2020-11-09 11:32:05 +08:00 via iPhone
    你应该是想知道为什么我的聊天记录自己删了,后台是能看到,然后才想问 telegram 的聊天记录是怎么保存的,我知道你是那个群里的谁了哈哈哈哈
    oooolongtea
        9
    oooolongtea  
    OP
       2020-11-10 05:11:06 +08:00
    @EasonC 我没明白你在说什么。 我只是想知道 telegram 的架构,因为我最近在看系统设计方面的书。
    oooolongtea
        10
    oooolongtea  
    OP
       2020-11-10 05:13:30 +08:00
    @delectate
    谢谢谢谢。你的意思是数据库是线性数据库( mssql ),然后每次我连接到一个 gateway 的时候,这个 gateway 直接和数据库连接读取我这个账户的聊天记录?

    示意图如下:
    客户端 -- 网关( gateway) -- 数据库。

    在网关在数据库之间难道没有服务器什么的吗?
    oooolongtea
        11
    oooolongtea  
    OP
       2020-11-10 05:17:09 +08:00
    @BrettD 都存在一个服务器上,然后每次你连的时候,服务器会专门腾出一个空间来存放、显示你的了解记录,是这样吗?
    BrettD
        12
    BrettD  
       2020-11-10 10:18:43 +08:00 via iPhone
    @oooolongtea 不用专门腾出一个空间呀,所有信息都存在一起
    BrettD
        13
    BrettD  
       2020-11-10 10:19:12 +08:00 via iPhone
    @oooolongtea 显示聊天记录是客户端的事情
    oooolongtea
        14
    oooolongtea  
    OP
       2020-11-11 03:28:38 +08:00
    @BrettD 谢谢。那么是不是所有聊天记录都存在一个云服务器上,然后我登录的时候,云服务器会根据我的 user id,只显示我这个账户对应的聊天记录?
    BrettD
        15
    BrettD  
       2020-11-11 09:48:19 +08:00 via iPhone
    @oooolongtea 没看懂你在说啥,显示聊天记录是客户端的事情,服务器又不显示聊天记录
    oooolongtea
        16
    oooolongtea  
    OP
       2020-11-11 15:02:19 +08:00
    @BrettD 比如我从网页端登录 telegram 的时候,以往的聊天记录都可以看到,这难道不是云服务器从数据库里提取出来的吗?
    BrettD
        17
    BrettD  
       2020-11-11 15:22:07 +08:00 via iPhone
    @oooolongtea 服务器只管数据,显示聊天记录是客户端显示,不是服务器显示
    oooolongtea
        18
    oooolongtea  
    OP
       2020-11-12 07:47:58 +08:00
    @BrettD 谢谢回复。你的意思是,客户端(例如 iphone 上的 telegram app)把数据从数据库里下载下来,然后显示在 iphone 上。这个我理解。
    但是 telegram web 版,我每次登陆上去,无论我在哪里的机器去登陆,我都可以看到同样的聊天记录,这是不是因为我登录后,和我机器相连的那个服务器,根据我的 user id,把我对应的聊天记录从数据库下载到了服务器上并且显示给我?
    BrettD
        19
    BrettD  
       2020-11-12 08:41:36 +08:00 via iPhone
    @oooolongtea 服务器是存储和传输数据的,不是显示聊天记录的,聊天记录是你电脑上的浏览器显示的
    oooolongtea
        20
    oooolongtea  
    OP
       2020-11-12 12:30:49 +08:00
    @BrettD 多谢你的耐心……我去看一看这背后运作的机制是什么。
    lichengqi0805
        21
    lichengqi0805  
       2020-11-18 12:40:49 +08:00 via Android
    信息的话有 message id
    文件的话每个 Media 或者 document 也有对应的 id
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5407 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 01:39 · PVG 09:39 · LAX 17:39 · JFK 20:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.