有很多朋友的项目需要用到即时通讯,几年前鄙人的项目也是如此,当年没有选择,只能自建了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服务器必须要解决的几个问题!的更多相关文章

  1. 自建本地服务器,自建Web服务器——保姆级教程!

    搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...

  2. 非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法

    非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法 环境:非域环境 因为是自动故障转移,需要加入见证,事务安全模式是,强安全FULL模式 做到最后一 ...

  3. IIS中访问自己开发的Webservice site就自动停止,尝试重启IIS和重启服务器都不能解决。

    今天在加班的时候发现一个奇怪的问题,IIS里面我们自己开发的Webservice site一访问就自动停止.尝试重启IIS和重启服务器都不能解决.后台windows events报错信息是The Mo ...

  4. System Error. Code:1722. RPC服务器不可用解决办法

    原文链接(转载请注明出处):System Error. Code:1722. RPC服务器不可用解决办法 问题 最近在软件设计上机课的时候,使用 starUML 建模工具画UML图的时候总是弹出一条如 ...

  5. HttpWebResponse远程服务器返回错误: (500) 内部服务器错误 的解决办法

    在工作中用C#开发了一个小程序,不断访问去请求一个网站的页面,在循环过程中有时会报“远程服务器返回错误: (500) 内部服务器错误”,有时不会,出现的时机也不太一样.开始以为是网站的问题,后来网站是 ...

  6. linux服务器时间同步失败解决方法

    linux服务器时间同步失败解决方法 1.为什么会时间不同步: ①计算机的时间是根据电脑晶振以固定频率震荡而产生的,由于晶振的不同或者老化,会导致电脑时间积累误差的产 (什么是电脑晶振:http:// ...

  7. 系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法

    系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法

  8. 自建邮件服务器域名解析设置(A与MX记录)

    自建邮件服务器域名解析设置(A与MX记录) 前言 如果域名没有做解析,只能用于内网收发邮件.要想实现与外网邮箱的收发,需要做域名解析.是在"域名解析后台"进行设置(域名提供商提供& ...

  9. 在Centos系统中基于PowerDNS和Poweradmin自建域名解析服务器替代DnsPod

    本文讲述了我在Centos 7系统(其他版本的Centos未尝试)中基于PowerDNS和poweradmin自建域名解析服务器替代DnsPod的过程.通过本文所述方法,可以建立权威域名解析服务器的m ...

随机推荐

  1. MyBatis启动:MapperStatement创建

    参考:http://blog.csdn.net/ashan_li/article/details/50351080 MappedStatement说明 一个MappedStatement对象对应Map ...

  2. 【触发器】MySQL触发器使用详解

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器在MySQL中,创建触发器语法如下: ...

  3. 洛谷(cogs 1293/bzoj 1212) P2292 [HNOI2004]L语言

    1293. [HNOI2004] L语言 ★★★   输入文件:language.in   输出文件:language.out   简单对比时间限制:1 s   内存限制:162 MB [题目描述] ...

  4. Ubuntu 16.04解决在虚拟终端(Ctrl+Alt+F1)下显示菱形中文乱码问题

    在安装Ubuntu时,如果默认选择了中文,那么以后进去到虚拟终端就会出现菱形的中文乱码. 其实这个是无解的,但是可以通过以下技巧去实现: 1.把系统转成英文的 sudo gedit /etc/defa ...

  5. Java实现打印功能-AWT Graphics2D

    Java实现打印功能 用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Gra ...

  6. python练习-跳出多层循环和购物车

    跳出多层循环:三层循环,最里层直接跳出3层 在Python中,函数运行到return这一句就会停止,因此可以利用这一特性,将功能写成函数,终止多重循环 def work(): for i in ran ...

  7. VB Socket编程 框架

    [转载]VB Socket编程 框架 (2014-07-15 20:06:28) 转载▼ 标签: 转载   原文地址:VB Socket编程 框架作者:安静的浪花 VB Socket编程(Winsoc ...

  8. 【ubuntu firefox】 Firefox is already running, but is not responding

    在ubuntu下启动firefox报错 Firefox is already running, but is not responding. To open a new window, you mus ...

  9. javascript的call和apply

    coffeescript里,每个文件编译成JS后,都是(function(){...}).call(this);的架势 这个call,该怎么理解呢? 在javascript里面,call 或者 app ...

  10. How to use eclipse quickly

    --> // TODO Quickly find outstanding event 快速查找未完成事件        eg: // TODO Robin   --> Templates  ...