用 Go 打造现代 IM 之特征 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
wkong

用 Go 打造现代 IM 之特征

  •  
  •   wkong
    tangtaoit Sep 18, 2023 5370 views
    This topic created in 954 days ago, the information mentioned may be changed or developed.

    本人职业生涯十多年基本都在开发 IM ,踩过许多坑,重构了无数个版本 (好代码不是设计出来的,是重构出来的)。

    我们开源的 IM ,目前我认为最具现代化的 IM:

    1. 万人或千万人群支持
    2. 同一账号多设备登录
    3. 消息不丢,换设备实时同步
    4. 消息可编辑可回复
    5. 消息可以点赞
    6. 已读未读
    7. 在线状态
    8. 端对端加密(仅国外)

    (其实现代 IM ,不仅仅是 IM 了,更像一个实时的论坛)

    开源地址:

    唐僧叨叨 IM ,高颜值,仿 TG https://github.com/TangSengDaoDao/TangSengDaoDaoServer

    悟空 IM ,唐僧叨叨的通讯底层(自研消息 DB ) https://github.com/WuKongIM/WuKongIM

    45 replies    2023-09-19 09:38:42 +08:00
    TESTFLIGHT2021
        1
    TESTFLIGHT2021  
       Sep 18, 2023
    缅北需要这个
    0littleboy
        2
    0littleboy  
       Sep 18, 2023
    遥遥领先于微信
    wkong
        3
    wkong  
    OP
       Sep 18, 2023
    @0littleboy 不敢不敢
    cmos
        4
    cmos  
       Sep 18, 2023
    看了一下架构,这个对服务器的负载应该不低吧?尤其是用户量多于 10K ,同时活跃数大于 1K 的时候。
    wkong
        5
    wkong  
    OP
       Sep 18, 2023
    @imes 这个量基本没啥压力。
    laoyutang
        6
    laoyutang  
       Sep 18, 2023 via Android
    千万人的群聊,牛逼啊
    sakuramanstein
        7
    sakuramanstein  
       Sep 18, 2023 via Android
    hellomynameis
        8
    hellomynameis  
       Sep 18, 2023
    不如 Telegram
    veike
        9
    veike  
       Sep 18, 2023
    万人的群聊应该没有办法正常聊天吧
    hellomynameis
        10
    hellomynameis  
       Sep 18, 2023
    @veike 不至于,除非全都同时在线,常常人数越多的群在线人数比例就越低,不经常上线的死人越多
    skiy
        11
    skiy  
       Sep 18, 2023
    牛。先 star 。
    hepin1989
        12
    hepin1989  
       Sep 18, 2023
    小心点,国家不准有 500 人的群,别去踩缝纫机
    wkong
        13
    wkong  
    OP
       Sep 18, 2023
    @hepin1989 我们自己不运营应该没事吧。
    freemoon
        14
    freemoon  
       Sep 18, 2023
    有没有 一键清除多久未上线的成员(时间可填)
    freemoon
        15
    freemoon  
       Sep 18, 2023
    @lasuar 纠正:多久未活跃的群成员
    wkong
        16
    wkong  
    OP
       Sep 18, 2023
    @lasuar 没有
    bctdg
        17
    bctdg  
       Sep 18, 2023
    大佬,能分享一下 IM 业务访问数据库的 workload 的具体分布吗?(比如写入的频率和读(或者扫表)的频率)
    看代码是用的 BoltDB 做存储引擎?这个有啥讲究吗
    danbai
        18
    danbai  
    PRO
       Sep 18, 2023
    @wkong #13 没见过之前有个大哥发的帮信罪嘛
    fgwmlhdkkkw
        19
    fgwmlhdkkkw  
       Sep 18, 2023
    @bctdg boltdb 说 go 写的,应该只是为了方便吧,毕竟 sqlite3 需要 cgo
    wkong
        20
    wkong  
    OP
       Sep 18, 2023
    @bctdg 通讯层会将消息推送一份到业务层,业务层目前是分表存储了消息(业务层存与不存,通讯层都会存储消息)

    BoltDB 主要是用来存储一些 key value 的元数据,比如用户的 uid 和 token ,消息存储是自研的 LSM 存储
    bctdg
        21
    bctdg  
       Sep 18, 2023
    @fgwmlhdkkkw 毕竟 go 的数据库选择也有很多嘛,Pebble 、BadgerDB 也是 go 写的 kv 数据库,所以有点好奇怎么选的
    hao7Chen
        22
    hao7Chen  
       Sep 18, 2023
    Go 语言这么厉害吗?看来我得学一学了
    bctdg
        23
    bctdg  
       Sep 18, 2023
    @wkong 自研 LSM 太强啦!不选择已有的 LSM 存储(比如 Pebble )有啥考量不
    i979491586
        24
    i979491586  
       Sep 18, 2023
    牛。先 star 。
    wkong
        25
    wkong  
    OP
       Sep 18, 2023
    @bctdg Pebble 这些不适合 IM 消息的这种特点,自研的类似 kafka 一样的 一个 topic 一个日志文件+索引文件,我们是一个频道一个日志文件+索引文件,一个频道的消息就可以按顺序写入到频道的日志文件里,性能非常高
    bctdg
        26
    bctdg  
       Sep 18, 2023
    @wkong 哦~所以也不需要有 LSM 的 compaction 是吗?更像是个 append-only + 索引的日志?
    wkong
        27
    wkong  
    OP
       Sep 18, 2023
    @bctdg 是的
    bctdg
        28
    bctdg  
       Sep 18, 2023
    @wkong 好的!感谢,已 star ,跟着大佬学习
    MENGKE
        29
    MENGKE  
       Sep 18, 2023
    被缅北之类的拿去用小心被定帮信啊
    wkong
        30
    wkong  
    OP
       Sep 18, 2023
    @MENGKE 没收钱也定帮信?
    ArianX
        31
    ArianX  
       Sep 18, 2023
    和主流 IM 的对比如何,飞书也是用 go 打造的
    matolv
        32
    matolv  
       Sep 18, 2023
    这个 UI 和操作逻辑和微信接近,微信属于完全上位替代,从用户角度就没太大意义了,除非当作企业 OA 一部分使用。如果是其他场景,TG 和 element/matrix 属于差异性替代,有存在意义。
    queuey
        33
    queuey  
       Sep 18, 2023
    随便看了一下 iOS 的代码,这个 DB SQL 连防注入都没有?而且没有看到用户和用户关系表?当然有可能是我遗漏了
    wkong
        34
    wkong  
    OP
       Sep 18, 2023
    @queuey 都是通过?填充的参数应该不存在注入问题,用户和群我们都统一抽象为频道了,频道与频道之间可以 follow 的关系
    winglight2016
        35
    winglight2016  
       Sep 18, 2023
    好,这下老板再让我做个微信就有办法了。。。Uェ*U
    aiqinxuancai
        36
    aiqinxuancai  
       Sep 18, 2023
    @wkong #13 这个主要看执法的灵活性
    yaodao
        37
    yaodao  
       Sep 18, 2023
    大佬,佩服,点赞收藏了
    tigerZhang
        38
    tigerZhang  
       Sep 18, 2023
    iOS 列表采用的是 tableView ? collectionView ?自定义 ?
    hentaisan
        39
    hentaisan  
       Sep 18, 2023
    现在没有专供局域网的 im 吗?
    wkong
        40
    wkong  
    OP
       Sep 18, 2023
    @tigerZhang tableView

    @hentaisan 可以局域网部署,不需要连任何外网
    Jirajine
        41
    Jirajine  
       Sep 18, 2023 via Android
    @matolv #32 matrix 使用下来感觉非常卡顿缓慢,无论哪个客户端,性能比微信还差。不知道是它默认的 homeserver 问题,还是协议设计有问题。
    telegram 或许不是最开放隐私安全的 IM ,但应该是性能最好的 IM 。
    jlak
        42
    jlak  
       Sep 18, 2023 via iPhone
    一千万人群需要开一千万个 ws 吗
    wyx119911
        43
    wyx119911  
       Sep 18, 2023
    @hellomynameis #10 确实,不过微信群在线率还是很高的
    matolv
        44
    matolv  
       Sep 19, 2023 via iPhone
    @Jirajine vector-im 时代 UI 非常简陋,卡顿,崩溃和 bug 都很多,改名到 element 以后 UI 换掉,功能性 bug 基本修完就好很多了。如果你的卡顿指消息载入慢什么的那是服务器端的问题,不是客户端问题
    MENGKE
        45
    MENGKE  
       Sep 19, 2023
    @wkong #30 https://www.jylawyer.com/special/zongshu/20220325/15818.html 感觉第 7 条什么都能装进去。再加上私有化部署端对端加密,我个人觉得有风险,但法律方面我也不太懂
    About     Help     Advertise     Blog     API     FAQ     Solana     963 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 205ms UTC 20:06 PVG 04:06 LAX 13:06 JFK 16:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86