提米
自我介绍
项目介绍
消息架构
参考链接:https://blog.csdn.net/hellojackjiang2011/article/details/114843409
https://zhuanlan.zhihu.com/p/391112843
https://blog.csdn.net/weixin_35860326/article/details/119403153
消息特性:
实时性、可靠性(不丢失、不重复)、一致性(单聊、群聊、多端同步)、安全性(数据传输、数据存储、消息内容)
消息架构层
客户端client:
message.fe:业务逻辑 (长链接socket、产品规则、安全校验、IM)
message.base:核心逻辑(无业务、无第三方调用接口、私信的发送和列表获取采用推拉结合方式)
消息存储:mysql+redis
消息发送流程:
api.send——>message.fe——>message.base——>redis——mysql
具体细节:
新消息同步:
客户端更新属于增量更新,依赖更新队列,更新对列按照版本号verison_id进行排序
这里不用msg_id的原因为执行撤回、删除等操作时,消息唯一,msgid不变,version_id进行自增,根据version_id进行增量同步
历史消息:
如果本地没有历史消息时,请求会通过本地最后一个msg_id服务端2级缓存(如果设置2级缓存的话)和DB中直接进行查找。
消息推送:(多端同步、免打扰、小红点、已读未读消息变更)
数量大:kafka做削峰
ios客户端:苹果apns推送+长连接
安卓客户端 :各家手机系统厂商推送+极光推送+长连接
发消息步骤:收到一个消息后,通过rpc或者mq来进行对接推送到业务模块。
session维护:
是标识“哪个用户在哪个TCP连接”,用于后续的消息推送能够知道,如何找到接收人对应的连接来发送。
存储服务:
服务端可以只是维护一个用于暂存消息和信令的离线buffer,至于存多久和产品需求以及监管需求相关。
即时消息可以放到MQ中,或者缓存中,使用数据抽取工具周期性的将数据提交服务器,进行持久化。
服务器存储历史数据和近实时的数据。其实就是通过 MQ来异步化解耦消息存储逻辑。
存储服务按数据的热度进行了分级和区别对待。具体是:
-
- 1)短期消息(7天):存储在Redis里;
- 2)近期消息(1-3个月):存储在Mysql里,以备用户实时查询;
- 3)历史信息:存储在HBase里,作为历史数据慢查询。
多端同步:同一用户的多端,希望发送给这个用户的消息在多台设备上也能保持一致性。
多端同步的。 收到消息一般先落db,然后写离线buffer。db全量,buffer定长或者按时间过期。
redis和pika一般比较适合做离线buffer,mysql和hbase一般用于消息的db存储。
session带时间戳、对应保存最近读取时间
数据安全
通信安全:
-
-
-
- 1)socket长连接服务:技术上也就是多数人耳熟能详的网络通信这一块,再细化一点也就是tcp、udp协议这一块;
- 2)http短连接服务:也就是最常用的http rest接口那些
-
-
内容安全:
-
-
-
- 加密:防止坏人获取你的数据。
- 认证:防止坏人修改了你的数据而你却并没有发现。
- 鉴权:防止坏人假冒你的身份
-
-
3、长链接、短连接
长链接:TCP实现,client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。
优点:
-
-
- 1)实时性:长连接是双向的通道,对消息的推送也是比较实时;
- 2)有状态:长连接本身维护用户的状态,通过KeepAlive方式,确定用户是否在线;
- 3)省流程:长连接比较省流量,可以做一些用户自定义的数据压缩,本身也可以省不少的归属包和连接包,所以说比较省流量;
- 4)更省电:减少网络流量之后,能够进一步降低移动客户端的耗电。
-
短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。
5、数据库操作
查看应援团状态(解散)
查看用户权限(是否可创建应援团、发送消息权限、白名单)
查看消息是否入库(发送显示成功对方收不到、查询敏感词信息)
6、日志查询
公司内部平台,根据服务器名称、对应接口关键字、对应时间节点(15min、1h、7day)
查看报错信息,对应截图和日志信息给对应开发
部分业务无法复现,找对应日志
10、批量私信、全站消息、撤回、定时等处理机制
13、微信测试:
https://blog.csdn.net/xun_zhao_t521/article/details/119971322
https://www.cnblogs.com/jiliangceshi/p/12752461.html
https://blog.csdn.net/qq_45661125/article/details/120535162
网络基础
RPC、HTTP、微服务:https://blog.csdn.net/huang_yx/article/details/107851726?
RPC
1、什么是RPC:远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
2、原理:
时序图
3、解决了什么问题?
让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。
4、框架 GRPC
gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务
RESTful:https://www.cnblogs.com/zhangruifeng/p/13257731.html
抓包charles
实现原理:https://blog.csdn.net/weixin_42600398/article/details/119320230
总结:
简单来说,就是Charles作为“中间人代理”,拿到了服务器证书公钥和HTTPS连接的对称密钥,
前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。
2、mock数据,
接口测试postman
1、怎么测接口
2、全局、接口关联、
数据库
Redis 链接:https://blog.51cto.com/u_15057832/4327089
MySQL
配置相关
1. 连接服务端的命令 mysql -uroot -p 2. 退出 exit 3. 查看当前具体进程 tasklist tasklist |findstr mysqld 4. 杀死具体进程(只有在管理员cmd窗口下才能成功) taskkill /F /PID PID号 5. 设置密码 mysqladmin -uroot -p原密码 password 新密码 6. 破解密码 # 1 先关闭当前mysql服务端 命令行的方式启动(让mysql跳过用户名密码验证功能) mysqld --skip-grant-tables # 2 直接以无密码的方式连接 mysql -uroot -p 直接回车 # 3 修改当前用户的密码 update mysql.user set password=password(123456) where user='root' and host='localhost'; # 4 立刻将修改数据刷到硬盘 flush privileges; # 5 关闭当前服务端 然后以正常校验授权表的形式启动
数据库相关命令:https://www.cnblogs.com/LYPZX/p/14318027.html
1、增加数据(insert into) 语法:INSERT INTO 表名 VALUES (‘表字段名1’,‘表字段名2’,.....); 2、删除数据(delete 和 truncate) 语法:DELETE FROM 表名 WHERE 字段名 = 值 语法:truncate 表名 (删表数据) 语法:drop 表1名,表2名,...; (删表) 3、修改数据(update) 语法:update 表名 set 字段名=值 4、查询数据 语法:SELECT 字段名1,字段名2,... FROM 表名