当前位置:网站首页>压力测试修改解决方案
压力测试修改解决方案
2022-07-02 06:17:00 【Dairyzz】
原:
介绍
该项目是xxl-job下的一个定时任务 自己独占一个执行器 所以可以按照一个节点进行启用 独占一个端口
该项目的java包配置:
jdk8
内存大小:2GB
不采用第三方缓存和消息处理软件 纯原生
业务内容:接受外汇的报文,解析报文,判断报文类型,对需要处理的报文的主键进行判断,如果数据库中由则更新,如果数据库中没有则插入 (报文主键的数量少,以更新为主,插入的操作可以忽略不计)
处理方式:采用的LinkedBlockingQueue 将接受到的报文全部塞到队列里
然后另起一个线程处理队列信息 然后判断报文是否处理再进行数据库操作
压力测试下情况:
压力测试时间为一小时数据量为百万,需要处理的数据量在5w左右
压力测试10分钟不到 队列内存超过2G 直接堆栈爆满
PLAN1
处理方式:在塞入队列前进行报文的判断处理,是需要处理的报文才加入阻塞队列中
压力测试下情况:
比原来的方式平缓一点,但20分钟左右堆栈爆掉了了,查看日志发现队列一秒内插入了 100条需处理的数据,但一秒钟只处理10条数据,处理速度远远跟不上。
PLAN2
处理方式:将报文放入内存中,创建一个管理的类,接受报文的线程线程调用这个管理的类将报文塞入对应的map中,处理报文的线程调用这个管理的类将需要更新的数据取出进行更新。
这样处理的原因:内存中的处理速度比查询数据库判断是否要处理的速度快,很多报文对应的主键是同一个对于数据库的操作更多的是更新,不会挤压堆栈
处理步骤:
- 创建一个报文类兼容所有报文的字段(取所有报文的并集)和一个是否更新字段
- 创建一个管理类 管理类中有一个私有的map key为主键 value为报文类 管理类中有一个添加方法,将接受到的报文更新字段设为true,然后放入map中, 管理类中还有一个获取需要更新报文队列的方法,先new一个阻塞队列对map进行遍历将更新字段为true的报文类更新字段设为false然后放入阻塞队列中,最后返回阻塞队列
- 接收报文的线程调用添加方法 处理报文的线程调用获取更新报文队列的方法,处理队列中的数据
因为这两个方法类似写和读的操作,所以两个方法上都要加上锁
管理类的写法:
private HashMap<String, BankQuoteNode> quoteMap = new HashMap<>();//k是自己的主键
@Override
public synchronized void addQuote(BankQuoteNode node) {
node.setUpdateFlag(true);
StringBuilder key = new StringBuilder();
key.append(node.getMarketInicator()).append('-').append(node.getSecurityCode()).append('-').append(node
.getSecurityName());
String quoteMapKey=key.toString();
quoteMap.put(quoteMapKey,node);
}
@Override
public synchronized Queue<BankQuoteNode> getAllQuote() {
LinkedBlockingQueue<BankQuoteNode> quoteQueue =new LinkedBlockingQueue<>();
quoteMap.forEach((k,v)->{
quoteQueue.add(v);
});
return quoteQueue;//返回所有
}
@Override
public synchronized Queue<BankQuoteNode> getRefreshedQuote() {
LinkedBlockingQueue<BankQuoteNode> refreshedQuoteQueue = new LinkedBlockingQueue<>();
//遍历quoteMap
//把UpdateFlag=true的node插入返回的队列
quoteMap.forEach((k,v)->{
if(v.isUpdateFlag()){
quoteMap.get(k).setUpdateFlag(false);
refreshedQuoteQueue.add(v);
}
});
return refreshedQuoteQueue;
}
边栏推荐
- New version of dedecms collection and release plug-in tutorial tool
- Arduino Wire 库使用
- Data science [viii]: SVD (I)
- On Web server
- 来自读者们的 I/O 观后感|有奖征集获奖名单
- 队列(线性结构)
- CUDA中的异步数据拷贝
- 日志(常用的日志框架)
- In depth understanding of JUC concurrency (II) concurrency theory
- Pbootcms collection and warehousing tutorial quick collection release
猜你喜欢

Frequently asked questions about jetpack compose and material you

CUDA中的Warp Shuffle

日志(常用的日志框架)

Current situation analysis of Devops and noops

Reading classic literature -- Suma++

穀歌出海創業加速器報名倒計時 3 天,創業人闖關指南提前收藏!

栈(线性结构)

日期时间API详解

Pbootcms collection and warehousing tutorial quick collection release

Summary of WLAN related knowledge points
随机推荐
CUDA中的Warp Shuffle
Replace Django database with MySQL (attributeerror: 'STR' object has no attribute 'decode')
CUDA用户对象
线性dp(拆分篇)
分布式事务 :可靠消息最终一致性方案
It is said that Kwai will pay for the Tiktok super fast version of the video? How can you miss this opportunity to collect wool?
亚马逊aws数据湖工作之坑1
Lucene Basics
Generic classes and parameterized classes of SystemVerilog
加密压缩文件解密技巧
Ros2 --- lifecycle node summary
Contest3147 - game 38 of 2021 Freshmen's personal training match_ G: Flower bed
深入了解JUC并发(一)什么是JUC
Data science [viii]: SVD (I)
Sumo tutorial Hello World
Spark overview
数据科学【九】:SVD(二)
VLAN experiment of switching technology
Codeforces Round #797 (Div. 3) A—E
Detailed explanation of BGP message