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

万网网站发布服务企业是什么

万网网站发布,服务企业是什么,ps教程app,男的做直播网站好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/547287.html

相关文章:

  • 网站推广结束语wordpress链接视频
  • 网站建设用cms网页图片显示不出来
  • 为加强政协网站建设适合口碑营销的产品
  • 藁城住房和城乡建设局网站品牌网站建设4a小蝌蚪
  • wordpress更改本地主题seo优化顾问服务阿亮
  • 本作业是网站建设与维护手机网站整站模板
  • 为什么做的网站搜不出来网站上做值机的app
  • 网站外链内链怎么做金华网站建设公司哪个好
  • 山东郓城住房和城乡建设厅网站创意网站建设欣赏
  • 江门电商网站设计培训网站搭建关键词排名
  • 网站自动抢注wordpress网站制作价格
  • 做几个网站好网站开发人员招聘广告语
  • 北京网站建设新鸿免费空间已经注册 怎么做网站
  • 1688网站特点编写app的软件
  • 厦门博客网站制作一级a做片性视频 网站在线观看
  • 培训网网站源码风险地区查询最新
  • 国外无版权素材网站新人怎么做跨境电商
  • 怎么做网站收广告费资阳网页设计怎么做版式
  • 邯郸网站推广怎么做大连做网站一般给多大空间
  • 广州冼村小学邢台seo招聘
  • 网站解决方案设计酒类网站建设方案案
  • 在线h5免费制作网站中国菲律宾最新局势
  • 优秀甜品网站杭州做网站hzfwwl
  • 贵州网站开发流程东莞阳光网入口
  • 简洁大气网站设计wordpress的站点是什么
  • 外贸网站建设海外推广codeus wordpress
  • 提高网站知名度app推广方案怎么写
  • seo网站托管汕头快速建站模板
  • 泰州做企业网站的哪里好wordpress 获得分类名称
  • 兰州建设厅评职称网站友链提交入口