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

佛山cms模板建站创意设计思维

佛山cms模板建站,创意设计思维,合适的网站建设明细报价表,ppt模板网站哪个免费MQ消息重复消费是分布式系统中的常见问题,主要由网络问题、消费者故障、消息重试机制等引起。以下是针对RabbitMQ的完整解决方案体系: 一、消息生产端解决方案 1. 消息幂等设计 全局唯一消息ID: MessageProperties props MessagePropert…

MQ消息重复消费是分布式系统中的常见问题,主要由网络问题、消费者故障、消息重试机制等引起。以下是针对RabbitMQ的完整解决方案体系:

一、消息生产端解决方案

1. 消息幂等设计

全局唯一消息ID

MessageProperties props = MessagePropertiesBuilder.newInstance().setMessageId(UUID.randomUUID().toString()).build();
Message message = new Message(body.getBytes(), props);
rabbitTemplate.send(exchange, routingKey, message);

业务键去重

props.setHeader("biz_key", "order_123_create");

2. 生产者确认模式

// 开启确认模式
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {if (!ack) {// 消息发送失败处理}
});// 开启返回模式
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {// 消息路由失败处理
});

二、消息存储端解决方案

1. 消息持久化

// 设置消息持久化
props.setDeliveryMode(MessageDeliveryMode.PERSISTENT);// 队列持久化
@Bean
public Queue durableQueue() {return new Queue("order.queue", true); // true表示持久化
}

2. 死信队列配置

@Bean
public Queue mainQueue() {Map<String, Object> args = new HashMap<>();args.put("x-dead-letter-exchange", "dlx.exchange");args.put("x-dead-letter-routing-key", "dlx.routingKey");return new Queue("order.queue", true, false, false, args);
}

三、消费端核心解决方案

1. 消费幂等实现

数据库方案:
@Transactional
public void processOrder(OrderMessage message) {if (orderLogRepository.existsByMessageId(message.getMessageId())) {return;}Order order = createOrder(message);orderLogRepository.save(new OrderLog(message.getMessageId()));
}
Redis方案:
public void processMessage(OrderMessage message) {String key = "order:msg:" + message.getMessageId();if (redisTemplate.opsForValue().setIfAbsent(key, "1", 24, TimeUnit.HOURS)) {// 处理业务逻辑}
}

2. 手动ACK机制

@RabbitListener(queues = "order.queue")
public void handleOrder(OrderMessage message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {try {// 业务处理channel.basicAck(tag, false); // 手动确认} catch (Exception e) {channel.basicNack(tag, false, true); // 重新入队}
}

3. 消费限流

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setPrefetchCount(10); // 每次只获取10条消息return factory;
}

四、分布式锁方案

1. Redis分布式锁

public void processWithLock(OrderMessage message) {String lockKey = "order:lock:" + message.getOrderId();try {boolean locked = redisLock.lock(lockKey, 10, TimeUnit.SECONDS);if (locked) {// 处理业务}} finally {redisLock.unlock(lockKey);}
}

2. 数据库乐观锁

@Transactional
public void updateWithVersion(Order order) {int affected = orderMapper.update("update orders set status = #{status}, version = version + 1 " +"where id = #{id} and version = #{version}", order);if (affected == 0) {throw new OptimisticLockException();}
}

五、消息轨迹方案

1. 全链路追踪

// 发送端
props.setHeader("trace_id", UUID.randomUUID().toString());// 消费端
@RabbitListener(queues = "order.queue")
public void handleOrder(OrderMessage message, @Header("trace_id") String traceId) {MDC.put("trace_id", traceId);// 处理业务
}

2. 状态机设计

public enum OrderStatus {INIT(1), PROCESSING(2), COMPLETED(3), FAILED(4);// 状态转换逻辑...
}public void processOrder(Order order) {if (!order.getStatus().canTransitionTo(OrderStatus.PROCESSING)) {return; // 状态检查}// 处理业务
}

六、RabbitMQ特有方案

1. 消息去重插件

rabbitmq-plugins enable rabbitmq_message_deduplication

配置策略:

rabbitmqctl set_policy dedup-policy "^dedup-queue$" \'{"deduplication-mode":"all","deduplication-header":"message_id"}' \--apply-to queues

2. 消息TTL设置

// 设置消息过期时间
props.setExpiration("60000"); // 60秒// 队列级别TTL
args.put("x-message-ttl", 60000);

3. 优先级队列

args.put("x-max-priority", 10); // 设置最大优先级
props.setPriority(5); // 设置消息优先级

七、架构级解决方案

1. 消息表+定时任务

CREATE TABLE consumed_messages (consumer_id VARCHAR(64),message_id VARCHAR(64) PRIMARY KEY,consumed_at TIMESTAMP,biz_key VARCHAR(128)
);

2. 去重服务设计

public class DeduplicationService {private final BloomFilter<String> bloomFilter;private final RedisTemplate<String, String> redisTemplate;public boolean isDuplicate(String messageId) {if (bloomFilter.mightContain(messageId)) {return redisTemplate.hasKey("msg:" + messageId);}return false;}
}

八、消费者配置优化

1. 消费者重试策略

spring:rabbitmq:listener:simple:retry:enabled: truemax-attempts: 3initial-interval: 1000

2. 死信队列处理

@RabbitListener(queues = "dlx.order.queue")
public void handleDeadLetter(OrderMessage message) {// 记录日志或人工干预alertService.notifyAdmin(message);
}

九、解决方案选择矩阵

场景推荐方案适用条件
金融交易数据库唯一约束+事务强一致性要求
高并发订单Redis原子操作+本地缓存高性能要求
长时间业务处理手动ACK+分布式锁处理耗时较长
全链路追踪消息轨迹+状态机复杂业务流程
海量消息布隆过滤器+持久化存储内存资源有限

十、最佳实践建议

  1. 多级防御:生产端ID+消费端幂等+存储去重

  2. 监控告警:监控重复消费率和死信队列

  3. 压力测试:模拟网络分区和消费者重启

  4. 日志完善:记录消息全生命周期日志

  5. 版本兼容:消息体结构要向前兼容

RabbitMQ消息去重的关键在于根据业务场景选择合适的技术组合,通常建议:

  • 简单场景:消息ID+Redis去重

  • 金融场景:数据库唯一约束+事务

  • 高并发场景:本地缓存+Redis校验

  • 复杂业务:状态机+分布式锁

同时要注意消息堆积时的处理能力和去重存储的容量规划。


文章转载自:

http://IwfyqocQ.zrwLz.cn
http://r6gXQLjD.zrwLz.cn
http://szXMzhhn.zrwLz.cn
http://Wuo7SVY7.zrwLz.cn
http://Q1fOhEDK.zrwLz.cn
http://dZXQWZoW.zrwLz.cn
http://44GzmqcR.zrwLz.cn
http://EvyzW8p0.zrwLz.cn
http://fmMVGh0w.zrwLz.cn
http://s9Thaio6.zrwLz.cn
http://nZ4FEX4g.zrwLz.cn
http://dlZEWTs7.zrwLz.cn
http://2hObTjGU.zrwLz.cn
http://Pn9S5IpT.zrwLz.cn
http://KQY1jjp4.zrwLz.cn
http://rpkSXjqu.zrwLz.cn
http://LDNYAq1q.zrwLz.cn
http://piHlcSLk.zrwLz.cn
http://A6YpG3jB.zrwLz.cn
http://UWp3Kcj2.zrwLz.cn
http://ni1Ms5Qw.zrwLz.cn
http://COTcojEh.zrwLz.cn
http://DpoO7YDY.zrwLz.cn
http://zBUc4YAE.zrwLz.cn
http://vPfTPjyn.zrwLz.cn
http://mznE22oo.zrwLz.cn
http://NGSZfksP.zrwLz.cn
http://bckSKl53.zrwLz.cn
http://pEhjrd1B.zrwLz.cn
http://LPLGQ7Hl.zrwLz.cn
http://www.dtcms.com/wzjs/653641.html

相关文章:

  • 免费建站还用学做网站吗做图素材网站
  • 广东今科网站建设wordpress rss采集插件
  • 做印刷哪个网站好怎么申请电商平台
  • 网站效果主要包括所见即所得网站管理系统
  • 过期网站查询安卓app开发培训
  • 南京的网站建设公司昆明有几个区
  • 网页做网站的尺寸狠友紧急升级访问页面
  • 公司网站建设吧个好startuply中文版wordpress主题
  • 全网站开发是什么做网站需要硬件设施
  • 网站建设-易速通科技WordPress仪表盘主题
  • 做网站 广州大型门户网站建设企业
  • wordpress多站点用户互通网站收录
  • 深圳网站制作公司怎么样鞋网站建设
  • 工业信息化部网站备案查询wordpress 段落缩进
  • dedecms网站备份青岛开发区做网站
  • 网站建设教程大全 百度网盘长沙阳性1例
  • 国内电商平台网站制作排行榜微九州合作网站
  • 带有数据库的网站模板网站百度没收录
  • 周口住房和城乡建设网站黑龙江建设网证书查询三类人员
  • 义乌网站建设制作商好的手机端网站模板下载
  • 建站时长是什么原因造成的龙岗网站建设方案
  • 网站做产品的审核为什么要建手机网站
  • 伊川网站建设做网站交易装备可以么
  • 免费做宣传的网站是短视频制作价格明细
  • 怎样看网站做的好不好专业关键词排名软件
  • 家庭服务网站的营销策略兼职网站建设收费
  • 公司做零申报在哪个网站上wordpress纯代码下载
  • 为什么网站只能显示ip地址_不能显示域名 wordpressalexa怎么查询网站排名
  • 企业展示网站案例企业网站开发信息
  • 检测ai写作的网站wordpress 科技主题