秒杀优化

pull/8/head
czk 2024-05-02 19:29:55 +08:00
parent 7c67d8de5b
commit 387c5e3db3
16 changed files with 130 additions and 100 deletions

File diff suppressed because one or more lines are too long

View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mall.common.domain.OrderItemEntity; import com.mall.common.domain.OrderItemEntity;
import com.mall.server.config.DelayConfig; import com.mall.server.config.DelayConfig;
import com.mall.server.config.MqConfig;
import com.mall.server.constant.SpikesConstant; import com.mall.server.constant.SpikesConstant;
import com.mall.server.service.OrderItemService; import com.mall.server.service.OrderItemService;
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Channel;
@ -48,7 +49,39 @@ public class SpikesMonitor {
try { try {
channel.basicAck(deliveryTag,false); channel.basicAck(deliveryTag,false);
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); try {
if(deliveryTag<3){
Thread.sleep(3000);
channel.basicNack(deliveryTag,false,true);
}else {
channel.basicNack(deliveryTag,false,false);
}
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
@RabbitListener(queues = MqConfig.DXQUEUE)
public void orderConsumer(String meg, Message message, Channel channel){
log.info("下订单"+meg);
long deliveryTag = message.getMessageProperties().getDeliveryTag();
orderItemService.save(JSON.parseObject(meg,OrderItemEntity.class));
try {
channel.basicAck(deliveryTag,false);
} catch (IOException e) {
try {
if(deliveryTag<3){
Thread.sleep(3000);
channel.basicNack(deliveryTag,false,true);
}else {
channel.basicNack(deliveryTag,false,false);
}
} catch (Exception ex) {
throw new RuntimeException(ex);
}
} }
} }

View File

@ -1,6 +1,5 @@
package com.mall.server.service.impl; package com.mall.server.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mall.common.constant.TokenConstants; import com.mall.common.constant.TokenConstants;
@ -14,6 +13,7 @@ import com.mall.common.result.Result;
import com.mall.common.utils.IdUtils; import com.mall.common.utils.IdUtils;
import com.mall.common.utils.StringUtils; import com.mall.common.utils.StringUtils;
import com.mall.server.config.DelayConfig; import com.mall.server.config.DelayConfig;
import com.mall.server.config.MqConfig;
import com.mall.server.constant.SpikesConstant; import com.mall.server.constant.SpikesConstant;
import com.mall.server.domain.SkuEntity; import com.mall.server.domain.SkuEntity;
import com.mall.server.domain.SpikesEntity; import com.mall.server.domain.SpikesEntity;
@ -21,12 +21,10 @@ import com.mall.server.mapper.SpikesMapper;
import com.mall.server.service.OrderItemService; import com.mall.server.service.OrderItemService;
import com.mall.server.service.SkuService; import com.mall.server.service.SkuService;
import com.mall.server.service.SpikesService; import com.mall.server.service.SpikesService;
import com.mall.server.service.SpuService;
import org.redisson.api.RSemaphore; import org.redisson.api.RSemaphore;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -69,6 +67,7 @@ public class SpikesServiceImpl extends ServiceImpl<SpikesMapper, SpikesEntity>
/** /**
* *
*
* @param spikesRequest * @param spikesRequest
* @return * @return
*/ */
@ -147,6 +146,7 @@ public class SpikesServiceImpl extends ServiceImpl<SpikesMapper, SpikesEntity>
/** /**
* *
*
* @param skuId * @param skuId
* @return * @return
*/ */
@ -173,8 +173,7 @@ public class SpikesServiceImpl extends ServiceImpl<SpikesMapper, SpikesEntity>
throw new BizException(500, "系统繁忙,商品已抢购完"); throw new BizException(500, "系统繁忙,商品已抢购完");
} }
String orderSn = IdUtils.genId(); String orderSn = IdUtils.genId();
orderItemService.save( OrderItemEntity orderItem = OrderItemEntity.builder()
OrderItemEntity.builder()
.userId(login.getId()) .userId(login.getId())
.orderSn(orderSn) .orderSn(orderSn)
.skuId(skuId) .skuId(skuId)
@ -185,8 +184,14 @@ public class SpikesServiceImpl extends ServiceImpl<SpikesMapper, SpikesEntity>
// .couponAmount() // .couponAmount()
// .integrationAmount() // .integrationAmount()
.realAmount(skuEntity.getActivityPrice()) .realAmount(skuEntity.getActivityPrice())
.status(0).build() .status(0).build();
); //异步下订单
rabbitTemplate.convertAndSend(MqConfig.DXEXCHANGE, MqConfig.ROUTINGKEY, orderItem.toString(),
message -> {
message.getMessageProperties().setMessageId(IdUtils.genId());
return message;
});
rabbitTemplate.convertAndSend( rabbitTemplate.convertAndSend(
DelayConfig.EXCHANGE, DelayConfig.ROUKEYCZK, skuId + "," + orderSn, DelayConfig.EXCHANGE, DelayConfig.ROUKEYCZK, skuId + "," + orderSn,
message -> { message -> {