2018.3-2019.6 工作总结
服务端工作:
1. 文件上传模块FileServer。有状态的,会有本地缓存。
线程分片处理。同一个资源的请求,必定分配到同一个线程中,避免了线程的加锁。
Java实现Promise的实现。对于RocksDB本地缓存没有此文件的情况,如果有多个请求同时到达,加入到Pending等到队列中,只有第一个请求引起的操作才会去请求数据库。
使用mysql存储文件索引。用来标记每个文件存储在哪台mongoDb服务器上。
自己实现的RpcClient。 基于长链接,记录ReqId,超时机制。
2. 文件上传模块FileGate。无状态的,客户端可以任意连接
上传过程:
通过FileGate对上传请求做分片路由到FileServer中。保证同一个文件到多个分片能够落盘在同一个FileServer中。
考虑到用户可能取消文件发送到情况。所以不能直接将文件分片直接传入文件服务器。
下载过程:
因为FileServer会有本地RocksDB缓存,所以通过FileGate路由,可以提高缓存命中率。
3. Spring Cloud系统的搭建
客户端H5页面请求。客户端打开H5页面时候,在URL上拼接jwtToken。页面会将它写到自己本地的Cookie中。同时,对于有权限的请求,为了防止CSRF攻击,后续的Ajax请求,需要携带CsrfToken
使用zuul实现restapi gate 拦截所有请求,解开jwtToken,还原成用户信息。
使用长连接JwtToken生产者。JwtToken使用非对称加密。使用私钥签名,公钥验证签名。JwtToken中不存储敏感数据,只明文存储UID信息。
使用eurake实现服务的注册和发现。
4. 服务端架构
Access -- 随机连接上来。Netty qps 5000
Session -- (uid,access_server_id,connection_id) 使用UID做分片,一致性哈希算法
P2PChatServer -- 使用from_uid,to_uid做分片。
OffMsgServer -- 离线消息服务。
GroupServer -- 使用group_id做分片。
HistoryMsgServer -- 历史消息服务器 。存储到MySQL
FileGate -- 随机连接上来。
FileServer -- 使用 storage_file_id 或 client_file_id 做分片
消息发送前,客户端生成一个client_msg_id . 发送到服务器后,服务端返回一个 storage_msg_id
前端工作:
WebIM
WebSocket,Protobuf,React,Redux,高阶组件,DH密钥交换算法,
emoji 表情库 , 文本输入框contentEditable, 头像编辑框。
ECC 加密算法