我的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,运维之间进行“撕逼”;


本篇文章仅仅是罗列了几个点,提出了几个问题。问题都是我在开发过程中遇到或思考的一些问题,很多细节地方深入探究非常有意思,往往每个决定感觉都是在和哲学做对抗。


我的IM服务开发之路-叩开混沌之门_第1张图片
分布式系统的cap

你可能感兴趣的:(我的IM服务开发之路-叩开混沌之门)