如何讓你的系統支持百萬併發-老闆主動給你加薪


如何讓你的系統支持百萬併發-老闆主動給你加薪

一、前言

大家都知道數據庫的操作、es操作、網絡請求等等,如果能合併處理能很大提高性能。但是客戶端請求是分散的,怎麼實現合併請求呢?

1、可以大批量的請求過來,能把相同請求做篩選,同樣的數據只查詢一次數據等。
2、大批量的數據過來,需要存儲,將數據合併一起,做個批量數據庫插入。

二、代碼

做個用戶詳細信息查詢的功能。需要查詢用戶的基本信息、評價信息、賬戶餘額、認證信息等。一般都是app進入我的,需要很多信息時候使用。

//getUserInfo的方法
public UserDetailInfo getUserInfo(Long userId) throws Exception {
UserDetailInfoRequest request = new UserDetailInfoRequest(userId);
CompletableFuture<userdetailinfo> completableFuture = new CompletableFuture<>();
request.completableFuture = completableFuture;
linkedBlockingQueues.add(request);
return completableFuture.get();
}

//定義一個隊列,用戶接受請求
LinkedBlockingQueue<userdetailinforequest> linkedBlockingQueues = new LinkedBlockingQueue();


//用於在隊列中傳遞請求數據
public class UserDetailInfoRequest {
public UserDetailInfoRequest(Long id) {
this.id = id;
}
Long id;
CompletableFuture<userdetailinfo> completableFuture;
}

//定義個調度器,定時執行
@PostConstruct
void init() {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
scheduledExecutorService.scheduleAtFixedRate(() -> {
int size = linkedBlockingQueues.size();
if (size > 0) {
try {
List<userdetailinforequest> operationLogs = new ArrayList<>();
HashMap<long> maps = new HashMap<>();
//遞歸查詢所有的請求
for (int i = 0; i < size; i++) {
UserDetailInfoRequest userInfoRequest = linkedBlockingQueues.poll();
operationLogs.add(userInfoRequest);
//合併請求,同樣的請求只處理一次
if (!maps.containsKey(userInfoRequest.id)) {
\t//查詢基本信息
//評價信息
//賬戶餘額
//認證信息等
maps.put(userInfoRequest.id, userInfoRequest.id);
}
}

System.out.println("operationLogs" + operationLogs.size());
System.out.println("maps" + maps.size());
//再將結果返回
for (UserDetailInfoRequest request : operationLogs) {
Long map = maps.get(request.id);
request.completableFuture.complete(UserDetailInfo.builder().name("").build());
}
} catch (Exception ex) {
System.out.println(ex.toString());

}
}
}, 0, 50, TimeUnit.MILLISECONDS);
}
/<long>/<userdetailinforequest>/<userdetailinfo>/<userdetailinforequest>/<userdetailinfo>

需要掌握的知識點是CompletableFuture。用於線程間傳遞數據

三、運行結果

如何讓你的系統支持百萬併發-老闆主動給你加薪

如果併發很高的情況下,可以合併很多請求,節約資源。不過如果請求本身就沒有幾個,完成沒必要浪費時間。

四、源碼

https://github.com/wu-gl/springboot.git


分享到:


相關文章: