查询问题:

场景

一个表中5000W多记录,用户查询,插入响应非常慢。

思路一:

索引

思路二:

少查,尽量索引覆盖

思路三:

读写分离

思路四:

读写分离+缓存

思路五:

冷热数据

垂直分表+垂直分库+缓存

思路六:

冷热数据

垂直分表+垂直分库+读写分离+缓存

思路七:

宽表同步到es,查询走es

RPC问题

场景1:

订单系统中,一个订单有200件商品,查看商品明细,cat not create native thread

思路一:批量查询

思路二:缓存

思路三:批量查询导致OOM,则分片批量查询

场景2:

收货扫描商品码
  1. ReceiveOrder receiveOrder = receiveOrderRepository.getById(receiveOrderId);
  2. List<Sku> skus = skuRepository.queryByScanerCode(thirdScanCode);
  3. receiveOrderRepository.updateById(receiveOrder);
  4. ProductVo productVo = productService.getProduct(sku.getSpuId());
  5. receiveOrderRepository.updateById(receiveOrder);
  6. List<ReceiveOrderSplitDetail> receiveOrderSplitDetails = receiveOrderSplitDetailRepository.queryBySkuId(receiveOrderId, sku.getId());
  7. receiveOrderRepository.updateById(receiveOrder);
  8. PurchaseOrder purchaseOrder = purchaseOrderRepository.getById(receiveOrderSplitDetailQ.getPurchaseOrderId());
  9. WmsReceiveExceptionItem wmsReceiveExceptionItem = wmsReceiveExceptionItemRepository.getById(exceptionDetail.getRefId());
  10. PurchaseSplitDetail purchaseSplitDetail = purchaseSplitDetailRepository.getByOrderIdAndSkuIdPurchaseOrderId(wmsReceiveExceptionItem.getOrderId(), wmsReceiveExceptionItem.getSkuId(),wmsReceiveExceptionItem.getPurchaseOrderId());
  11. Order order = orderRepository.getById(purchaseSplitDetail.getOrderId());
  12. List<PurchaseSplitDetail> purchaseSplitDetails = purchaseSplitDetailRepository.queryByPurchaseOrderAndSkuId(receiveOrderSplitDetail.getPurchaseOrderId(), receiveOrderSplitDetail.getSkuId());
  13. List<WmsReceiveExceptionItem> wmsReceiveExceptionItems1 = wmsReceiveExceptionItemRepository.queryByOrderSkuIdAndPurchaseOrderId(purchaseSplitDetail.getOrderId(), purchaseSplitDetail.getSkuId(), purchaseSplitDetail.getPurchaseOrderId());
  14. ReceiveOrderSplitDetail receiveOrderSplitDetail1 = receiveOrderSplitDetailRepository.queryByRefId(wmsReceiveExceptionItem.getId());
  15. Order order = orderRepository.getById(purchaseSplitDetail.getOrderId());
  16. List<PurchaseSplitDetail> purchaseSplitDetails = purchaseSplitDetailRepository.queryByPurchaseOrderAndSkuId(receiveOrderSplitDetail.getPurchaseOrderId(), receiveOrderSplitDetail.getSkuId());

dubbo设置的超时时间为3秒,【收货扫描商品码处理逻辑的时长可能在5秒以上,会导致rpc的重试,占用数据库连接资源,导致其他业务逻辑线程等待,超时。

思路一: 前端: 对于用户操作,在操作按钮上添加活性非活性事件,在用户点击后,按钮置为不可点,减少用户的重试次数。 后端: 关闭耗时长的方法的重试功能,用快速失败的策略,并对单个方法设置超时时间(消费端/服务端:设置时间短的时间生效) 思路二: 数据库设计范式适用于单体的大部分场景。但是对于soa,微服务,设计范式很多时候就是瓶颈的根源。 对于过于复杂的业务逻辑,利用数据宽表,将多字段插入同一个表,能很大程度减少查询的IO次数,提高性能。 对于后期同步es也能提高同步速度。 思路三:

异步操作

场景:

订单捡货进入待打包状态,且需要记录操作日志

实现方法一

1.记录日志

2.修改订单sku捡货数量

3.计算订单是否捡货完成

4.捡货未完成->捡货状态:process

5.捡货完成->捡货状态:finish

6.判断捡货状态是finish,更新订单状态

实现方法二

同步流程1

1.修改订单sku捡货数量

2.一步记录日志

3.发送异步消息

异步流程2:

1.修改订单sku捡货数量

2.捡货未完成->捡货状态:process

3.捡货完成->捡货状态:finish

4.判断捡货状态是finish,更新订单状态

应用分离

  • 供应商
  • 小B
  • trendsi

功能独立部署

服务器性能

cpu

memory

io