千亿级IM独立开发指南!全球即时通讯全套代码4小时速成(一)

BitWanderlustPro
• 阅读 1544

本文2624字,预计阅读时长8-10分钟

引言

上周,和一投资大佬吃饭,闲谈间大佬聊到些趣事:说QQ当年想卖100万,结果被某老板嫌弃,说找上三个大学生,一个月便能做出一个来。结果没有卖成。我们听后哈哈一笑。大佬继续说:结果到现在过去20年了,BAT后面有了TMD,但是IM领域却没人能取代T。于是我们沉默了……
20年的时光流逝,QQ和微信依旧屹立不倒,依旧牢牢占据着即时通讯的大半江山。那岂不是这辈子就和企鹅🔒了?不是不是这块市场只能捡一捡边角料了?难道只能去抢那残羹冷炙?……
那怎么可能!大佬于是开启了嘴炮模式:QQ和微信只是在社交领域占据了大部分的市场,其他领域依旧没有摸到边。泛娱乐领域陌陌、探探、soul之类你说他们哪一个不是即时通讯?PVP、MMORPG网游里的聊天和工会系统,那一个不属于即时通讯?越来越多的游戏强调社交化,更别提元宇宙了,核心的基础就是递烟似的各类型聊天。所以啊,只要把即时通讯做好,需求会越来越多~
不对啊,大佬,做即时通讯的公司不少啊,那不是我们没有什么机会了吗?
咳、咳,你们觉得市面上那些号称向腾讯看齐,并发动则千亿的公司,那个像是有上千万日活的节奏?你只要在你们已有的基础上做一个类似的,做得好做得快,做得稳定,不愁没人愿意用。
不得不说,大佬就是大佬,直接套路了我们。
没想到,这是个套路一,让我们走上这条不归路。更没想到的是,套路二是个天坑。
按照节奏,接下来团队需要网上找找资料、看看教程,学习学习,涨涨经验。
打开百度/谷歌,搜索IM教程,打开链接,开始学习,然后,就没有然后了。网上的各种教程和指南,都是告诉你“三行代码一分钟接入”,可是,可是?可是……怎么看来看去,怎么看都像是产品的宣传,几个简单的页面效果展示,就告述你,一个新的APP这样就诞生了……
千亿级IM独立开发指南!全球即时通讯全套代码4小时速成(一)

用户注册?数据管理?UI间的交互与切换?……?
诞生了?你骗我!你骗我!!~~
哎,套路啊~~一切都是套路!!!

所以,我们痛定思痛,决定亲自趟一遍这天坑,把所谓的“加一点细节”完全反套路出来。于是,便有了这篇文章。
本系列文章将和各位读者一起,从零开始构建一个像样可用的即时通讯APP。本系列文章将包含所有全套代码、可构建的项目工程,以及流程设计与分析说明。
最终生成的APP,可参见下面的动画展示:

https://www.bilibili.com/vide...

目前所有代码已经更新到GitHub,项目地址:https://github.com/highras/rt...
全套代码(含服务器端)约4000余行,配合介绍解说,4小时内便可充分理解。
为了便于读者更易于理解,和方便作者介绍,全文一共分为四个章节,分别为:

一、功能设计与介绍(本文)
二、UI设计与搭建
三、App 内部流程与逻辑
四、服务端搭建与总结

一、功能设计

首先,一个完整的IM APP,从功能和外观上看,必须包含的模块如下:
    登陆
    注册
    联系人列表
    会话列表
    聊天窗口
    联系人信息展示

深入一下,其实会话还分成一对一会话,群组会话,和聊天室会话。也许有人会问,群组和聊天室有什么区别?其实区别很简单,群组就像公司,不论员工是否在办公室,该发的工资一定会发。这种关系是长期存在,而不论群组成员是在线还是离线。而聊天室就像一个直播间,离开了,主播还在说什么就和你没有关系了。聊天室其实就是一种临时性的组织,离开,或者用户下线,所属关系就不再存在。就好比一场MOBA,不论是王者荣耀还是LOL,提前离开的队友,将不再影响当前的战局。

那我们再进一步深入:用户需要管理,数据需要存储,用户和组织的信息还需要进行编辑。我们不希望自己幸幸苦苦运营的用户成为厂商平台的用户,所以我们需要有自己的用户注册和管理体系,而不是简单使用云厂商所提供的用户注册模块,不然就又回到了为别人打工的日子。这就要求我们必须要有自己的后端,而且尽可能的不要将用户的信息透露给平台厂商。此外我们还需要数据的存储,不论是后端用户信息的登记和存储,还是端APP聊天消息的存储。

所以整理一下,一个合格的IM至少需要具备以下模块:

APP 端(移动端):
    登录模块
    注册模块
    联系人列表
    会话列表
    聊天窗口
    联系人信息的展示与编辑
    本地数据存储

后端(服务端):
    用户管理与注册
    数据存储

之后,面对的问题就是,APP端如何与后端通讯?而这将引出一系列的问题:
用什么通讯协议?数据如何传输?二进制如何处理?网络切换如何处理?数据安全怎么实现?如果服务器被攻击了,该如何防御?……最后,如果某一天火了,高并发怎么实现?
后端细节纷繁芜杂,而且更多的是独立于IM的通用需求,诸如数据传输,信息安全,攻击防御,等等。因此,为了不偏离主题,我们在此简化服务端的处理,把它变成:

  1. 自己实现一个最简化的服务端,处理用户的注册和管理,坚决不把用户的信息透露给平台厂商;
  2. 采用云平台厂商提供的聊天服务,避免陷入不必要的细节,以及重复的非个性化开发。

因此,我们需要基于以下标准来选择云服务厂商:

  1. 能提供IM服务,有RTC服务更好;
  2. 不索取客户的用户信息;
  3. 有知名企业和知名项目背书;
  4. 能对抗网络攻击,遭受过大规模的网络攻击,且未失守的更好;
  5. 能处理高并发,有高并发客户案例的更好;
  6. 最后,最重要的:能长期免费使用!!!

于是,基于以上标准,我们选择了云上曲率IM即时通讯服务
首先,云上曲率的IM即时通讯服务包含了RTC的功能,支持文本、音频,以及视频的一对一聊天,群组聊天、聊天室(房间)聊天,以及广播消息。同时还支持消息推送、文本审核、语音、图像、视频的审核,以及24种语言的手动或者自动翻译。这对于IM软件无论是国内,还是推向国际,都是至关重要的必备功能。
其次,云上曲率的IM即时通讯服务还不索取客户的用户信息,仅要求有唯一id代表即可。
然后,2021年初,云上曲率的客户曾遭遇DDoS攻击,期间有每秒超过25GB的攻击流量持续打到云上曲率的即时通讯服务,连续持续了2天半,而云上曲率的所有IM即时通讯和实时信令客户均未收到任何影响。
此外,FunPlus(趣加),使用了云上曲率的实时信令和IM即时通讯业务,成就了《阿瓦隆之王》和《火枪纪元》在海外SLG品类上的连续霸榜,并以此奠定了游戏大厂和中国出海品牌榜第11名(2019年)的地位。其中因全面使用IM即时通讯服务和实时信令,曾创造了单项目日消息量240亿条的记录,因此相信云上曲率的高并发能力是经过大厂的项目实际验证过的。
最后,云上曲率对于即时通讯服务是按照消息量计费,100万条1美元,先用后付!先用后付!!当月使用不足100万条不计费!不计费!!这也就意味着,对于创业初期的小团队来说,如果每个月消息量均不足100万条,则可以长期持续免费使用!!!

基于以上的设计和选择,东风已到,万事皆备,那从下篇,我们就正式开始我们自己的IM系统开发!

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
NEO从源码分析看UTXO交易
_0x00前言_社区大佬:“交易是操作区块链的唯一方式。”_0x01交易类型_在NEO中,几乎除了共识之外的所有的对区块链的操作都是一种“交易”,甚至在“交易”面前,合约都只是一个小弟。交易类型的定义在Core中的TransactionType中:源码位置:neo/Core/TransactionType
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin