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

关于开发 IM 的架构选择

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

    老哥们,我的毕设是开发一款 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 安卓应用开发经验😂),实现部分功能的 REST API 还是可以的。不过是否弃用 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   ·   我们的愿景   ·   实用小工具   ·   5607 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 01:41 · PVG 09:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.