异步编排与SQL优化
问题复现(9.5s)
当游客到某个景点后,会去查询景点,食物,购物商城等信息
long start = System.currentTimeMillis();
List<OutBaseProductInfoVo> scenicList = productCoordinateService.getScenicList(nearbyVoParams);
List<OutBaseProductInfoVo> accommodationList = productCoordinateService.getAccommodationList(nearbyVoParams);
List<OutBaseProductInfoVo> foodList = productCoordinateService.getFoodList(nearbyVoParams);
List<OutBaseProductInfoVo> shoppingList = productCoordinateService.getShoppingList(nearbyVoParams);
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
SQL执行记录:
整体的执行时间:
这里不做SQL的排查,只做任务的处理,我们可以看到这里的任务之间没有关系,因此可以考虑
异步编排-整体优化(6s)
long start = System.currentTimeMillis();
CompletableFuture<List<OutBaseProductInfoVo>> scenicFuture = CompletableFuture.supplyAsync(() -> productCoordinateService.getScenicList(nearbyVoParams));
CompletableFuture<List<OutBaseProductInfoVo>> accommodationFuture = CompletableFuture.supplyAsync(() -> productCoordinateService.getAccommodationList(nearbyVoParams));
CompletableFuture<List<OutBaseProductInfoVo>> foodFuture = CompletableFuture.supplyAsync(() -> productCoordinateService.getFoodList(nearbyVoParams));
CompletableFuture<List<OutBaseProductInfoVo>> shoppingFuture = CompletableFuture.supplyAsync(() -> productCoordinateService.getShoppingList(nearbyVoParams));
WXNearByVo nearByVo = new WXNearByVo();
nearByVo.setScenicList(scenicFuture.get());
nearByVo.setAccommodationList(accommodationFuture.get());
nearByVo.setFoodList(foodFuture.get());
nearByVo.setShoppingList(shoppingFuture.get());
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
优化后效果:
整体从9s->6s
各项优化(4s)
这么简单的需求能查询四十多次数据库,显然是SQL写的有问题
具体到每一项上面
long start = System.currentTimeMillis();
List<OutBaseProductInfoVo> scenicList = productCoordinateService.getScenicList(nearbyVoParams);
long end1 = System.currentTimeMillis();
System.out.println("scenic耗时:" + (end1 - start) + "ms");
List<OutBaseProductInfoVo> accommodationList = productCoordinateService.getAccommodationList(nearbyVoParams);
long end2 = System.currentTimeMillis();
System.out.println("accommodation耗时:" + (end2 - end1) + "ms");
List<OutBaseProductInfoVo> foodList = productCoordinateService.getFoodList(nearbyVoParams);
long end3 = System.currentTimeMillis();
System.out.println("food耗时:" + (end3 - end2) + "ms");
List<OutBaseProductInfoVo> shoppingList = productCoordinateService.getShoppingList(nearbyVoParams);
long end4 = System.currentTimeMillis();
System.out.println("shopping耗时:" + (end4 - end3) + "ms");
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");