关于开发 IM 的架构选择

2018-04-14 19:04:25 +08:00
 AmoxiDu

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

7127 次点击
所在节点    程序员
30 条回复
PressOne
2018-04-14 19:14:23 +08:00
websocket 简单点
faceair
2018-04-14 19:14:48 +08:00
如果是毕设的话感觉不用特别在意协议开销,并不用像生产环境那么扣性能。websocket 创建连接是 http upgrade 来的,所以第一个请求略大一些,后面协议传输的时候对比裸 tcp 的话每个数据包大约两个字节的 websocket 协议头。
协议可以直接选 mqtt 就好,发布订阅模式,满足你的 IM 需求,mqtt 可以直接走 tcp 也可以走 websocket。
AmoxiDu
2018-04-14 20:19:55 +08:00
@faceair 感谢回复。尽可能地考虑性能是带我们的导师要求的😂另外 mqtt 的建议很好,能解决我很大一部分难题
AmoxiDu
2018-04-14 20:21:54 +08:00
@PressOne 嗯,用 websocket 比较利于跨平台。
hyyou2010
2018-04-14 21:17:08 +08:00
毕设简单为好,SpringMVC 和 React Native 都挺耗时间的。
bobuick
2018-04-14 21:39:56 +08:00
网上有很多 im 的开源,甚至有的连 app 客户端都给实现了简单的 demo。找找参考下
junan0708
2018-04-14 22:05:47 +08:00
workerman
current
2018-04-14 22:15:00 +08:00
使用什么传输层,客户端使用什么技术栈完全不是重点,重点在于 im 自身的协议。
AmoxiDu
2018-04-14 22:24:35 +08:00
@hyyou2010 我选的主题其实可大可小,目前的想法是以 soul 为参考模型,额外支持消息漫游同步和自己其他一些创意。RN 的选择倒是的确糟糕,以前有简单 JS 基础,现在学了一周 RN,有些地方还觉得不是很明白。特别是消息漫游同步这块,选库都得一通折腾( Redis+Level db+MySQL 的三层混合结构是真的合理)😂
AmoxiDu
2018-04-14 22:28:37 +08:00
@junan0708 可惜没有 PHP 基础😂
AmoxiDu
2018-04-14 22:30:46 +08:00
@current 嗯,不过当有不同选择时候就得慎重,特别在整体架构搭配这方面
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
2018-04-14 23:19:03 +08:00
Socket 是一个工具(更狭义一点的话其实就是一组 interface ),其作用就是操作一个 TCP 的链接。
WebSocket 是一个应用层协议,通过 http 握手,然后建立 TCP 链接,其特点就是可以比较好的兼容浏览器等。
从性能角度而言,并没有什么差别 ,都是 TCP 链接,更重要的是要看传输的数据格式,xml、json、protobuf、thrift 这些的选择反而会更影响传输效率。
mqtt 是一个基于代理的轻量级的 pub/sub 的消息传输协议。优点就是对带宽等硬件要求较低,适用于物联网场景。缺点可能就是 borker 的选择会有一定的难度。不知道现在开源的质量是否靠得住。

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

另外就是看题目感觉应该是本科的毕设,本科毕设大多情况下更关注的是应用层的东西,具体使用什么协议反而不是重心,如果是这种情况的话,可以使用一些第三方服务来快速搭建,比如 融云、LeanCloud、野狗、环信等,他们也有不少开源的 IM 套件。
elgae
2018-04-14 23:30:56 +08:00
@lawfun 用环信融云之类的,这课设还有做的必要吗
AmoxiDu
2018-04-15 01:19:55 +08:00
@lawfun 谢谢分享!
current
2018-04-15 01:40:11 +08:00
@AmoxiDu 其实在我理解的架构里面,这种技术选型是优先级较低的。。对于 im 这种重业务和一致性的场景,后端的分层,数据模型的定义,传输协议的设计才是应该考虑的东西。具体怎么实现并不构成较大的障碍。
laxenade
2018-04-15 01:44:59 +08:00
前端其实可以考虑用普通网页+phonegap 毕竟只是毕设,RN 的坑也不少。
AmoxiDu
2018-04-15 01:54:11 +08:00
@bhagavad 首先感谢回复。经过仔细各位老哥们的回复,我觉得把重心放在 Android 端开发比较合理,不过服务器端还是自己实现比较好,以前有过不少 JavaWeb 经验(其实还有一些 native 安卓应用开发经验😂),实现部分功能的 REST API 还是可以的。不过是否弃用 RN 转向 native,我还得考虑一下,因为 RN 是一位带毕设的老师推荐的😂。
ETiV
2018-04-15 02:05:57 +08:00
Java ? XMPP/Openfire 了解一下
AmoxiDu
2018-04-15 02:15:53 +08:00
@laxenade 我们开过 JavaWeb 课和 Android 课,这两门课课设要求说实话我觉得还算挺高的,所以这次毕设可能得做的像模像样才能过关😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/446851

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX