我的IM服务开发之路-叩开混沌之门
IM,Instant messaging的缩写,翻译为中文就是即时通讯。例如QQ,微信等都是即时通讯领域的软件。俗称聊天软件
最近有个想法,对于我两年的IM开发经历做个简要的总结,本着学习和交流的心态,分几个篇幅写出一些自己对于分布式IM系统的理解,期望能收到大牛的指正和意见。本系列文章所说的IM都是指在分布式环境下的IM系统。
单就分布式系统,就已经有很深很深的水了,这里会较多地涉及到分布式系统下的内容,正好伴随着IM的业务进行自我回顾。
自己对IM的特性做个非官方的总结:
1. 即时性。从字面意思不难理解,IM对于即时性的要求比较高,需要实时地收到对方发来的消息。
2. 可交互。消息双方的用户需要能够对消息作出回应,即进行交互,互动。如果发出一片文字过来却不能与之进行交互,也算不得IM。
3. 高度依赖网络。在断网的情况下也不能进行通畅的IM交互。
4. 基于可视化或者是可感知的信息。比如文字,图片,语音,文件,表情。这些都是基于眼睛或者耳朵能感知到的。你不能在网上传递一个温暖的怀抱给对方吧?或者说你不能通过IM给对方一巴掌吧?也不能把香味传过去给对方。(或者这些也可以是IM的一个发展方向,哈哈,反水好快。。。)
5. 不安全性。基于网络的交互,都是不安全的,任何系统都有被攻破的可能性。别人给你发的一串文字,可能是经过中间人修改过的。
6. 虚拟。网络都是虚拟的。所以对于网络上的消息,我们应该有基本的辨别能力,不能轻易相信网上的信息。例子就不举了,网络诈骗多了去了。
7. 必须是两个端及以上进行聊天。可以是单人之间的聊天,也可以是一群人之间的聊天。当然,你也可以自己和自己聊天。
8. 传播扩散快。既然是即时通讯,其信息扩散的能力是很快的,可以一个传一个,也可以是病毒式分裂扩散。
IM系统对于技术上有如下几点要求:
1. 如何保证信息即时地成功投递给对方,消息不丢失,不重复;
2. 如何保证信息的顺序到达;
3. 如何保证信息中途不会被篡改;
4. 如何保证消息在收发双方展示一致;
5. 如何保证给用户省电省流量;
6. 如何保证IM系统的数据一致性;
7. 如何保证IM系统的可用性;
8. 如何保证IM系统的分区容忍;
9. CAP不可能同时满足,系统设计中如何做取舍;
10. 如何应对消息风暴引起的网络波动;
11. 如何避免或减少系统的消息风暴;
12. 在没有全局时钟的情况下如何保证有序;
若想在IM系统开发中游刃有余,需要熟练get如下技能:
1. TCP/IP协议,HTTP协议;
2. Linux功底:shell命令,linux操作系统的特性及脾气,Linux下的常用开发接口;
3. 分布式系统原理;
4. 一种服务端开发语言:C/C++/Java/Nodejs/Golang/PHP and so on;
5. 字符编码,不同进制之间的转换;
6. 加密、压缩技术;
7. 存储:mysql,nosql,以及不同存储介质下存储系统性能的发挥程度;
8. 如何优雅地与android,iOS,win,mac,web,运维之间进行“撕逼”;
本篇文章仅仅是罗列了几个点,提出了几个问题。问题都是我在开发过程中遇到或思考的一些问题,很多细节地方深入探究非常有意思,往往每个决定感觉都是在和哲学做对抗。
![](https://img.haomeiwen.com/i3505761/252e8f1db8518c93.jpg)