浙江省建设监理协会网站seo的收费标准

张小明 2025/12/31 4:32:30
浙江省建设监理协会网站,seo的收费标准,冰雕制作公司,网店代运营被骗怎么办在开发中#xff0c;我们经常用RabbitMQ来做系统之间的传话筒。比如用户下单后#xff0c;通知库存系统减库存、通知物流系统准备发货。但问题来了#xff1a;万一消息丢了怎么办#xff1f;或者同一条消息被处理了两次怎么办#xff1f;别担心#xff01;只要做好以下几…在开发中我们经常用RabbitMQ来做系统之间的传话筒。比如用户下单后通知库存系统减库存、通知物流系统准备发货。但问题来了万一消息丢了怎么办或者同一条消息被处理了两次怎么办别担心只要做好以下几点就能让 RabbitMQ 变得既可靠又安全。消息可能在哪丢假设发快递你生产者把包裹交给快递员RabbitMQ快递员把包裹送到收件人消费者手上。在这个过程中包裹可能在三个地方出问题你刚寄出快递员没收到→ 消息没到 RabbitMQ快递员收到了但仓库门没开→ RabbitMQ 宕机消息没了收件人签收前手机没电了→ 消费者处理失败消息丢失。所以我们要从发送方、中间方、接收方三处下手先配好配置文件application.ymlyamlspring: rabbitmq: host: localhost port: 5672 username: guest password: guest # 开启 publisher confirm 和 return publisher-confirm-type: correlated publisher-returns: true template: mandatory: true # 使 returns 生效 listener: simple: acknowledge-mode: manual # 手动 ACK retry: enabled: false # 我们自己控制重试逻辑 redis: host: localhost port: 63791. 声明队列、交换器持久化创建队列或交换器时设置durabletrue队列持久化。java Configuration public class RabbitMqConfig { public static final String ORDER_EXCHANGE order.exchange; public static final String ORDER_QUEUE order.queue; public static final String ORDER_ROUTING_KEY order.create; Bean public DirectExchange orderExchange() { // durable true默认就是 true return new DirectExchange(ORDER_EXCHANGE, true, false); } Bean public Queue orderQueue() { // durable true return new Queue(ORDER_QUEUE, true); } Bean public Binding binding() { return BindingBuilder.bind(orderQueue()) .to(orderExchange()) .with(ORDER_ROUTING_KEY); } }2. 生产者发送消息带唯一 ID Confirm 回调发送消息时设置 deliveryMode2 消息持久化。同时增加异步非阻塞操作发完消息立刻返回RabbitMQ 后台异步确认。支持批量确认、单条确认。java Service public class OrderProducer { Autowired private RabbitTemplate rabbitTemplate; // 生成唯一消息ID实际可用 UUID 或业务ID public void sendOrderMessage(String orderId) { String msgId msg_ System.currentTimeMillis(); // 简化版唯一ID MessageProperties props new MessageProperties(); props.setMessageId(msgId); // 设置唯一ID用于幂等 props.setDeliveryMode(MessageDeliveryMode.PERSISTENT); // 持久化 Message message new Message((orderId).getBytes(StandardCharsets.UTF_8), props); // 发送并监听 confirm rabbitTemplate.convertAndSend( RabbitMqConfig.ORDER_EXCHANGE, RabbitMqConfig.ORDER_ROUTING_KEY, message, new CorrelationData(msgId) // CorrelationData 用于关联 confirm ); // 设置 confirm 回调 rabbitTemplate.setConfirmCallback((correlationData, ack, cause) - { if (ack) { System.out.println(消息已确认送达 RabbitMQ: correlationData.getId()); } else { System.err.println(消息发送失败: cause); // 可在此处记录日志、重发、存 DB 等 } }); // 可选设置 return 回调处理路由失败 rabbitTemplate.setReturnsCallback(returned - { System.err.println(消息无法路由: new String(returned.getMessage().getBody())); }); } }生产环境建议把失败的消息存入数据库由定时任务补偿重发。到这里很多人以为只要设置了durabletrue和deliveryMode2消息就万无一失了。其实不然RabbitMQ 收到持久化消息后会先写入内存缓冲区再异步刷盘fsync。如果在这之间服务器断电消息还是会丢解决方案传统方案镜像队列Mirrored Queue多节点备份但存在脑裂、数据不一致风险。现代方案RabbitMQ 3.8Quorum Queue仲裁队列基于 Raft 共识算法强一致性自动选主、故障转移写入多数节点才返回成功真正防丢。在SpringBoot中声明 Quorum QueuejavaBean public Queue quorumOrderQueue() { return QueueBuilder .durable(order.quorum.queue) .quorum() // 关键 .build(); }3.消费者手动 ACK 幂等处理防重复手动 ACK 是什么等待消费者调用basicAck收到 ACK 后才从队列中删除消息。什么是幂等一个操作执行一次和执行多次结果完全相同。java Component public class OrderConsumer { Autowired private StringRedisTemplate redisTemplate; private static final String CONSUMED_KEY_PREFIX mq:consumed:; RabbitListener(queues RabbitMqConfig.ORDER_QUEUE) public void handleOrder(Message message, Channel channel) throws IOException { String msgId message.getMessageProperties().getMessageId(); String orderId new String(message.getBody(), StandardCharsets.UTF_8); try { // 1.幂等检查是否已处理过 String key CONSUMED_KEY_PREFIX msgId; Boolean hasConsumed redisTemplate.opsForValue().setIfAbsent(key, 1, Duration.ofHours(24)); if (Boolean.FALSE.equals(hasConsumed)) { System.out.println(重复消息跳过处理: msgId); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); return; } // 2.处理业务逻辑比如减库存、发短信 System.out.println(正在处理订单: orderId); // 模拟业务耗时 Thread.sleep(1000); // 3.业务成功 → 手动 ACK channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); System.out.println(消费成功已 ACK: msgId); } catch (Exception e) { System.err.println(消费失败: e.getMessage()); // 拒绝消息不 requeue避免死循环或根据策略决定是否重试 channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false); // 或者basicReject 记录到死信队列 } } }关键点setIfAbsent 实现 Redis 分布式锁式去重先检查幂等再处理业务最后 ACK异常时用 basicNack 拒绝消息避免无限重试。完整可靠性链路图ini[生产者] │ ├── 开启 Confirm → 确保消息到达 Broker └── 消息带唯一ID → 用于后续幂等 │ ▼ [RabbitMQ Broker] ├── 队列/交换器持久化 ├── 消息持久化deliveryMode2 └── 使用 Quorum Queue高可用强一致 │ ▼ [消费者] ├── 手动 ACKautoAckfalse ├── 先查幂等Redis/setIfAbsent ├── 再执行业务 └── 最后 ACK失败则 NACK 或进死信队列常见误区误区正确做法“开了持久化就不会丢”还需 Confirm 高可用队列“自动 ACK 更简单”自动 ACK 极易丢消息必须手动“RabbitMQ 能保证不重复”不能必须消费者自己幂等“消息ID用时间戳就行”时间戳可能重复建议用 UUID 或雪花ID总结保证 RabbitMQ 消息不丢和不重复记住这四个关键点1. 生产者确认Confirm开启 publisher-confirm确保消息成功发到 RabbitMQ。2. 消息持久化队列和消息都设置成持久化防止 RabbitMQ 重启后数据丢失。3. 消费者手动确认ACK关闭自动 ACK业务处理成功后再手动确认消息。4. 消费幂等性每条消息带唯一 ID消费者先检查是否处理过避免重复消费。简单来说防丢失Confirm 持久化 手动 ACK防重复消息唯一 ID 幂等检查没有100%的不丢失只有无限接近99.99%的可靠性。做好这四点你的 RabbitMQ 就足够可靠了
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

宠物网站 html模板自己公司网站设计

vLLM边缘部署实战:让大语言模型在资源受限环境中飞驰 【免费下载链接】vllm A high-throughput and memory-efficient inference and serving engine for LLMs 项目地址: https://gitcode.com/GitHub_Trending/vl/vllm 在智能工厂的边缘网关、车载系统的计算…

张小明 2025/12/29 2:26:20 网站建设

泉州惠安网站建设怎么给网站做关键词搜索

Linux Shell 实用工具与技巧全解析 1. 基本对象操作示例 在开始介绍各类工具之前,先来看一个简单的对象操作示例: $obj_name.set_firstname $firstname $obj_name.set_birthdate $birthdate } echo person.new self Bozeman Bozo 101272413 # Create an instance of &quo…

张小明 2025/12/29 2:26:22 网站建设

洛阳制作网站公司吗电子商务网站APP

除了掌握扎实的专业技能之外,你还需要一份《软件测试面试宝典》才能在万千面试者中杀出重围,成功拿下offer。 小编特意整理了100道软件测试面试题,送给大家,希望大家都能顺利通过面试,拿下高薪。赶紧拿去吧~~ 正文&a…

张小明 2025/12/29 2:26:19 网站建设

企业只有建立自己的网站平台软件产品设计流程

如何利用SAWS智能匹配功能提升AWS资源管理效率 【免费下载链接】saws A supercharged AWS command line interface (CLI). 项目地址: https://gitcode.com/gh_mirrors/sa/saws 在日常的AWS云服务运维中,你是否经常为查找特定资源而苦恼?面对成百上…

张小明 2025/12/29 2:26:20 网站建设

广西建设工程管理网站cms网站访问人数

深度解密:大模型DPO训练中隐藏的置信度衰减效应与优化策略 【免费下载链接】Qwen3-4B-Base 探索语言极限,Qwen3-4B-Base引领大模型新篇章。集成多元训练数据与前沿技术,实现更高质的预训练与扩展的语言理解能力,助您开启智能文本处…

张小明 2025/12/29 2:26:24 网站建设

龙游县住房和城乡建设局网站建站网页建设

Excalidraw Webhook事件机制实现外部系统联动 在现代软件工程与协作流程中,设计环节正从“静态产出”向“动态输入”转变。过去,一张架构图或产品原型完成之后,往往需要手动导出、上传、再转化为任务卡片或代码模板——这个过程不仅耗时&…

张小明 2025/12/31 12:03:44 网站建设