每一行的数据值允许 update 一次,百万级测试数据。
上次聊到如何对单行多次 update 进行压测,主要是为了解决单线程中请求参数如何每次都跟上次不一样这个难点。
本文讲的是多行单次 update 进行压测,就是大量数据需要在压测过程中 update,但是每条数据只能 update 一次,在请求参数中必需保证,所有线程的请求参数必需都不一样,而且得跟已有的数据保持一致。
这里用到了之前讲到的线程安全的只是,思路如下:构建一个线程安全的队列,在压测前把数据读到这个队列中,然后压测开始后每次请求都先从这个队列中取参数。
还有一个思路,在压测前为每一个线程构建一个的队列(互不相同),这里可以非安全,压测过程中每一个线程从自己的队列中读取参数。
伪代码如下:
Queue q = Date.init();
//某一个线程开始循环开始
doRequest(q.take());//需要控制q的大小,也可以再新启线程不断往q添加数据
//单线程执行完成
其中,从队列中取值的方法根据用例设计不同而不同,也可以用 poll(),防止阻塞。
分享一下我的代码:
public static LinkedBlockingQueue<String> msgs = addmsg();
public static LinkedBlockingQueue<String> addmsg() {
String absolutePath = new File("").getAbsolutePath();
List<String> strings = WriteRead.readTxtFileByLine(absolutePath + "/queue");
LinkedBlockingQueue<String> ss = new LinkedBlockingQueue<>();
ss.addAll(strings);
logger.info("重新读取队列值");
return ss;
}
public int deleteQ() throws InterruptedException {
if (msgs.size() == 0) {
logger.info("队列为空了");
msgs = addmsg();
}
String absolutePath = new File("").getAbsolutePath();
List<String> strings = WriteRead.readTxtFileByLine(absolutePath + "/dubbo");
new Concurrent(new ThreadBase(SourceCode.changeStringToInt(strings.get(0))) {
@Override
protected void before() {
}
@Override
protected void doing() throws Exception {
String msg = msgs.poll(100, TimeUnit.MILLISECONDS);
logger.info("msg:{}", msg);
DeleteQueueRequest deleteQueueRequest0 = new DeleteQueueRequest();
deleteQueueRequest0.setMsg(msg);
deleteQueueRequest0.setTaskTypeEnum(TaskTypeEnum.PUBLISH_PROMU);
CommonResponse<String> queue3 = commonDelayQueueService.deleteQueue(deleteQueueRequest0);
logger.info("deleteQueue2 {}", JsonUtil.obj2Json(queue3));
}
@Override
protected void after() {
}
}, SourceCode.changeStringToInt(strings.get(1))).start();
return 0;
}
这里分享了第一种思路的实现,由于测试数据数量巨大,所以不担心发生阻塞或者拿不到对象的情况。