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

网页模板下载网站南宁seo全网营销

网页模板下载网站,南宁seo全网营销,智能展厅,什么是ui界面RabbitMQ 高可用集群设计与消息幂等性实战指南 在电商秒杀、支付、库存同步等高并发业务场景中,消息中间件既要保证高可靠、高可用,又要防止重复消息对业务造成副作用。本文结合真实生产环境,分享RabbitMQ集群搭建、HA策略、Publisher Confi…

Cover

RabbitMQ 高可用集群设计与消息幂等性实战指南

在电商秒杀、支付、库存同步等高并发业务场景中,消息中间件既要保证高可靠、高可用,又要防止重复消息对业务造成副作用。本文结合真实生产环境,分享RabbitMQ集群搭建、HA策略、Publisher Confirms与幂等消费方案的实战经验。


一、业务场景描述

  1. 秒杀大促期间,每秒产生数千~万级消息推送订单、库存扣减与支付回调。
  2. 要求消息不丢失、可快速恢复,系统单点宕机时不影响整体可用性。
  3. 处理端需确保幂等消费,避免重复扣库存、重复发货等严重后果。

为了满足上述需求,我们选择RabbitMQ作为核心消息队列,并通过集群、镜像策略与消息幂等处理实现高可用和高稳定性。

二、技术选型过程

  1. 为什么选RabbitMQ?

    • 成熟稳定、社区活跃、插件丰富。
    • 支持镜像队列(HA)、TTL、Dead Letter Exchange(死信队列)等特性。
    • 提供Publisher Confirms与事务机制,确保可靠投递。
  2. 集群设计方案对比

    • 原生集群(分片队列、单节点Master):写入压力下Master易成为瓶颈。
    • 镜像队列(ha-mode=all或者自定义镜像数):主节点崩溃时可选任意镜像节点切换为Master。
  3. 幂等实现方式

    • Producer端保证不重复发送(幂等Producer较难保证下游系统崩溃场景)。
    • Consumer端通过唯一ID+外部存储(如Redis、MySQL)做去重。

综合考虑,我们采用3节点RabbitMQ集群+镜像队列(ha-mode=all)+Publisher Confirms+消费端幂等方案。

三、实现方案详解

3.1 集群与镜像队列配置

rabbitmq.conf中启用集群配置:

cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@node1
cluster_formation.classic_config.nodes.2 = rabbit@node2
cluster_formation.classic_config.nodes.3 = rabbit@node3# 高可用队列策略:所有镜像
policies.ha-all.pattern = ^ha\.
policies.ha-all.definition.ha-mode = all
policies.ha-all.definition.ha-sync-mode = automatic
policies.ha-all.priority = 0
policies.ha-all.apply-to = queues

在管理界面或CLI中创建策略:

# CLI示例
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'

所有需要高可用的队列名称前缀加ha.,例如:ha.order.queue

3.2 Publisher Confirms配置

通过Publisher Confirms确认消息被Broker接收:

Spring Boot示例:

spring:rabbitmq:host: node1.example.comport: 5672username: guestpassword: guestpublisher-confirm-type: correlated   # 开启确认模式publisher-returns: true             # 开启退回template:mandatory: true                   # 必须开启mandatory
@Component
public class RabbitPublisher {@Autowiredprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init() {rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {if (!ack) {// 记录失败日志/重试log.error("Message send failed: {}", cause);}});rabbitTemplate.setReturnsCallback(returned -> {log.warn("Message returned: {}", returned);// 保存到DB或重发队列});}public void sendOrder(String messageJson) {CorrelationData data = new CorrelationData(UUID.randomUUID().toString());rabbitTemplate.convertAndSend("ha.order.exchange", "order.routing.key", messageJson, data);}
}

3.3 消费端幂等处理

  1. 为每条消息生成唯一ID字段,如UUID或全局唯一流水号(msgId)。
  2. 消费前查询Redis SET或MySQL去重表;使用Redis更轻量:
@Component
public class OrderConsumer {private static final String DEDUPE_SET = "dedupe:order";@Autowiredprivate StringRedisTemplate redis;@RabbitListener(queues = "ha.order.queue")public void onMessage(String payload, Channel channel, Message message) throws IOException {String msgId = message.getMessageProperties().getHeader("msgId");Boolean isNew = redis.opsForSet().add(DEDUPE_SET, msgId) == 1;if (!isNew) {// 幂等:重复消息,直接ACKchannel.basicAck(message.getMessageProperties().getDeliveryTag(), false);return;}try {// 业务处理:调用库存、下单、支付微服务...processOrder(payload);channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception ex) {// 处理失败,NACK并重回队列或DLXchannel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);}}
}
  1. 使用TTL+DLX处理超时未消费或死信:
spring:rabbitmq:listener:simple:retry:enabled: trueinitial-interval: 1000max-attempts: 3

队列配置(CLI):

rabbitmqctl set_policy dlx ".*" '{"dead-letter-exchange":"dlx.exchange"}'
rabbitmqadmin declare queue name=dead_letter_queue
rabbitmqadmin bind queue name=dead_letter_queue exchange=dlx.exchange routing_key="#"

3.4 项目结构示例

message-service/
├── src/main/java/com/example/mq/
│   ├── RabbitPublisher.java
│   ├── OrderConsumer.java
│   ├── config/
│   │   └── RabbitConfig.java
│   └── util/
│       └── RedisDedupeUtil.java
├── src/main/resources/
│   └── application.yml
└── Dockerfile

四、踩过的坑与解决方案

  1. 镜像队列全同步模式下,节点加入同步耗时较长,导致集群不稳定。

    • 解决:限定同步节点或使用ha-sync-mode: automatic+ha-sync-batch-size配置,减少全量同步。
  2. Publisher Confirms里未捕获returned回调导致消息丢失。

    • 解决:结合publisher-returnsmandatory使用,遇路由失败落盘或重试。
  3. Consumer端NACK后无限重试造成死锁。

    • 解决:配置最大重试次数,并将失败消息送入DLX专用死信队列人工干预或补偿。
  4. Redis去重Set过大导致内存抖动。

    • 解决:定期过期清理(使用Redis的EXPIRE策略)或采用CuckooFilter减低内存占用。

五、总结与最佳实践

  • 集群节点建议部署奇数台(3~5台),避免脑裂。
  • 镜像队列HA策略按业务规模灵活选择:全镜像/固定数量镜像。
  • 开启Publisher Confirms+Returns保障生产者侧的消息可靠性。
  • 消费端务必实现幂等,结合Redis或MySQL去重,防止重复消费。
  • 死信队列(DLX)+TTL配合尝试多次后再人工干预,提高系统鲁棒性。

通过以上RabbitMQ高可用与幂等实践,能够在真实电商高并发场景中实现消息的高可靠、可恢复与防重复,帮助开发者快速落地稳定的消息系统。

http://www.dtcms.com/wzjs/194313.html

相关文章:

  • 东莞大岭山网站制作新闻近期大事件
  • 江门做网站哪家好网络推广及销售
  • 电子商务网站开发教程百度站长平台网站收录
  • 做视频挣钱的网站电商平台排行榜
  • 赣州培训网站开发建站服务
  • 官网招聘和招聘网站苏州搜索引擎排名优化商家
  • 网站后台管理系统怎么添加框黑龙江最新疫情通报
  • 营销网站建站公司转让网络推广与推广
  • 如何选择佛山网站建设怎样建立网站平台
  • 嘉兴专业自助建站免费咨询抖音推广
  • 门户类网站模板2022网络热词30个
  • 网站css代码河南seo外包
  • 购买模板做网站网上国网app推广方案
  • 企业网站部署计划seo超级外链发布
  • 深圳一百讯网站建设seo优化招商
  • 网站10月份可以做哪些有意思的专题网站有吗免费的
  • b2c电商seo搜索铺文章
  • 成都疫情防控最新消息排名优化方法
  • ppt做视频的模板下载网站有哪些万词霸屏百度推广seo
  • 樟木头网站建设线上平台怎么推广
  • 北京网络seo长沙网站seo收费标准
  • wordpress上传图片插件seo是搜索引擎吗
  • 江苏建设准考证打印在哪个网站网络推广企划
  • jsp做的网站后台信息网页加速器
  • 商务网站建设公司谷歌排名
  • 郑州福千欣隆网站建设有限公司郑州免费做网站
  • 投稿平台google seo
  • 郑州河北建设工程信息网站安徽网站优化
  • 哈尔滨专业建网站方案网站域名在哪买
  • 电商网站建设哪好搜索引擎优化技术有哪些