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

Telegram 是如何做到十几个万人群还是如此流畅的?

  •  1
     
  •   airbotgo · 276 天前 · 14953 次点击
    这是一个创建于 276 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1 、Android 、iOS 都非常流畅,除了 Web 网页版有时候略卡
    十几个万人群,要做到这种流畅程度,有哪些值得学习的?

    2 、本地缓存极少
    设置本地缓存仅保存 1 周,所有内容存储云端。目前本地缓存总共占 300M 。

    3 、多端同步
    Android 、iOS 、Web 三端都在使用,同步做得非常好。它还包括 Windows 、Linux 、macOS 等客户端,如此多的平台支持,同步功能能做到如此程度,简直奇迹。

    我的日常使用:
    1 )聊天沟通;
    2 )听歌(自己上传的音频);看 MV ( B 站收集的音乐视频);
    3 )文件备份(中文搜索很烂,目前加标签、主动加分隔符号将就用);
    4 )树洞(建个私有频道,写些乱七八糟的东西);
    5 )结合 Tasker + 脚本,进行指定图片、短信的备份;

    有没有大佬就 1 、2 个点分析下自己的见解,Telegram 有哪些值得学习的地方?
    第 1 条附言  ·  276 天前
    我说的万人群是聊天群,不是订阅频道。群是每个人都可以发言,不是仅少数几个人。
    一堆用都没用过的大聪明。
    96 条回复    2023-10-01 21:47:08 +08:00
    ZGame
        1
    ZGame  
       276 天前
    当从客户端来说 流畅没啥值得特别的地方吧... 只要不在里搞骚操作就行。同步不懂 ,感觉这个才是重点..
    meisen
        2
    meisen  
       276 天前   ❤️ 9
    靠内存,举例 Mac 上 TG 随随便便内存就占 2 GB ,而微信才 100+MB
    CocoCoding
        3
    CocoCoding  
       276 天前   ❤️ 1
    国内也能做到,技术上能做到,政策不同意估计,最多几千人
    memedahui
        4
    memedahui  
       276 天前   ❤️ 1
    我觉得是流畅是应为体积小,功能够用,重点是没有埋点,没刷盘,没内容审核
    yyzh
        5
    yyzh  
       276 天前
    @meisen 看平台?见 windows 下的内存占用挺正常的
    wu67
        6
    wu67  
       276 天前   ❤️ 1
    @yyzh
    @meisen
    内存跟加的频道和群内容有关的. 内容越多, 占用越大. 打开活动监视器看了一下我的现在就占了 90m 不到...
    unafraid7580
        7
    unafraid7580  
       276 天前 via Android   ❤️ 1
    的确 我已经把微信也迁移到电报了 流畅省心
    banliyaya
        8
    banliyaya  
       276 天前
    @CocoCoding 可是我即使没有超过 500 人的群 怎么还那么卡。mac 的每次打开微信还算正常一点,但是 windows 开机启动微信之后都得无响应几秒钟让它来同步消息,跟 tg 来对比 简直是天壤之别
    winterbells
        9
    winterbells  
       276 天前 via Android
    @banliyaya tg 打开每个频道只同步几条消息,点进去才开始加载内容
    cssk
        10
    cssk  
       276 天前 via iPhone   ❤️ 1
    @banliyaya 现在手机 qq 同步消息超级快,甩微信 500 条大街
    opengps
        11
    opengps  
       276 天前
    十几万人并不是同时在发消息,实际并发没那么高吧
    lucifer9
        12
    lucifer9  
       276 天前
    Mac 上如果是 app store 渠道的 tg ,内存占用一般一直正常
    如果是从 tg 官网直接下载的,内存使用会随着运行时间持续增加
    ispinfx
        13
    ispinfx  
       276 天前
    为啥我在 mac 上才占 300 多 M ?
    liy333
        14
    liy333  
       276 天前 via iPhone
    tg 几个大佬是全球顶尖的。国内开发同样的功能,估计要用五倍的开发团队,十倍的服务器资源,才能勉强达到同样的效果。
    TrembleBeforeMe
        15
    TrembleBeforeMe  
       276 天前
    十几万人的群只是通知群吧,仅有少数人可以发消息
    tagtag
        16
    tagtag  
       276 天前
    我想知道这么多聊天记录是怎么存储的
    NeedforV2
        17
    NeedforV2  
       276 天前
    @unafraid7580 ??这样也能迁移?请问怎么操作?
    IDAEngine
        18
    IDAEngine  
       276 天前
    @meisen electron 做的旧版客户端很正常
    xubingok
        19
    xubingok  
       276 天前   ❤️ 1
    1.正常.
    没错,原生应用就是这么屌(android 开发者路过).
    2.也没啥技术难点啊.
    TG 不像微信,没有多乱七八糟的消息类型,群聊消息占不了多少本地存储.其他的就更不值一提了.
    nothingistrue
        20
    nothingistrue  
       276 天前
    十几个万人群 ≠ 十几万人同时在线的群 ≠ 十几万人同时在线还发言的群。当然就算是十几万人同时在线的群,压力也是在服务器那边,对于客户端来说,不管几个人的群,都是只跟服务器维持一个数据连接频道,最多也只是同时发言的人多的时候,接受数据更频繁而已。
    gosrider
        21
    gosrider  
       276 天前
    @yyzh #5 去加载下不同群组的聊天记录试试,我刚打开内存占用 100m ,随便加载了下群组的消息,现在到了 1G 多
    codeisjobs
        22
    codeisjobs  
       276 天前   ❤️ 2
    各平台都是用各原生代码写的。技术先进,代码规范,极致的优化,没有乱七八糟的功能占用性能,吊打一众跨平台方案。
    jZEdn7k4
        23
    jZEdn7k4  
       276 天前
    本地缓存这么小?我日常用没加过超过 20 人的群,总共就几个群,缓存好几个 G ,你那个十几万人的群只是通知 channel 吧,不是所有人都能发消息的
    dynastysea
        24
    dynastysea  
       276 天前
    @CocoCoding 技术上本身问题就不大,消息收发这个可以理解为本身每个人就是一个分布式的客户端,几百人和几千人对客户端来说其实没啥区别。只不过是后端负载大点罢了。但是后端的问题其实也不难解决。难的确实是政策,限制太严格了,以前钉钉还可以搞万人群。现在直接一刀切,限制 500 人。
    dynastysea
        25
    dynastysea  
       276 天前   ❤️ 7
    tg 本身我觉得没啥值得学习的,wx 做的比它更好。wx 在 IM 的技术层面真的做的足够简洁和高效(它的消息收发原理简单到很多不懂技术的讲讲都能听得懂,但市面上很多的 IM 都把这套方案做的很复杂)。很多人其实想不到微信和 qq 邮箱的核心原理是一样的。。。
    多说一点,单纯从技术层面看,不要看不起国内互联网的技术,单纯互联网 app 这块来说,国内程序员的水平真的很强。。。因为经历过很多用户的洗礼以及各种奇葩变态需求的考验,而且互联网应用本身其实没太高技术含量,在这种技术门槛不高的地方,国内的程序员能卷出花来。当然不是说我们真的很强,在基础领域、创新方面我们很差。只不过中国人拥有人口优势,在不需要做技术突破的场景下,我们是可以卷上天的。
    shanghai1998
        26
    shanghai1998  
       276 天前   ❤️ 2
    用的共享 socket ,简单理解 主服务器 长链接 10 个客户端,10 个客户端再链接 10 个;很部分压力转接到客服端了
    securityCoding
        27
    securityCoding  
       276 天前 via Android
    聊天消息的包很小,seq+batch+预加载
    me1onsoda
        28
    me1onsoda  
       276 天前
    钞能力吧,内存够大都好说
    hakr
        29
    hakr  
       276 天前
    确实厉害, 比起 wx 来强太多了
    wulili
        30
    wulili  
       276 天前
    十几个万人有啥用,又不是每个人都能发消息,这种群上百万人都没问题
    wx 要比它复杂的多
    dougy592
        31
    dougy592  
       276 天前 via Android
    @wulili #30 是每人都能随便发
    pkoukk
        32
    pkoukk  
       276 天前
    @dynastysea #25 所以锅在张小龙?产品垃圾?
    hubaq
        33
    hubaq  
       276 天前
    @pkoukk 锅在流量变现
    yolee599
        34
    yolee599  
       276 天前   ❤️ 1
    确实,一线城市的色色群都是十万人以上的,每个人都能发消息,每次打开未读消息都有几万条,但还是很流畅
    icebow
        35
    icebow  
       276 天前 via iPhone   ❤️ 9
    不明白为什么总是有人说:又不是十万人都发消息,难道微信 500 人群每个人都在发消息?微信该卡还是卡
    freepoint
        36
    freepoint  
       276 天前
    那么问题来了:Tg 上你们都关注什么频道和群组?
    heyleo
        37
    heyleo  
       276 天前
    来吧,献出大家的电报群
    mcluyu
        38
    mcluyu  
       276 天前
    其他 IM 的群好像也不卡吧, 人数限制那应该是其他原因,不是因为会卡吧
    lqcc
        39
    lqcc  
       276 天前
    @unafraid7580 请问如何将微信迁移到 tg ?
    2000wcw
        40
    2000wcw  
       276 天前   ❤️ 1
    @dynastysea 对普通用户来说,流畅好用就是先进,谁会管你架构是不是最 NB 的?
    anjingdexiaocai
        41
    anjingdexiaocai  
       276 天前 via Android
    最疑惑的点是服务器,流量这些是怎么解决,怎么这么豪😂😂
    unafraid7580
        42
    unafraid7580  
       276 天前 via Android   ❤️ 3
    dlsflh
        43
    dlsflh  
       276 天前 via Android
    没有张小龙拖后腿
    a0000
        44
    a0000  
       276 天前 via Android
    @yolee599 啥群啊?能分享出来吗
    hepin1989
        45
    hepin1989  
       276 天前
    很好做,可是,zc 让 500 人群。
    sky96111
        46
    sky96111  
       276 天前 via Android
    @meisen Android 上同样是挂在主页什么都不干,tg 占用 212MB 内存,微信占用 532MB
    edinina
        47
    edinina  
       276 天前
    确实,App 打开更新几秒,几万条的聊天记录都是随便划拉。相对应的,微信往上翻消息,加载顿挫感强烈。
    ysy950803
        48
    ysy950803  
       276 天前 via Android
    其实 IM 技术本身没有什么太大的壁垒了,Server 侧反正力大砖飞,Client 的话技术也是熟透了的,TG 的 App 源码全部开放到 Github 的,你会发现他们的 Android 实现几乎没有 xml 文件来写 UI ,全是 Java 代码直接绘制的,我没有细看,不知道是用的什么框架,大致看就是节省了 xml 解析和布局 inflate 的耗时。
    Stoney
        49
    Stoney  
       276 天前 via iPhone
    @yolee599 分享一下吧
    darklost
        50
    darklost  
       276 天前
    看过 TG 的客户端源码,也没啥框架,老毛子特色纯代码铺,
    消息协议层好像是 c++ 做的统一的,盲猜兼具新能和跨平台开发效率考虑?
    Edward5937
        51
    Edward5937  
       276 天前
    TG 如果要想在大陆上市使用,也会变成微信这幅模样
    相信 TG 很多人都是用来订阅频道的,微信不单单是 IM ,就是一个小程序平台
    dianso
        52
    dianso  
       276 天前
    啥也不干,我 win11 32G 内存给我用 2.5G
    aptx4689
        53
    aptx4689  
       276 天前
    telegram 的本地聊天记录挂了之后基本上就恢复不了
    dingwen07
        54
    dingwen07  
       276 天前
    @meisen #2 那是因为*NIX 版本的 TG 客户端都有内存泄漏,用 Windows 就好了。
    cxsz
        55
    cxsz  
       276 天前
    我这儿 win 下占用并不多
    yvkino
        56
    yvkino  
       276 天前
    @wulili #30 先去下载来用一下吧
    yvkino
        57
    yvkino  
       276 天前
    消息记录搜索也是秒加载,太能了
    YGHMXFAL
        58
    YGHMXFAL  
       276 天前
    官网下载的安卓客户端,内存泄漏,有一年了吧?也不知道是不是我这备用机(猴家)的问题?换第三方客户端了
    lisxour
        59
    lisxour  
       276 天前
    @edinina 我比较肯定地说,应该是微信做了限制,正常来说,只要服务器连接通畅,应该都能做到秒拉的,从微信收发文件、收发图片的速度就大概猜得出来,不管你网多快,都是几百 kb 的收发,所以无疑是做了限制。
    good1uck
        60
    good1uck  
       276 天前 via Android
    都在发表高见就没有一个说是怎么实现的

    靠谱的有讲 10 几万的是通知群。就好比公众号,你猜有多少万人订阅?技术实现和群聊肯定不一样啊
    a0000
        61
    a0000  
       276 天前 via Android
    @Edward5937 最开始是可以在大陆使用的,没有被墙,那时就非常丝滑,甩微信好几条街
    Katrol
        62
    Katrol  
       276 天前
    微信技术挺复杂的,卡加占用大是因为里面有很多东西
    BBCCBB
        63
    BBCCBB  
       276 天前
    万人大群技术上还是很难的.. 成百上千个万人大群技术上就更难了
    AppJun
        64
    AppJun  
       276 天前
    感兴趣愿意折腾可以去看他们的代码。

    https://github.com/TelegramMessenger/Telegram-iOS

    还有好几百个 issue 没关呢……
    bk201
        65
    bk201  
       276 天前
    对比微信。可能一个消息要过服务器,一个消息不过服务器。微信还要涉及舆情内容分析之类的。整个内容复杂度应该是不一样的。
    BBCCBB
        66
    BBCCBB  
       276 天前
    discord 这种也是, 超大群.. 技术上很难.
    pengtdyd
        67
    pengtdyd  
       276 天前
    老毛子的计算机水平还是值得肯定的,这是圣彼得堡的传统艺能,看家技能,哈哈哈
    BBCCBB
        68
    BBCCBB  
       276 天前
    qq 不就可以创建超过 500 人的群吗..

    微信 500 个人和张小聋设计理念以及技术选型有关.. 微信应该是用的写扩散. 简单但服务端存储成本, 扩散系数较高.. 无法支持太多人的群.
    iamqk
        69
    iamqk  
       276 天前
    功能单一
    clf
        70
    clf  
       276 天前
    应该是只加载最新的 N 条吧。在搜索信息的时候就基本很难搜到自己想找的云端记录了。
    nocity
        71
    nocity  
       275 天前
    @lisxour 微信聊天记录都在本地,向上拉取应该是读本地的数据库,拉取历史聊天记录的确没有 tg 顺滑,可能是本地数据库比较复杂或者是 UI 层设计逻辑问题。tg 在 iOS 客户端使用了自己修改的 Texture (AsyncDisplayKit),滑动过程中数据加载,布局计算都是后台线程,后台线程准备好数据和布局后再更新到主线程界面,用户一边划动一边加载,转圈圈比较少。
    ciki
        72
    ciki  
       275 天前
    确实挺流畅的,就是缓存的视频有点多
    AppJun
        73
    AppJun  
       275 天前   ❤️ 5
    作为做过几年的 IM 相关的 iOS 程序员稍微说一下,其实像 Telegram 这种用服务器保留了所有未被删除信息的 IM 服务而言,先天上对那些架构上(不考虑审核目的)没有存储用户的聊天内容导致不支持从最开始拉取消息的 IM 服务(比如微信而言),在很多方面是有很大优势的。主要说 IM 部分,微信的其他各种服务塞进来以及技术含量很高的小程序不在讨论范围。

    简单的说其实也是一种钞能力,用服务器成本来换来多端客户端的任务的简易性,最终靠简易性省掉了很多麻烦:

    1. 每次打开只需要拉取少量的数据,就能让用户大致了解群组的情况。

    - 比如用户在上次使用到下次使用期间,他有十个 500 人的群组,每个群组本来里面原来有 500 人 -> 550 人,其中一些人改了昵称,也不需要下载群组变化的 550 人的信息,只需要获取一个群组消息就可以,然后获取消息的时候把对应说话的用户信息也返回过来,而那些不说话的用户信息,有需要点击进群组的时候再依次加载。但是类似微信,他要下载 550 人的信息。

    - 如果这些群组产生了 2W 跳未读,这时候,其实他只需要拉取每个群组最老的 10 条未读和最新的 10 条未读,就能满足点击进去能看到好像都加载下来的数据,如果消息显示完了,就再请求服务器。这里只需要你和服务器的通讯速度够快,预加载的时机合适就行。但是类似微信,他必须把所有的 2W 条信息基本都下载下来。这也是为什么很多人的微信打开在转圈的时候,因为很多人特地把微信的“后台 App 刷新”给关了。

    2. 客户端职责简单

    - 主要的内容就是做几个 list ,把大家的聊天内容展示出来,处理未读/已读,根据更新 ID 请求数据等等。

    - 而微信,就特别需要有很强的投入在数据库优化上。因为聊天记录都在本地,又要在手机可能不太好的性能条件下,加载搜索之类的行为卡顿不能太明显的前提下,尽可能保证用户体验。

    3. 多端效果比较一致

    - 毕竟每个客户端只是拉取信息,虽然可能和“同步”的概念有点不一样,但是用户感受到的就是数据对得上。

    4. 遇到版本升级,历史垃圾文件清理的时候,Telegram 会有更大的余裕来处理,毕竟用户数据如果损坏了?再拉就好。微信则会面临垃圾越堆越多,一不小心弄坏用户记录可就很头疼的状态。

    但是微信这种没有服务器从头拉取数据的选择有什么好处呢?

    我个人觉得主要是几点:

    1. “省钱”,如果用拉取服务器模式,那么现在腾讯可能要 10x 倍的服务器投入,按照国内这个使用频率和覆盖率。那你可能除了朋友圈/公众号的广告外,应该也会看到 Telegram 那样子的群组广告/会员模式之类盈利的操作。

    2. 在性能同样的情况下,搜索的体验可能比 Telegram 必须调用服务器 API 请求历史数据来得好。

    3. 宣传点可以多一个隐私,而且用户需要担心自己历史聊天记录丢失的同时,哪天被哪个脚本小子盗号导致十多年来的聊天记录被传播开来的风险也降低,如果微信用的是 Telegram 的模式,我相信这几年很多吃瓜事件,怕是会有一大堆更没必要更详尽的聊天记录流出。

    4. 微信也能省去很多麻烦,比如聊天数据库被拖库之类的情况。

    整体而言,各家有各家的实际和困难,用不同的代价,换来不同的优势。

    其实很多事从一开始的选择就会导致一些必然的结果。有人说技术到一定程度就跟魔法一样。我觉得其实很多时候,App/互联网对一些不太熟悉的人而言,就是这类魔法的存在。比如楼里的很多人,基本都处于这种状态。
    datoujiejie221
        74
    datoujiejie221  
       275 天前
    服务端实现应该和推送服务器架构差不多,类比一下,一个个 app 相当于群,每个设备相当于群里的人,给 app 推送相当于给群发消息。我觉得这个量级不比十几个万少吧,微信感觉不是技术上做不到万人群,应该更多的是防止信息快速扩散。
    客户端主要还是针对存储的优化、ui 重用和预渲染等等,其实客户端源码都是开放的,有兴趣可以研究。
    j20001112
        75
    j20001112  
       275 天前 via iPhone
    @AppJun 我微信聊天记录从 6.7 版本备份恢复到电脑然后删除重装升级到 7.0 跨越几个版本更新就出现聊天记录数据库错乱,A 与 B 的聊天记录显示成都是 B 发送的。害得我聊天记录作为法院的证据失效损失上百万。
    putaozhenhaochi
        76
    putaozhenhaochi  
       275 天前 via iPhone
    你看看真正同时在线的有多少
    cslive
        77
    cslive  
       275 天前
    手机上的 qq ,差不多也是流畅无限滚动,丝滑的很
    wangxiaoaer
        78
    wangxiaoaer  
       275 天前 via iPhone
    @dynastysea 技术这么牛逼为什么做出来的客户端那么卡?
    totoro52
        79
    totoro52  
       275 天前
    @wangxiaoaer 面向老板 面向用户开发, 你在公司的时候产品规划能听自己的吗
    dynastysea
        80
    dynastysea  
       275 天前
    @wangxiaoaer 你的 tg 的数据量有 wx 的十分之一吗? tg 的功能有 wx 那么丰富吗?你别给我扯什么为什么微信要加那么多乱七八糟的功能,这里我说的就是技术层面。wx 在这么恶劣的条件下做到现在这水平就是很厉害啊。。
    nianyu
        81
    nianyu  
       275 天前
    @liy333 张口就来
    iseki
        82
    iseki  
       275 天前 via Android
    说真的,单看 IM 部分,我真没看出来微信哪里比 tg 先进🤣最多也只能说是吹得厉害;别的东西不要拿来比,那是 IM 么?
    tg 的服务端没开源,但从蛛丝马迹上多少能看出来,频道的实现和大群的实现应该差不多,这俩本质上也没多大区别
    BigShot404
        83
    BigShot404  
       275 天前
    多和用户交流装逼,少打高尔夫。事实证明,在公众面前装逼的确促进发展。
    nexo
        84
    nexo  
       275 天前   ❤️ 1
    @dynastysea 语音视频聊天为啥手机那么烫呢 facetime 就没有 为啥 wx 那么占内存 求解读是什么技术导致这么厉害的
    icaolei
        85
    icaolei  
       275 天前
    @gosrider #21 Windows 11 23H2 刚刚试了下,Windows Store 版。
    启动时 120M 左右。
    打开币安 14 万人的群组 + 在花茶馆 4 万人的群组,内存 123M 左右。
    然后我把全部的 17 个正经群组都开了一遍,基本都是几千人到几万人这种,内存 149M 左右。
    liy333
        86
    liy333  
       275 天前 via iPhone
    @nianyu 胡言乱语
    deadfishS
        87
    deadfishS  
       275 天前
    昨天才清掉 80 多 g 的缓存,也许是因为我加的都是各种浮力群
    Edward5937
        88
    Edward5937  
       275 天前
    @a0000 我的意思是要在中国审查制度下的正常访问
    ZeroDu
        89
    ZeroDu  
       275 天前
    tg 上最多见过 20w 人的,确实不卡,全平台都不卡;
    lgapple
        90
    lgapple  
       273 天前
    @unafraid7580 微信怎么迁移到电报,微信非常垃圾但是因为垄断又没办法不用
    Nerv
        91
    Nerv  
       271 天前   ❤️ 2
    @dynastysea 微信这玩意到现在还没解决消息不一致的问题,手机上收到的消息电脑上不显示或只显示一部分,即使选了同步最近的消息也无济于事,对一个聊天软件来说,这点基本的东西都做不到,谈何简洁高效。
    dynastysea
        92
    dynastysea  
       270 天前
    @Nerv 这个不算是 bug ,更多算是 feature ,微信有个机制就是服务端会确认客户端已收取的微信消息 ID ,已下发的不再会重复下发。多设备这个具体下发到什么时间点的消息微信倒也没公开具体的规则。所以这点用户其实会比较难理解。但这个不是技术层面的因素导致。
    wkong
        93
    wkong  
       268 天前
    我们开源的就是仿 Telegram 的,从底层架构到 UI 。

    https://github.com/TangSengDaoDao/TangSengDaoDaoServer
    kuituosi
        94
    kuituosi  
       268 天前
    万人群的技术并不复杂,内容都是按需加载的。tg 技术真正牛逼的地方是多 idc 数据同步,不同地方人聊天依然很流畅
    keenwon
        95
    keenwon  
       212 天前
    它的消息收发原理简单到很多不懂技术的讲讲都能听得懂,但市面上很多的 IM 都把这套方案做的很复杂

    @dynastysea 能讲讲吗?
    dynastysea
        96
    dynastysea  
       208 天前
    @keenwon 每个用户都有自己的一个消息列表,可以简单理解为 ID 自增,无论单聊还是群聊都是往自己的消息列表里插入一条消息,收取消息只需要读取自己的消息列表即可。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2884 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 09:30 · PVG 17:30 · LAX 02:30 · JFK 05:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.