即时通讯技术应用非常广泛,涉及教育、电商、金融、泛娱乐、生活服务、医疗健康、
政企服务、游戏聊天、在线客服等等行业,以下以部分典型应用作为简介。
(一)教育 (二)电商 (三)金融 (四)泛娱乐
(五)招聘 (六)医疗健康 (七)政企服务 (八)游戏类产品
提供:即时通讯、用户点对点聊天、主播互动、实时弹幕、
实时监控、远程控制、多人互动、位置共享
容联
融云
环信 http api
网易云信
QQ通讯
详细对比:https://blog.csdn.net/weixin_33739646/article/details/
每天发信息不过 10000 条
大部分场景下自研成本比使用第三方的高
自研的优势:可控
客户端与服务器端进行网络通信、收发消息
连接层为客户端收发消息提供出入口。主
要的任务:保持海量用户连接;解析协议,
对传输内容进行编码;维护session;推送
消息。
核心业务层负责IM系统各项功能的核心逻
辑实现。
数据层负责IM系统相关数据的持久化存储,
包括消息内容、账号信息等。
即时通讯系统常用分层架构
接入层:entry/gate
逻辑层:logic
数据层:data
路由层:route
接入层的作用:
◼ 连接整流
◼ 通信安全
◼ 报文解压缩
◼ 初步防攻击
1. 用户逻辑 :用户登录、用户退出、用户信息查询、用户更新签
名、用户分组创建等
2. 好友逻辑 :添加好友、删除好友、拉取好友列表、好友添加备
注等
3. 群组逻辑 :创建群、加入群、删除群、删除成员等
4. 消息逻辑 :单聊文字消息、单聊语音消息、群聊文字消息、群
聊语音消息、拉取离线消息等
5. 其他 ,比如文件传输、图片传输等
1. 对上游屏蔽存储引擎
2. 对上游屏蔽cache层
3. 对上游提供友好接口
为什么学习Teamtalk:
◼ CloudTalk 基于Teamtalk进行二次开发
◼ xx公司基于Teamtalk进行二次开发
实时性
http
socket
websocket
数据库
数据库表设计
分表设计
密码存储方式
最近会话表
未读消息如何体现
聊天消息分表问题
单聊消息发送流程
怎么保证数据的不丢失
消息序号在哪里生成
消息序号生成方式
消息如何封装
消息发送时的seq有什么作用
消息发送后服务器怎么应答?
接收端收到数据后如何应答
客户端的单聊消息未读计数是怎么实现的
服务器怎么保留消息未读计数
客户端的未读消息计数从何而来
客户端未读消息计数清 0 时向服务器发送了什么,服务器
又是怎么清除未读消息计数
文件传输原理
文件传输分为在线传输离线传输
在线传输和离线传输有什么区别
群聊消息
如何推送群聊
群消息计数器
群会话如何更新(每有一个人发送消
息,则其他人都需要更新会话消息)
群成员管理
如何创建群
如何删除群
怎么使用redis管理群成员
MySQL连接池设计
为什么使用连接池
连接池设置多大合适?
redis连接池设计
为什么使用连接池
连接池设置多大合适?
并发能力
如何做到百万并发
如何做到千万并发
1.保证redis正常运行;
2.保证mysql正常运行;
3.保证php正常运行;
4.保证nginx正常运行;
5.保证php正常运行,这里的php主要是web管理平台的使用;
6.protobuf版本库目前server端是2.0的版本,Android_av使用了3.0的版
本
7.web服务器需要nginx支持;
8.服务不启动的时候主要查看log是否正常。
loginserver.conf负载均衡服务
HttpPort:对应提供HTTP服务的端口,默认 8080
MsgServerPort:msg服务器上报监听的端口,默认 8100
msgserver.conf 消息服务
ListenPort:连接msg服务器需要的端口
LoginServerIP1:上报msg服务器负载的地址
LoginServerPort1:上报msg服务器负载的端口
RouteServerIP1:route服务器地址和端口
RouteServerPort1:
PushServerIP1:push推送服务器地址和端口
PushServerPort1:
FileServerIP1:文件传输服务器地址和端口
IpAddr1:对外提供的往外ip,需要上报给login 服务器
dbproxyserver.con 数据库中间件服务
ListenPort:该服务监听的端口
ThreadNum:线程池线程数量
DBInstances=teamtalk_master,teamtalk_slave配置数据库实例
#teamtalk_master
teamtalk_master_host=127.0.0.1 数据库ip
teamtalk_master_port=3306 数据库端口
teamtalk_master_dbname=teamtalk 数据库名字
teamtalk_master_username=root 用户名
teamtalk_master_password=123456 密码
teamtalk_master_maxconncnt=16 连接池最大连接数量
#未读消息计数器的redis
unread_host=127.0.0.1 redis地址
unread_port=6379 redis端口
unread_db=1 db索引
unread_maxconncnt=16 连接池最大连接数量
routeserver.conf 路由服务
ListenIP=0.0.0.0 该服务监听ip
ListenMsgPort=8200 该服务监听端口
fileserver.conf文件传输服务
ClientListenIP=0.0.0.0 该服务监听的地址
ClientListenPort=8600 该服务监听的端口,
供msg server连接
httpmsgserver.conf HTTP reset api服务
ListenPort=8400 该服务监听
ConcurrentDBConnCnt=4 db_proxy服务连接通道数量
DBServerIP1=127.0.0.1 db_proxy服务地址
DBServerPort1=10600
DBServerIP2=127.0.0.1
DBServerPort2=10600
RouteServerIP1=localhost route路由服务地址
RouteServerPort1=8200
msfs.conf 文件存储服务
ListenIP=0.0.0.0 #可以监听多个IP,用;分割
ListenPort=8700 该服务端口
BaseDir=./tmp 存储地址
FileCnt=0 最大文件数量
FilesPerDir=30000 每个目录最大存储文件
GetThreadCount=32 下载线程
PostThreadCount=1 上传线程
pushserver.conf 推送服务
ListenIP=127.0.0.1
ListenPort=8500 该服务监听端口
CertPath=apns-dev-cert.pem
KeyPath=apns-dev-key.pem
KeyPassword=tt@mogujie
#SandBox
#1: sandbox 0: production
SandBox=0