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

用 Go 打造现代 IM 之特征

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

    本人职业生涯十多年基本都在开发 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 不敢不敢
    imes
        4
    imes  
       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  
       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   ·   实用小工具   ·   943 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:45 · PVG 03:45 · LAX 11:45 · JFK 14:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.