开发者自建IM服务器必须要解决的几个问题!
有很多朋友的项目需要用到即时通讯,几年前鄙人的项目也是如此,当年没有选择,只能自建了IM服务器,几年下来跨了不少的坑,想想都甚是后怕。总结此文为后来还想自建IM的朋友提个醒,或许能找到更好的解决之路。
1, 如何应对大并发量连接
自己组建IM服务器,总是要面对大并发量连接的,有些朋友可能会说,我们用户不多,不需要考虑这个问题,但至少应该将用户控制在一个数量以内,不要让意外增加的用户影响到现有的用户吧。那么一台服务器可以支撑多少连接?又可以支撑多少用户同时发消息?
如果需要多台服务器做集群?需要怎么做?架构又是如何的?
这些课题绝对不是几个人短时间就能解决的。开发者需要根据项目的具体情况严谨地评估是否可以处理这些问题。
2, 为什么总是莫名地断线呢?
一般自建IM服务器都会使用现成的openfire等现成的开源部署,经过不少时间部署测试后正常运作。但一到了移动端这种网络相当不稳定的环境后总是会出现各种各样的奇怪问题,费尽力气才发现原来是连接不稳定,经常断线导致的。
那么又如何来解决这个问题呢?
办法不是没有,只是相当繁琐。需要很长一段时间的评估测试才能解决,甚至会更改原来的一些功能设计。
如果你没有精通开源库的专家,要想短时间解决这些问题除了花大量时间之外就是使用其它方式巧妙避开它。
3, 为什么总是会丢消息?
丢消息是自建IM服务器常遇到的问题,要解决这个问题也不容易。
移动端的丢消息大概是这个样子。A和B通讯,A发了一条消息给服务器,服务器发给B,但是B网络不好掉线了,而服务器却不知道B退出了(B正常退出会给服务器发下线通知),所以消息丢失了。XMPP中有xep-0184协议(消息回执),A给B发消息,消息体中带一行代码(要求消息回执),当B收到消息后发送一条回执,证明我收到了。后来XMPP又有了xep-0198协议(流管理),断线后快速重链,同时判断一定时间收不到消息,就把消息写离线消息,减少丢消息情况。但是可能网络情况复杂,加上各种不确定因素,还会出现丢消息的问题。
目前比较靠谱的方法就是存所有的聊天记录,由手机端根据时间点去数据库拉消息,只要别人发出的消息就不会丢。这要对即时通讯模块进行了相关改动,同时需要注意消息的顺序,拉消息时也尽可能只拉取需要的消息,这时需要一个较好的完整同步机制,这个机制推荐参考yun2win的同步机制http://console.yun2win.com/docs/server.html。
这里需要花费多少时间成本,可以感受一下。
这里只是列出了比较常出现的几个问题,自建IM服务器成本不小,不管是硬件成本还是开发成本以及运营风险上。评估自己项目是否需要自建IM服务器一般是以下几种情况:
1,拥有自主的即时通讯技术的情况下
2,项目保密性很高,需要绝对保证数据安全
不好意思,在现在PAAS盛行的时代我还真无法想出更多需要自建IM的理由了,以上两点貌似看上对比较立得住脚。
其它第2点提到的数据安全现在好像也不能算是自建IM的理由了,因为市面上已经出现数据和通讯分开物理隔离的即时通讯云,可以百度下yun2win。
总之,自建IM之路坎坷,君请三思而行。
开发者自建IM服务器必须要解决的几个问题!的更多相关文章
- 自建本地服务器,自建Web服务器——保姆级教程!
搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...
- 非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法
非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法 环境:非域环境 因为是自动故障转移,需要加入见证,事务安全模式是,强安全FULL模式 做到最后一 ...
- IIS中访问自己开发的Webservice site就自动停止,尝试重启IIS和重启服务器都不能解决。
今天在加班的时候发现一个奇怪的问题,IIS里面我们自己开发的Webservice site一访问就自动停止.尝试重启IIS和重启服务器都不能解决.后台windows events报错信息是The Mo ...
- System Error. Code:1722. RPC服务器不可用解决办法
原文链接(转载请注明出处):System Error. Code:1722. RPC服务器不可用解决办法 问题 最近在软件设计上机课的时候,使用 starUML 建模工具画UML图的时候总是弹出一条如 ...
- HttpWebResponse远程服务器返回错误: (500) 内部服务器错误 的解决办法
在工作中用C#开发了一个小程序,不断访问去请求一个网站的页面,在循环过程中有时会报“远程服务器返回错误: (500) 内部服务器错误”,有时不会,出现的时机也不太一样.开始以为是网站的问题,后来网站是 ...
- linux服务器时间同步失败解决方法
linux服务器时间同步失败解决方法 1.为什么会时间不同步: ①计算机的时间是根据电脑晶振以固定频率震荡而产生的,由于晶振的不同或者老化,会导致电脑时间积累误差的产 (什么是电脑晶振:http:// ...
- 系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法
系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法
- 自建邮件服务器域名解析设置(A与MX记录)
自建邮件服务器域名解析设置(A与MX记录) 前言 如果域名没有做解析,只能用于内网收发邮件.要想实现与外网邮箱的收发,需要做域名解析.是在"域名解析后台"进行设置(域名提供商提供& ...
- 在Centos系统中基于PowerDNS和Poweradmin自建域名解析服务器替代DnsPod
本文讲述了我在Centos 7系统(其他版本的Centos未尝试)中基于PowerDNS和poweradmin自建域名解析服务器替代DnsPod的过程.通过本文所述方法,可以建立权威域名解析服务器的m ...
随机推荐
- yum 源本地化 (one)
First of all, you need to prepare the rpm packages, we can download them with yum command, in that w ...
- golang中select case 的用途到底是啥
https://nanxiao.gitbooks.io/golang-101-hacks/content/posts/select-operation.html ------------------- ...
- ubuntu Change Language
慎用 所謂的語系(locale),其實包含語言及地區的設定,因為除了語言之外,國家與國家的日期表示方式.數字格式.貨幣符號.度量單位可能都不一樣,所以才會有了這個locale的發明,依照國家和語言給予 ...
- Android自己定义控件系列案例【五】
案例效果: 案例分析: 在开发银行相关client的时候或者开发在线支付相关client的时候常常要求用户绑定银行卡,当中银行卡号一般须要空格分隔显示.最常见的就是每4位数以空格进行分隔.以方便用户实 ...
- WinMain和MFC的差别
API(Application Programming Interface):开放给应用程序调用的系统功能. 一个Windows Application(SDK): WinMain ReristerC ...
- react State改变,页面却没有改变
react 小白编程 做项目时遇到了个问题,无论我怎么查看我的action.reducer 还是 dispatch 函数,都没有发现有什么毛病.但是 debugger 的时候,state 改变了,页面 ...
- 模块化开发(二)--- seaJs入门学习
SeaJS是一个基于CMD模块定义规范实现一个模块系统加载器 [CMD规范](https://github.com/cmdjs/specification/blob/master/draft/mo ...
- Android离线语音识别(PocketSphinx)
近期做项目.用到离线语音识别.整了好久,查了好多方法.最终完毕.网上资料有点乱,并且大部分就是那几个人写的.一群人转!以下我总结一下.也为后来人行个方便. 关于环境配置我就不多说了.我就是依照这个教程 ...
- 快学Scala习题解答—第十章 特质
10 特质 10.1 java.awt.Rectangle类有两个非常实用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这种类没有. 在Scala中,你 ...
- SoapUI在Jenkins中的配置
Jenkins Label: windows_ws_test 已有Jenkins环境变量 %READYAPI_PRO_HOME% - <D:\Program Files\SmartBear ...