秒杀系统主库宕机不丢单方案-03-本地消息表
秒杀系统主库宕机不丢单方案本地消息表事务分离补偿机制方案概述本地消息表方案通过在应用层引入消息表机制将事务操作与消息发送分离实现最终一致性。该方案是秒杀系统主库宕机不丢单的兜底设计即使主库故障也能通过补偿机制恢复数据。核心原理1. 事务分离架构用户请求本地事务1: 订单创建本地事务2: 消息表记录异步发送消息从库消费消息从库事务处理2. 工作流程本地事务: 应用先完成订单创建等核心操作消息记录: 在同一事务中记录消息到本地消息表异步发送: 后台线程从消息表读取消息并发送到消息队列从库消费: 从库消费消息并执行相应操作补偿机制: 消息发送失败时通过定时任务重试3. 消息表设计CREATETABLElocal_message(idBIGINTAUTO_INCREMENTPRIMARYKEY,business_idVARCHAR(64)NOTNULL,-- 业务IDbusiness_typeVARCHAR(32)NOTNULL,-- 业务类型message_contentTEXTNOTNULL,-- 消息内容statusTINYINTNOTNULLDEFAULT0,-- 0:待发送 1:已发送 2:失败retry_countINTNOTNULLDEFAULT0,-- 重试次数max_retryINTNOTNULLDEFAULT3,-- 最大重试次数create_timeDATETIMENOTNULL,-- 创建时间update_timeDATETIMENOTNULL,-- 更新时间send_timeDATETIME,-- 发送时间UNIQUEKEYuk_business(business_id,business_type));实战配置1. 应用层实现ServicepublicclassOrderService{AutowiredprivateOrderDaoorderDao;AutowiredprivateMessageDaomessageDao;AutowiredprivateMessageSendermessageSender;TransactionalpublicvoidcreateOrder(Orderorder){// 1. 创建订单orderDao.insert(order);// 2. 记录消息LocalMessagemessagenewLocalMessage();message.setBusinessId(order.getId());message.setBusinessType(ORDER_CREATE);message.setMessageContent(JSON.toJSONString(order));messageDao.insert(message);}Scheduled(fixedDelay5000)publicvoidsendMessages(){ListLocalMessagemessagesmessageDao.selectUnsentMessages();for(LocalMessagemessage:messages){try{messageSender.send(message);message.setStatus(1);// 已发送}catch(Exceptione){message.setRetryCount(message.getRetryCount()1);if(message.getRetryCount()message.getMaxRetry()){message.setStatus(2);// 发送失败}}messageDao.update(message);}}}2. 消息消费者ComponentpublicclassOrderMessageConsumer{AutowiredprivateOrderDaoorderDao;RabbitListener(queuesorder_queue)publicvoidhandleOrderMessage(StringmessageContent){OrderorderJSON.parseObject(messageContent,Order.class);orderDao.insert(order);}}3. 补偿机制ServicepublicclassCompensationService{AutowiredprivateMessageDaomessageDao;Scheduled(fixedDelay30000)publicvoidcompensateFailedMessages(){ListLocalMessagefailedMessagesmessageDao.selectFailedMessages();for(LocalMessagemessage:failedMessages){if(message.getRetryCount()message.getMaxRetry()){try{messageSender.send(message);message.setStatus(1);message.setRetryCount(message.getRetryCount()1);}catch(Exceptione){// 继续保留失败状态等待下次重试}messageDao.update(message);}}}}优缺点分析优点最终一致性: 通过补偿机制确保数据最终一致解耦设计: 应用与消息系统解耦提高系统灵活性容灾能力强: 主库故障时消息表数据不会丢失扩展性好: 支持多种消息中间件缺点实现复杂: 需要额外的消息表和补偿逻辑数据延迟: 消息处理存在延迟不是强一致性重复消费: 需要处理消息重复问题适用场景高并发秒杀系统: 并发量在20000 QPS对数据一致性要求较高的业务: 如订单、支付已有消息队列基础设施: 如RabbitMQ、Kafka实战案例某电商巨头秒杀活动场景: 双11大促预计并发量50000 QPS配置:本地消息表方案RabbitMQ作为消息中间件3个从库消费消息补偿机制重试3次效果:零数据丢失成功保障订单不丢单平均响应时间120ms系统吞吐量45000 QPS消息补偿成功率99.5%最佳实践幂等设计: 确保消息消费的幂等性避免重复处理分片策略: 对消息表进行分片提高查询性能监控告警: 建立消息延迟和失败监控死信队列: 处理无法重试的消息幂等性处理示例ServicepublicclassOrderMessageConsumer{AutowiredprivateOrderDaoorderDao;RabbitListener(queuesorder_queue)publicvoidhandleOrderMessage(StringmessageContent){OrderorderJSON.parseObject(messageContent,Order.class);// 检查订单是否已存在OrderexistingOrderorderDao.selectById(order.getId());if(existingOrder!null){return;// 已处理直接返回}// 处理订单orderDao.insert(order);}}注意事项事务边界: 确保本地事务的原子性消息序列化: 选择合适的消息序列化方式重试策略: 合理设置重试次数和间隔性能监控: 监控消息处理性能和延迟总结本地消息表方案通过事务分离和补偿机制实现了秒杀系统主库宕机不丢单的兜底设计。该方案在最终一致性和系统可用性之间取得了平衡适用于高并发秒杀场景。建议结合幂等设计和监控机制确保系统的稳定性和可靠性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2473590.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!