1. 问题分析
http://aida.zhcxkj.com/instant/sales/ad
虎鲸-及时销量首页 广告费加载数据慢:
获取广告费方法--执行步骤:
1. 获取skulist,ordersourcelist 集合,需5-10秒
2. 获取广告费:根据查询时间段从skulist,ordersourcelist
里计算广告费用GetCampFree(), 循环skulist20万记录,每次5000计算广告费,串行需40次计算完成:40*1.5=60秒
3. 根据2的结果集做业务处理:币种转换,费率计算,广告费量计算等,3秒
2. 解决方案:
优化建议:
根据分析发现执行步骤的第2步慢, 将第2步由单线程改为多线程
优化后测试结果对比:速度提升了10倍 -20倍
st
"st01获取数据豪秒=8521;st02单线程豪秒=150023;st03多线程豪秒=7315;
st04数据处理时间豪秒=3767"
adresultList.Count
9810
adresultList2.Count
9810
--------------------------------------------------------------
st
"st01获取数据豪秒=2913;st02单线程豪秒=30589;st03多线程豪秒=3420;
st04数据处理时间豪秒=2899"
adresultList.Count //单线程返回结果集
9810
adresultList2.Count //多线程返回结果集
9810
2. 解决方案:多线程
第2步骤:获取广告费改为多线程:
//获取广告费 多线程
public List<AdvertResult> GetCampFeeTask(int customerId, List<string> OrderSourceSKU, List<int> OrderSourceIDs, DateTime start, DateTime end)
{
List<Task> taskList = new List<Task>();
var cpcApiModel = _cpcApiOption.Value;
var result = new List<AdvertResult>();
if (!OrderSourceSKU.Any())
return result;
int pageSize = 5000;
//var list = new List<AdvertResult>();
for (int i = 0; i*5000 <= OrderSourceSKU.Count; i++)
{
try
{
if (taskList.Count(t => t.Status != TaskStatus.RanToCompletion) >= 20)
{
Task.WaitAny(taskList.ToArray());
taskList = taskList.Where(t => t.Status != TaskStatus.RanToCompletion).ToList();
}
int k = i;
int skipNum = k * pageSize;
taskList.Add(Task.Run(() =>
{
try
{
var ordersourSkus = OrderSourceSKU.Skip(skipNum).Take(pageSize).ToList();
if (ordersourSkus.Any())
{
string jsonData = "{"language": "zh_CN","input": {"CustomerId": " + customerId + ","OrderSourceIds":[" + string.Join(",", OrderSourceIDs) + "],"skus":[" + string.Join(",", ordersourSkus.Select(w => """ + w + """)) + "],"beginTime": "" + start + "","endTime": "" + end + ""}}";
var list = CommonCPCRequest<AdvertResult>(jsonData, "api/campaigns/productad/searchsummariesbysku", customerId == 1 ? cpcApiModel.BaseUrl158 : cpcApiModel.BaseUrl);
lock (LockSku)
{
if (list.Count > 0)
{
result = result.Union(list).ToList();
}
}
}
}
catch(Exception ex)
{
//process error
}
}));
}
catch (Exception ex)
{
_logger.LogError($"即时销量请求广告系统错误:{customerId},{ex.Message}{ex.StackTrace}");
}
}
Task.WaitAll(taskList.ToArray());
return result;
}
3.原方案:
单线程
/// <summary>
/// 获取广告费 单线程
/// </summary>
/// <returns></returns>
public List<AdvertResult> GetCampFee(int customerId, List<string> OrderSourceSKU, List<int> OrderSourceIDs, DateTime start, DateTime end)
{
var cpcApiModel = _cpcApiOption.Value;
var result= new List<AdvertResult>();
if (!OrderSourceSKU.Any())
return result;
int pageIndex = 0;
int pageSize = 5000;
do
{
try
{
var ordersourSkus = OrderSourceSKU.Skip(pageIndex * pageSize).Take(pageSize).ToList();
if (ordersourSkus.Any())
{
string jsonData = "{"language": "zh_CN","input": {"CustomerId": " + customerId + ","OrderSourceIds":[" + string.Join(",", OrderSourceIDs) + "],"skus":[" + string.Join(",", ordersourSkus.Select(w => """ + w + """)) + "],"beginTime": "" + start + "","endTime": "" + end + ""}}";
var list = CommonCPCRequest<AdvertResult>(jsonData, "api/campaigns/productad/searchsummariesbysku", customerId == 1 ? cpcApiModel.BaseUrl158 : cpcApiModel.BaseUrl);
//result = result.Union(list).ToList();
if (list.Count > 0)
{
result = result.Union(list).ToList();
}
}
}
catch (Exception e)
{
_logger.LogError($"即时销量请求广告系统错误:{customerId},{e.Message}{e.StackTrace}");
}
pageIndex++;
} while (OrderSourceSKU.Count >= pageIndex * pageSize);
return result;
}



*postman 测试参数
https://localhost:44376/instant/Sales/ad
token:
post input 参数
{
"input":
{"batchQuery":"asin",
"currency":"usd",
"start":"2022-06-23 00:00:00",
"end":"2022-06-23 23:59:59",
"customerId":1,
"userId":421
}
,"language":"zh_CN"
}