有很多朋友的项目需要用到即时通讯,几年前鄙人的项目也是如此,当年没有选择,只能自建了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. Xdebug的安装、配置和使用

    对于我这么一个渣渣php码农,平时总觉得echo.var_dump.print_r就能满足我的调试需求了,最近公司开始一个新项目,要大量阅读调试旧的源码,echo和var_dump开始不够用了,于是装 ...

  2. dubbo bug之 Please check registry access list (whitelist/blacklist)的分析与解决

    1.基本就是dubbo provider没有启动会造成这种情况. 2.api和service是同一个项目,并不是俩项目. 通过启动api,run on server是不能启动service的,必须通过 ...

  3. SuperSwipeRefreshLayout 一个功能强大的自己定义下拉刷新组件

    SuperSwipeRefreshLayout 一个功能强大的自己定义下拉刷新组件. Why? 下拉刷新这样的控件.想必大家用的太多了,比方使用非常多的XListView等. 近期.项目中非常多列表都 ...

  4. Linux内核之于红黑树and AVL树

    为什么Linux早先使用AVL树而后来倾向于红黑树?       实际上这是由红黑树的有用主义特质导致的结果,本短文依旧是形而上的观点.红黑树能够直接由2-3树导出.我们能够不再提红黑树,而仅仅提2- ...

  5. 用XMLRPC开服务进行server/client通信

    本文讲一下怎样用python的xmlrpc开服务,进行server/client的通信. 应用场景:1)需多client訪问应用程序给予应答情况--网页服务.  2)数据极大,希望载入一次.后面仅仅用 ...

  6. ZOJ2599:Graduated Lexicographical Ordering(很经典的数位DP)

    Consider integer numbers from 1 to n. Let us call the sum of digits of an integer number its weight. ...

  7. HDOJ 题目2475 Box(link cut tree去点找祖先)

    Box Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. CentOS-6.4-DVD系统中安装Oracle-11.2.0.4

    完整版见https://jadyer.github.io/2014/05/18/centos-install-oracle/ /** * CentOS-6.4-DVD系统中安装Oracle-11.2. ...

  9. 配置hadoop集群一

    花了1天时间最终把环境搭建好了.整理了一下,希望对想学习hadoop的有所帮助. 资料下载:http://pan.baidu.com/s/1kTupgkn 包括了linux虚拟机.jdk, hadoo ...

  10. ios3--UIView的常见方法

    // // ViewController.m // 07-UIView的常见方法 // #import "ViewController.h" @interface ViewCont ...