用 Go 打造现代 IM 之特征 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
wkong
V2EX    程序员

用 Go 打造现代 IM 之特征

  •  
  •   wkong
    tangtaoit 2023-09-18 11:29:46 +08:00 4854 次点击
    这是一个创建于 753 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    @hentaisan 可以局域网部署,不需要连任何外网
    Jirajine
        41
    Jirajine  
       2023-09-18 17:37:09 +08:00 via Android
    @matolv #32 matrix 使用下来感觉非常卡顿缓慢,无论哪个客户端,性能比微信还差。不知道是它默认的 homeserver 问题,还是协议设计有问题。
    telegram 或许不是最开放隐私安全的 IM ,但应该是性能最好的 IM 。
    jlak
        42
    jlak  
       2023-09-18 18:06:40 +08:00 via iPhone
    一千万人群需要开一千万个 ws 吗
    wyx119911
        43
    wyx119911  
       2023-09-18 19:43:46 +08:00
    @hellomynameis #10 确实,不过微信群在线率还是很高的
    matolv
        44
    matolv  
       2023-09-19 08:36:15 +08:00 via iPhone
    @Jirajine vector-im 时代 UI 非常简陋,卡顿,崩溃和 bug 都很多,改名到 element 以后 UI 换掉,功能性 bug 基本修完就好很多了。如果你的卡顿指消息载入慢什么的那是服务器端的问题,不是客户端问题
    MENGKE
        45
    MENGKE  
       2023-09-19 09:38:42 +08:00
    @wkong #30 https://www.jylawyer.com/special/zongshu/20220325/15818.html 感觉第 7 条什么都能装进去。再加上私有化部署端对端加密,我个人觉得有风险,但法律方面我也不太懂
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1027 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 22:59 PVG 06:59 LAX 15:59 JFK 18:59
    Do have faith in what you're doing.
    ubao 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