关于开发 IM 的架构选择 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
AmoxiDu
V2EX    程序员

关于开发 IM 的架构选择

  •  
  •   AmoxiDu 2018-04-14 19:04:25 +08:00 7500 次点击
    这是一个创建于 2741 天前的主题,其中的信息可能已经有所发展或是发生改变。

    老哥们,我的毕设是开发一款 IM (要求实现对等传输)。
    目前的想法是后端用 SpringMVC,前端的话,重心在前台(要求实现移动 app ),准备用 React Native 框架实现安卓端。根据这些天了解的深入,发现坑真的挺多……
    现在的问题在于:
    ①通信的实现方式上,选用 Socket 还是 WebSocket,二者哪个性能更佳?
    ②移动 app 的通信实现上,用 js 还是混合原生开发(即用 Java )?
    听听大家的意见

    30 条回复    2018-04-16 18:32:04 +08:00
    PressOne
        1
    PressOne  
       2018-04-14 19:14:23 +08:00 via Android
    websocket 简单点
    faceair
        2
    faceair  
       2018-04-14 19:14:48 +08:00
    如果是毕设的话感觉不用特别在意协议开销,并不用像生产环境那么扣性能。websocket 创建连接是 http upgrade 来的,所以第一个请求略大一些,后面协议传输的时候对比裸 tcp 的话每个数据包大约两个字节的 websocket 协议头。
    协议可以直接选 mqtt 就好,发布订阅模式,满足你的 IM 需求,mqtt 可以直接走 tcp 也可以走 websocket。
    AmoxiDu
        3
    AmoxiDu  
    OP
       2018-04-14 20:19:55 +08:00 via Android
    @faceair 感谢回复。尽可能地考虑性能是带我们的导师要求的另外 mqtt 的建议很好,能解决我很大一部分难题
    AmoxiDu
        4
    AmoxiDu  
    OP
       2018-04-14 20:21:54 +08:00 via Android
    @PressOne 嗯,用 websocket 比较利于跨平台。
    hyyou2010
        5
    hyyou2010  
       2018-04-14 21:17:08 +08:00
    毕设简单为好,SpringMVC 和 React Native 都挺耗时间的。
    bobuick
        6
    bobuick  
       2018-04-14 21:39:56 +08:00
    网上有很多 im 的开源,甚至有的连 app 客户端都给实现了简单的 demo。找找参考下
    junan0708
        7
    junan0708  
       2018-04-14 22:05:47 +08:00 via Android
    workerman
    current
        8
    current  
       2018-04-14 22:15:00 +08:00
    使用什么传输层,客户端使用什么技术栈完全不是重点,重点在于 im 自身的协议。
    AmoxiDu
        9
    AmoxiDu  
    OP
       2018-04-14 22:24:35 +08:00 via Android
    @hyyou2010 我选的主题其实可大可小,目前的想法是以 soul 为参考模型,额外支持消息漫游同步和自己其他一些创意。RN 的选择倒是的确糟糕,以前有简单 JS 基础,现在学了一周 RN,有些地方还觉得不是很明白。特别是消息漫游同步这块,选库都得一通折腾( Redis+Level db+MySQL 的三层混合结构是真的合理)
    AmoxiDu
        10
    AmoxiDu  
    OP
       2018-04-14 22:28:37 +08:00 via Android
    @junan0708 可惜没有 PHP 基础
    AmoxiDu
        11
    AmoxiDu  
    OP
       2018-04-14 22:30:46 +08:00 via Android
    @current 嗯,不过当有不同选择时候就得慎重,特别在整体架构搭配这方面
    lawfun
        12
    lawfun  
       2018-04-14 22:47:08 +08:00
    最简单的方式,
    通信用 websocket,
    服务端用 https://github.com/TooTallNate/Java-WebSocket,
    Android https://github.com/codebutler/android-websockets,
    Android 客户端也用 Java
    数据库只用 MySQL。
    这样一套下来用到的知识基本都是大学学的。

    或者用环信融云之类的?
    bhagavad
        13
    bhagavad  
       2018-04-14 23:19:03 +08:00   1
    Socket 是一个工具(更狭义一点的话其实就是一组 interface ),其作用就是操作一个 TCP 的链接。
    WebSocket 是一个应用层协议,通过 http 握手,然后建立 TCP 链接,其特点就是可以比较好的兼容浏览器等。
    从性能角度而言,并没有什么差别 ,都是 TCP 链接,更重要的是要看传输的数据格式,xml、json、protobuf、thrift 这些的选择反而会更影响传输效率。
    mqtt 是一个基于代理的轻量级的 pub/sub 的消息传输协议。优点就是对带宽等硬件要求较低,适用于物联网场景。缺点可能就是 borker 的选择会有一定的难度。不知道现在开源的质量是否靠得住。

    关于移动端实现 IM,建议还是用 native,在重连、notification 处理方面 RN 还是有一定问题的,而且 Android 端不同设备、不同版本的差异性还是比较明显的,用 js 后期处理也会有一定的问题。

    另外就是看题目感觉应该是本科的毕设,本科毕设大多况下更关注的是应用层的东西,具体使用什么协议反而不是重心,如果是这种情况的话,可以使用一些第三方服务来快速搭建,比如 融云、LeanCloud、野狗、环信等,他们也有不少开源的 IM 套件。
    elgae
        14
    elgae  
       2018-04-14 23:30:56 +08:00
    @lawfun 用环信融云之类的,这课设还有做的必要吗
    AmoxiDu
        15
    AmoxiDu  
    OP
       2018-04-15 01:19:55 +08:00 via Android
    @lawfun 谢谢分享!
    current
        16
    current  
       2018-04-15 01:40:11 +08:00
    @AmoxiDu 其实在我理解的架构里面,这种技术选型是优先级较低的。。对于 im 这种重业务和一致性的场景,后端的分层,数据模型的定义,传输协议的设计才是应该考虑的东西。具体怎么实现并不构成较大的障碍。
    laxenade
        17
    laxenade  
       2018-04-15 01:44:59 +08:00 via Android
    前端其实可以考虑用普通网页+phonegap 毕竟只是毕设,RN 的坑也不少。
    AmoxiDu
        18
    AmoxiDu  
    OP
       2018-04-15 01:54:11 +08:00 via Android
    @bhagavad 首先感谢回复。经过仔细各位老哥们的回复,我觉得把重心放在 Android 端开发比较合理,不过服务器端还是自己实现比较好,以前有过不少 JavaWeb 经验(其实还有一些 native 安卓应用开发经验),实现部分功能的 RESTAPI还是可以的。不过是否弃用 RN 转向 native,我还得考虑一下,因为 RN 是一位带毕设的老师推荐的。
    ETiV
        19
    ETiV  
       2018-04-15 02:05:57 +08:00
    Java ? XMPP/Openfire 了解一下
    AmoxiDu
        20
    AmoxiDu  
    OP
       2018-04-15 02:15:53 +08:00 via Android
    @laxenade 我们开过 JavaWeb 课和 Android 课,这两门课课设要求说实话我觉得还算挺高的,所以这次毕设可能得做的像模像样才能过关
    Gathaly
        21
    Gathaly  
       2018-04-15 02:42:16 +08:00
    可以考虑 Openfire 现成方案
    sagaxu
        22
    sagaxu  
       2018-04-15 03:30:00 +08:00 via Android
    这不是架构,最多至少库的选择
    kindjeff
        23
    kindjeff  
       2018-04-15 09:00:27 +08:00 via iPhone
    毕设不是应该直接用各种 IM 的免费额度,下载它们的 sdk 做就好了么(误
    yhzwy
        24
    yhzwy  
       2018-04-15 09:30:52 +08:00
    具体要实现哪些功能?
    毕设 android 端的功能多实现一点就差不多了吧。。
    服务端尽量简单。
    abcbuzhiming
        25
    abcbuzhiming  
       2018-04-15 11:07:16 +08:00
    IM 这玩意,做个原理展示不难,往大了做可是超级深坑,楼主你自己实现个架子就不错了,别的少想,想多了的话,光那个“消息到达检测和消息重发尝试”问题就能坑死你。
    xrlin
        26
    xrlin  
       2018-04-15 15:02:46 +08:00
    @abcbuzhiming 非常赞同,这是个深坑,别想一下子就能做得深入、完美,要不腾讯怎么活。
    dltech21
        27
    dltech21  
       2018-04-16 11:04:05 +08:00
    ai277014717
        28
    ai277014717  
       2018-04-16 14:01:40 +08:00
    协议的话我选 https+pb
    iyangyuan
        29
    iyangyuan  
       2018-04-16 15:26:56 +08:00
    这个不算架构。。你首先应该想到的问题是如何横向扩展,毕竟 IM 系统不可能是单机部署
    moka20477
        30
    moka20477  
       2018-04-16 18:32:04 +08:00
    毕业设计话可以直接使用 socket.io ,原生 TCP 的话协议是个比较复杂的部分,且 socket.io native 和 web 都可以支持
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5451 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 08:10 PVG 16:10 LAX 01:10 JFK 04:10
    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