• 请不要在回答技术问题时复制粘贴 AI 生成的内容
AmoxiDu
V2EX  ›  程序员

关于开发 IM 的架构选择

  •  
  •   AmoxiDu · Apr 14, 2018 · 7893 views
    This topic created in 2977 days ago, the information mentioned may be changed or developed.

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

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

    或者用环信融云之类的?
    bhagavad
        13
    bhagavad  
       Apr 14, 2018   ❤️ 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  
       Apr 14, 2018
    @lawfun 用环信融云之类的,这课设还有做的必要吗
    AmoxiDu
        15
    AmoxiDu  
    OP
       Apr 15, 2018 via Android
    @lawfun 谢谢分享!
    current
        16
    current  
       Apr 15, 2018
    @AmoxiDu 其实在我理解的架构里面,这种技术选型是优先级较低的。。对于 im 这种重业务和一致性的场景,后端的分层,数据模型的定义,传输协议的设计才是应该考虑的东西。具体怎么实现并不构成较大的障碍。
    laxenade
        17
    laxenade  
       Apr 15, 2018 via Android
    前端其实可以考虑用普通网页+phonegap 毕竟只是毕设,RN 的坑也不少。
    AmoxiDu
        18
    AmoxiDu  
    OP
       Apr 15, 2018 via Android
    @bhagavad 首先感谢回复。经过仔细各位老哥们的回复,我觉得把重心放在 Android 端开发比较合理,不过服务器端还是自己实现比较好,以前有过不少 JavaWeb 经验(其实还有一些 native 安卓应用开发经验😂),实现部分功能的 REST API 还是可以的。不过是否弃用 RN 转向 native,我还得考虑一下,因为 RN 是一位带毕设的老师推荐的😂。
    ETiV
        19
    ETiV  
       Apr 15, 2018
    Java ? XMPP/Openfire 了解一下
    AmoxiDu
        20
    AmoxiDu  
    OP
       Apr 15, 2018 via Android
    @laxenade 我们开过 JavaWeb 课和 Android 课,这两门课课设要求说实话我觉得还算挺高的,所以这次毕设可能得做的像模像样才能过关😂
    Gathaly
        21
    Gathaly  
       Apr 15, 2018
    可以考虑 Openfire 现成方案
    sagaxu
        22
    sagaxu  
       Apr 15, 2018 via Android
    这不是架构,最多至少库的选择
    kindjeff
        23
    kindjeff  
       Apr 15, 2018 via iPhone
    毕设不是应该直接用各种 IM 的免费额度,下载它们的 sdk 做就好了么(误
    yhzwy
        24
    yhzwy  
       Apr 15, 2018
    具体要实现哪些功能?
    毕设 android 端的功能多实现一点就差不多了吧。。
    服务端尽量简单。
    abcbuzhiming
        25
    abcbuzhiming  
       Apr 15, 2018
    IM 这玩意,做个原理展示不难,往大了做可是超级深坑,楼主你自己实现个架子就不错了,别的少想,想多了的话,光那个“消息到达检测和消息重发尝试”问题就能坑死你。
    xrlin
        26
    xrlin  
       Apr 15, 2018
    @abcbuzhiming 非常赞同,这是个深坑,别想一下子就能做得深入、完美,要不腾讯怎么活。
    dltech21
        27
    dltech21  
       Apr 16, 2018
    ai277014717
        28
    ai277014717  
       Apr 16, 2018
    协议的话我选 https+pb
    iyangyuan
        29
    iyangyuan  
       Apr 16, 2018
    这个不算架构。。你首先应该想到的问题是如何横向扩展,毕竟 IM 系统不可能是单机部署
    moka20477
        30
    moka20477  
       Apr 16, 2018
    毕业设计话可以直接使用 socket.io ,原生 TCP 的话协议是个比较复杂的部分,且 socket.io native 和 web 都可以支持
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5392 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 121ms · UTC 08:30 · PVG 16:30 · LAX 01:30 · JFK 04:30
    ♥ Do have faith in what you're doing.