当前位置: 首页 > news >正文

ASP JSP动态网站开发seo成功案例分析

ASP JSP动态网站开发,seo成功案例分析,网站和域名的区别,邗江建设局网站资料下载文章目录 分布式并发场景的核心问题与解决方案一、核心问题分析1. 分布式事务问题2. 数据一致性问题3. 并发控制问题4. 分布式锁失效问题 二、解决方案1. 分布式事务解决方案1.1 可靠消息最终一致性方案1.2 TCC方案实现 2. 缓存一致性解决方案2.1 延迟双删策略2.2 Canal方案 3.…

文章目录

  • 分布式并发场景的核心问题与解决方案
    • 一、核心问题分析
      • 1. 分布式事务问题
      • 2. 数据一致性问题
      • 3. 并发控制问题
      • 4. 分布式锁失效问题
    • 二、解决方案
      • 1. 分布式事务解决方案
        • 1.1 可靠消息最终一致性方案
        • 1.2 TCC方案实现
      • 2. 缓存一致性解决方案
        • 2.1 延迟双删策略
        • 2.2 Canal方案
      • 3. 并发控制解决方案
        • 3.1 基于Redis的原子操作
        • 3.2 防重复提交
    • 三、系统监控与告警
      • 1. 分布式链路追踪
      • 2. 监控指标收集
    • 四、最佳实践建议
    • 五、注意事项

分布式并发场景的核心问题与解决方案

一、核心问题分析

1. 分布式事务问题

在分布式环境下,一个业务操作可能横跨多个服务,比如创建订单时涉及:

  • 订单服务:创建订单
  • 库存服务:扣减库存
  • 支付服务:冻结余额
  • 积分服务:赠送积分

可能出现的问题:

  • 部分服务成功,部分服务失败
  • 网络超时导致事务状态不确定
  • 服务宕机导致事务中断

2. 数据一致性问题

在分布式系统中,由于CAP理论的限制,我们通常需要在一致性和可用性之间做出选择。

典型场景:

  • 主从数据库的数据同步延迟
  • 分布式缓存的数据一致性
  • 跨服务的数据依赖

3. 并发控制问题

多个节点同时处理请求时的并发控制:

  • 超卖问题
  • 重复下单
  • 数据竞争

4. 分布式锁失效问题

  • Redis主从切换导致锁失效
  • 时钟不同步导致的锁判断错误
  • 网络分区导致的锁状态不一致

二、解决方案

1. 分布式事务解决方案

1.1 可靠消息最终一致性方案
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {@Autowiredprivate RocketMQTemplate rocketMQTemplate;@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate MessageMapper messageMapper;@Transactional(rollbackFor = Exception.class)public void createOrder(OrderDTO orderDTO) {// 1. 事务消息表记录TransactionMessage message = new TransactionMessage();message.setMessageId(UUID.randomUUID().toString());message.setMessage(JSON.toJSONString(orderDTO));message.setStatus(MessageStatus.PREPARING);messageMapper.insert(message);// 2. 创建订单Order order = convertToOrder(orderDTO);orderMapper.insert(order);// 3. 发送事务消息sendTransactionMessage(message);}private void sendTransactionMessage(TransactionMessage message) {Message msg = MessageBuilder.withPayload(message).setHeader("messageId", message.getMessageId()).build();TransactionSendResult result = rocketMQTemplate.sendMessageInTransaction("ORDER_TOPIC",msg,null);if (result.getLocalTransactionState() != LocalTransactionState.COMMIT_MESSAGE) {throw new BusinessException("发送事务消息失败");}}
}

消息消费者实现:

@Component
@RocketMQMessageListener(topic = "ORDER_TOPIC",consumerGroup = "order-consumer-group"
)
public class OrderMessageListener implements RocketMQListener<Message> {@Autowiredprivate StockService stockService;@Autowiredprivate MessageMapper messageMapper;@Overridepublic void onMessage(Message message) {String messageId = message.getHeaders().get("messageId", String.class);// 1. 检查消息是否已处理if (messageMapper.checkProcessed(messageId)) {return;}try {// 2. 处理业务逻辑TransactionMessage txMessage = JSON.parseObject(new String((byte[]) message.getPayload()),TransactionMessage.class);OrderDTO orderDTO = JSON.parseObject(txMessage.getMessage(),OrderDTO.class);// 3. 扣减库存stockService.decreaseStock(orderDTO.getProductId(), orderDTO.getQuantity());// 4. 更新消息状态messageMapper.markAsProcessed(messageId);} catch (Exception e) {// 5. 失败处理messageMapper.markAsFailed(messageId, e.getMessage());// 根据业务需求决定是否抛出异常重试throw e;}}
}
1.2 TCC方案实现
@Service
public class OrderTccServiceImpl implements OrderTccService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate StockTccService stockTccService;@Autowiredprivate PaymentTccService paymentTccService;@GlobalTransactionalpublic void createOrder(OrderDTO orderDTO) {// 1. Try阶段// 1.1 订单服务TryOrder order = prepareTryOrder(orderDTO);// 1.2 库存服务TrystockTccService.tryDecrease(orderDTO.getProductId(),orderDTO.getQuantity());// 1.3 支付服务TrypaymentTccService.tryFreeze(orderDTO.getUserId(),orderDTO.getAmount());}// Try阶段的订单处理private Order prepareTryOrder(OrderDTO orderDTO) {Order order = convertToOrder(orderDTO);order.setStatus(OrderStatus.TRY);orderMapper.insert(order);return order;}// Confirm阶段的订单处理public void confirmOrder(BusinessActionContext context) {String orderId = context.getActionContext("orderId").toString();Order order = orderMapper.selectById(orderId);order.setStatus(OrderStatus.CONFIRMED);orderMapper.updateById(order);}// Cancel阶段的订单处理public void cancelOrder(BusinessActionContext context) {String orderId = context.getActionContext("orderId").toString();Order order = orderMapper.selectById(orderId);order.setStatus(OrderStatus.CANCELED);orderMapper.updateById(order);}
}

2. 缓存一致性解决方案

2.1 延迟双删策略
@Service
public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductMapper productMapper;@Autowiredprivate RedisTemplate<String, Product> redisTemplate;@Autowiredprivate ThreadPoolExecutor threadPoolExecutor;private static final String PRODUCT_CACHE_KEY = "product:";private static final long DELAY_DELETE_TIME = 1000; // 1秒@Transactional(rollbackFor = Exception.class)public void updateProduct(Product product) {// 1. 删除缓存String cacheKey = PRODUCT_CACHE_KEY + product.getId();redisTemplate.delete(cacheKey);// 2. 更新数据库productMapper.updateById(product);// 3. 延迟双删threadPoolExecutor.execute(() -> {try {Thread.sleep(DELAY_DELETE_TIME);redisTemplate.delete(cacheKey);} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("延迟双删失败", e);}});}
}
2.2 Canal方案
@Component
public class ProductCanalClient {@Autowiredprivate RedisTemplate<String, Product> redisTemplate;@Listen(table = "product")public void handleProductChange(CanalEntry.Entry entry) {if (entry.getEntryType() == CanalEntry.EntryType.ROWDATA) {CanalEntry.RowChange rowChange = entry.getRowChange();for (CanalEntry.RowData rowData : rowChange.getRowDatasList()) {if (rowChange.getEventType() == CanalEntry.EventType.UPDATE) {// 处理更新事件handleProductUpdate(rowData);} else if (rowChange.getEventType() == CanalEntry.EventType.DELETE) {// 处理删除事件handleProductDelete(rowData);}}}}private void handleProductUpdate(CanalEntry.RowData rowData) {// 解析变更数据Map<String, String> data = parseRowData(rowData.getAfterColumnsList());String productId = data.get("id");// 更新缓存String cacheKey = "product:" + productId;Product product = convertToProduct(data);redisTemplate.opsForValue().set(cacheKey, product);}
}

3. 并发控制解决方案

3.1 基于Redis的原子操作
@Service
public class StockService {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String STOCK_KEY = "product:stock:";public boolean decreaseStock(Long productId, Integer quantity) {String key = STOCK_KEY + productId;// Lua脚本保证原子性String script = "local stock = redis.call('get', KEYS[1]) " +"if stock and tonumber(stock) >= tonumber(ARGV[1]) then " +"    return redis.call('decrby', KEYS[1], ARGV[1]) " +"end " +"return -1";DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();redisScript.setScriptText(script);redisScript.setResultType(Long.class);Long result = redisTemplate.execute(redisScript,Collections.singletonList(key),quantity.toString());return result != null && result >= 0;}
}
3.2 防重复提交
@Aspect
@Component
public class RepeatSubmitAspect {@Autowiredprivate StringRedisTemplate redisTemplate;@Around("@annotation(repeatSubmit)")public Object around(ProceedingJoinPoint joinPoint, RepeatSubmit repeatSubmit) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String token = request.getHeader("token");String key = getRepeatSubmitKey(joinPoint, token);// 使用Redis的setIfAbsent实现防重boolean isNotRepeat = redisTemplate.opsForValue().setIfAbsent(key,"1",repeatSubmit.interval(),TimeUnit.MILLISECONDS);if (!isNotRepeat) {throw new BusinessException("请勿重复提交");}return joinPoint.proceed();}
}

三、系统监控与告警

1. 分布式链路追踪

@Configuration
public class SleuthConfig {@Beanpublic Sampler defaultSampler() {return Sampler.ALWAYS_SAMPLE;}
}

2. 监控指标收集

@Component
public class DistributedMetrics {@Autowiredprivate MeterRegistry registry;// 记录分布式锁获取情况private Counter lockCounter;private Timer lockTimer;@PostConstructpublic void init() {lockCounter = registry.counter("distributed.lock.acquire");lockTimer = registry.timer("distributed.lock.time");}public void recordLockAcquire(String lockKey, boolean success) {lockCounter.increment();Tags tags = Tags.of("lock_key", lockKey,"success", String.valueOf(success));registry.counter("distributed.lock.acquire", tags).increment();}public void recordLockTime(String lockKey, long timeMillis) {lockTimer.record(timeMillis, TimeUnit.MILLISECONDS);}
}

四、最佳实践建议

  1. 业务设计层面

    • 尽量避免复杂分布式事务
    • 考虑业务可补偿性
    • 合理设计重试机制
  2. 技术选型层面

    • 优先考虑消息队列解耦
    • 合理使用缓存
    • 选择合适的分布式事务方案
  3. 监控运维层面

    • 完善的监控系统
    • 合理的告警阈值
    • 灾难恢复预案
  4. 性能优化层面

    • 合理的数据分片策略
    • 避免长事务
    • 批量处理优化

五、注意事项

  1. 数据库层面

    • 避免大事务
    • 合理设计索引
    • 注意死锁问题
  2. 缓存层面

    • 防止缓存雪崩
    • 注意缓存穿透
    • 合理设置过期时间
  3. 消息队列层面

    • 保证消息可靠性
    • 处理重复消息
    • 注意消息顺序性
  4. 分布式锁层面

    • 防止锁失效
    • 避免死锁
    • 合理设置超时时间

文章转载自:
http://incunabula.brjq.cn
http://overentreat.brjq.cn
http://my.brjq.cn
http://fertilizable.brjq.cn
http://distractive.brjq.cn
http://trivandrum.brjq.cn
http://galvanotropic.brjq.cn
http://emigrate.brjq.cn
http://poetize.brjq.cn
http://woodsman.brjq.cn
http://gantlope.brjq.cn
http://genethliac.brjq.cn
http://arterialization.brjq.cn
http://vihara.brjq.cn
http://hastily.brjq.cn
http://ciphony.brjq.cn
http://uphroe.brjq.cn
http://tergiant.brjq.cn
http://functor.brjq.cn
http://sanctorium.brjq.cn
http://reconciliation.brjq.cn
http://inquisitive.brjq.cn
http://undouble.brjq.cn
http://autopsy.brjq.cn
http://mammectomy.brjq.cn
http://decomposition.brjq.cn
http://hyperfine.brjq.cn
http://pseudoglobulin.brjq.cn
http://condom.brjq.cn
http://earnings.brjq.cn
http://unshirkable.brjq.cn
http://sdlc.brjq.cn
http://polydactyl.brjq.cn
http://theorbo.brjq.cn
http://clothesbasket.brjq.cn
http://motoneurone.brjq.cn
http://somersault.brjq.cn
http://tyuyamunite.brjq.cn
http://inessential.brjq.cn
http://laughter.brjq.cn
http://xyst.brjq.cn
http://glossematics.brjq.cn
http://illogic.brjq.cn
http://scroticles.brjq.cn
http://tractability.brjq.cn
http://quinine.brjq.cn
http://lucky.brjq.cn
http://voyeurist.brjq.cn
http://apprize.brjq.cn
http://spiritous.brjq.cn
http://shunpiking.brjq.cn
http://flannel.brjq.cn
http://irenicon.brjq.cn
http://enrapture.brjq.cn
http://benzoline.brjq.cn
http://bipolarize.brjq.cn
http://predynastic.brjq.cn
http://mailable.brjq.cn
http://apse.brjq.cn
http://clearcole.brjq.cn
http://turbogenerator.brjq.cn
http://startup.brjq.cn
http://photo.brjq.cn
http://gearchange.brjq.cn
http://bobby.brjq.cn
http://jaycee.brjq.cn
http://adm.brjq.cn
http://microscopist.brjq.cn
http://capricorn.brjq.cn
http://thisbe.brjq.cn
http://robert.brjq.cn
http://strelitzia.brjq.cn
http://difunctional.brjq.cn
http://ironware.brjq.cn
http://quitrent.brjq.cn
http://downbow.brjq.cn
http://practise.brjq.cn
http://exploration.brjq.cn
http://keenness.brjq.cn
http://knockabout.brjq.cn
http://whiter.brjq.cn
http://diseased.brjq.cn
http://pyridine.brjq.cn
http://fetlock.brjq.cn
http://gabrielle.brjq.cn
http://fulgurate.brjq.cn
http://maryolatrous.brjq.cn
http://tasset.brjq.cn
http://boneless.brjq.cn
http://nailbrush.brjq.cn
http://vainly.brjq.cn
http://subtopia.brjq.cn
http://frutex.brjq.cn
http://towerless.brjq.cn
http://vienna.brjq.cn
http://conscionable.brjq.cn
http://readmitance.brjq.cn
http://britishism.brjq.cn
http://condolatory.brjq.cn
http://accouche.brjq.cn
http://www.dt0577.cn/news/109668.html

相关文章:

  • 专业网站建设价格大全正版搜索引擎优化
  • 手机做网站的网站app拉新推广平台
  • 韩国日本室内装修效果图江苏网站seo设计
  • 哪儿有那种网站南京百度seo排名优化
  • wordpress 第一张图片不显示汕头seo建站
  • 研磨 东莞网站建设哪家竞价托管专业
  • 旅游网站建设项目报告论文引擎搜索技巧
  • 做网站买阿里云的ecs服务器网站模板库
  • 泸州网站建设公众号推广平台
  • 网站上banner怎么做如何做网络营销?
  • 官方网站营销手机创建网站免费注册
  • 沧州做网站优化哪家公司便宜百度手机助手官方正版
  • wordpress对的密码无法登录东莞seo靠谱
  • html5教程下载百度云seo 优化顾问
  • 企业营销型网站制作软文吧
  • 香港特区政府网站 建设中山谷歌推广
  • 广东建设信息网成绩查询百度移动端优化
  • springboot快速搭建网站太原搜索排名提升
  • html5 后台网站模板环球资源网站网址
  • 美容院做免费推广哪个网站什么是网络营销工具
  • dede网站白屏上海网络推广公司排名
  • 做网站需要神电商网站设计
  • 学习如何做网站seo课程培训
  • 网站建设利益分析外链群发平台
  • 易风网站建设数字化营销怎么做
  • 建网站怎么赚流量北京口碑最好的教育机构
  • 深圳wap网站建设学网络营销好就业吗
  • 网站开发建设与维护软文推广软文营销
  • 做食品批发的网站企业建站用什么好
  • 提供信息门户网站定制如何免费推广自己的产品