程序员过关斩将--从每秒6000写请求谈起
作者丨菜v菜来源丨架构师修行之路
菜菜哥,紧急求助呀


怎么回事?产品经理砍你了?


没有,只是写了个新项目,上线就被压垮了


什么功能,这么强悍?


一个记录用户观看视频进度信息的功能


那如果用户基数大,确实是需要注意的,那我给你分析一下哈





那么在只有两个网站服务器,一台sqlserver的情况下,该如何面对这样不算大数据量的写请求呢?为什么说是写请求呢?因为用户观看视频的每一秒你都需要记录下来,例如:视频的第十秒用户观看了。要想把这个功能搞定,首先需要定义几个事情:1. 记录用户观看视频情况的数据定义2. 和客户端交互的数据协议3. 数据库中记录的数据格式4. 如何解决服务器写的压力(毕竟单台服务器请求数还是比较大)

用户观看视频进度定义

第一字节 第二字节
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
bit: 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
二进制: 0x88 0x40
字符串: 8840
和客户端交互协议

数据库数据格式


cpu性能问题

//需要新加的数据
ConcurrentQueue AddQueue = new ConcurrentQueue();
//把16进制的字符串按照两位 分割成十进制数组
protected List<int> ConvertToProgressArray(string progressString)
{
if (string.IsNullOrWhiteSpace(progressString))
{
return null;
}
//验证是否为2的倍数长度
if (progressString.Length % 2 != 0)
{
return null;
}
var proStrSpan = progressString.AsSpan();
List<int> ret = new List<int>();
int i = 0;
while (i < proStrSpan.Length)
{
ret.Add(int.Parse(proStrSpan.Slice(i, 2).ToString(), System.Globalization.NumberStyles.HexNumber)); ;
i = i + 2;
}
return ret;
}
客户端请求数量问题

数据库压力

由于数据量的问题,所有的更新操作都会发送到一个任务队列,队列的执行者会根据配置批量更新数据库,这样比单条更新数据库性能要高很多,其实这种方案在很多log型的业务中都有使用,批量更新对数据库的压力要小很多,代码类似以下
public async Task<int> AddUserVideoData(UserVideoInfo data, DBProcessEnum processType = DBProcessEnum.Update)
{
if(processType== DBProcessEnum.Add)
{
AddQueue.Enqueue(data);
}
return 1;
}
void MulProcessData()
{
//每次更新的条数
int maxNumber = 50;
List data = new List();
while (true)
{
if (data == null)
{
data = new List();
}
try
{
if (!AddQueue.Any() && !UpdateQueue.Any())
{
System.Threading.Thread.Sleep(500);
}
else
{
//先处理 需要更新的
data.Clear();
while (data.Count <= maxNumber && AddQueue.Any())
{
if (!AddQueue.TryDequeue(out UserVideoInfo value))
{
continue;
}
//判断是否有重复对象
if (data.Any(s => s.UserId == value.UserId && s.VideoId == value.VideoId))
{
var exsitItem = data.First(s => s.UserId == value.UserId && s.VideoId == value.VideoId);
exsitItem = value;
}
else
{
data.Add(value);
}
}
if (data != null && data.Any())
{
var ret = UserVideoProgressProxy.Add(data);
}
}
}
catch (Exception err)
{
}
}
}


近期精彩内容推荐:

在看点这里好文分享给更多人↓↓
评论