写一个即时通信的app,服务器端需要用到哪些技术?

写一个即时通信的app,服务器端需要用到哪些技术?

https://www.zhihu.com/question/32095220

作者:Syter
链接:https://www.zhihu.com/question/32095220/answer/55139710
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题主问的是写即时通讯的app,服务器端需要什么技术,大部分人都在下面给出用第三方的lib是几个意思。题主真想用第三方的lib,直接去百度就搜到了,根本没必要来这里问。

我说下我个人的经历。
几年前,当我刚接触移动开发的时候,我就在想一个问题,为什么玩一款App,觉得好玩,想要分享给朋友,却只能通过微信或是QQ去分享?我很不理解为什么我要从这个App跳出去启动另一个App来完成这件事,这样不是很麻烦吗?即使好友也来下载了这款App,然后我要和他交流,也得通过微信或者QQ,麻烦死了。

为什么我不能直接在App里面直接和好友进行交流?
为什么不能直接在App里面和其他App的好友进行交流?
开发App里的即时通讯很难吗?

后来,我进了现在的这家公司,因为CEO和我面谈的时候,在最终要实现的目标上,我觉得他的想法和我惊人的一致。
经过一段时间的学习,虽然说公司的IM和Push这块儿源码不是我写的,但是在不断的拓展功能和修复Bug上,我也渐渐了解了这个事情是怎么回事儿。

协议
由于我们公司使用的是mqtt协议,所以我对这个协议是了解得比较多的。(看到其他的人都在回答使用XMPP这个协议,但是我了解得不多,不做评价)
mqtt协议是什么,怎么用,这种东西我给题主一个官网的链接,自己看去。
我可以分享一个故事给题主。
我去客户那儿做支持的时候,有个做服务器的客户和我聊天,他说他以前就是做IM服务器的(一家还挺有名的公司,后来没落了,就不说了),第一次开发IM服务器的时候,啥都不会弄,然后他们领导打印了XMPP的协议和MQTT的协议,整整两大堆纸,让他把两个协议每天看一遍,等什么时候记住了,什么时候就知道开发了。
然后他真的就每天看每天看,一个星期后,两个协议都记在脑子里了,流程,传输信息头,信息内容,一字不差。再动手开始弄IM服务器,几乎没有问过同事和领导任何问题。

我说这个故事是想说,搞懂协议是做IM服务器的第一步(当然那哥们本身能力很不错,所以他弄懂了协议就知道接下来要怎么弄)。

语言和数据库和实现方式
语言方面,题主提到自己自学Android,如果不是全栈工程师,所以应该会选择Java,
数据库题主选的是MySQL。
实现方式是Socket。

我个人的见解是,题主你的选择没问题。使用任何一种语言,任何一个数据库都可以用Socket实现。但是题主你要想清楚,你想要实现的是一台什么级别的服务器能供多少用户同时在线收发消息?

我再给题主分享一个故事吧。
我室友,去年的这个时候在北京进了一家大公司,原本进去做Java Web开发,后来公司说要弄一个App,包含公司的行政,管理以及类似朋友圈等功能。因为我会Android,所以他为了绩效,向公司虚报他会Android,然后由我晚上在家负责教他怎么做。(当然他学习能力很不错)
做到后面,那个App需要IM功能,这下傻眼了,问我怎么办。我说你直接用第三方lib吧,比如我们公司的。他和领导去周旋,领导没同意,后来决定自己开发。然后从其他组调了一个据说能力很不错的做后台服务器的。那哥们鼓捣了一个星期,搭了一个mqtt协议的服务器,提供一系列收发消息的接口,说是完成了。我室友毫不犹豫地使用了,回到家还对我吹嘘IM服务器不难嘛,你看他一个星期就做好了。
一个月后,App上线了,全公司几千个员工在第一天,几乎全体都在反馈,收发消息的时候漏消息了。
他回到家问我,为什么会这样?
我问了他相关情况后得知,他们后台服务器语言是Java,数据库是Oracle,在实现mqtt协议的时候使用的是QOS为1的标准,服务器是一台8G内存20M带宽的Linux系统。
我说你们后台服务器太重,数据库不方便拓展,而且还就这么一台服务器,mqtt协议用QOS为1,简直就是做死。你们测试的时候难道没进行压力测试吗。
他说没有。因为这个App是对公司内部发布的,外面没得下载的。公司就几千人,压力也不大吧。
后面有些话我不方便说太多,反正这个App他自己除了签到打卡这个功能外,其他功能他自己都不用,今年过了年,领导说他做的App没有达到原有的期望,绩效没上去,他最后跳了。

我说这个故事想说的是,题主你用任何一种语言和数据库都可以实现,但是最终效果可能不会像你开始设想的那么美好。
即时聊天这个功能,因为是多数据小信息量的模式,使用轻量级的框架和语言(比如NodeJS,Ruby)还有非关系型数据库(比如MongoDB)是比较好的,如果选用太沉重的,那之后只能用增加服务器这种手段来实现。


说了这么多,我想表达的是,我不可能直接告诉题主要怎么做。我只是把我所知道的我所接触到的都摆在你面前,告诉你哪条路走下去可能是不好的,哪条路是相对比较好的。

以上,基于我个人经验。
 

 

posted @ 2018-03-16 15:24  sky20080101  阅读(375)  评论(0)    收藏  举报