RocketMQ:高可用性实施

RocketMQ RocketMQ能够有效解决系统解耦、流量削峰、异步处理等问题,提高系统的可扩展性和稳定性。 阅读详情

在优锐课的java学习分享中,我们探索了RocketMQ的HA实现。我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。

介绍

当我们谈论HA时,通常人们会想到故障转移机制。 但是,使群集可用于消息也被认为是HA。 在某种程度上,我认为这比仅提供经纪人更重要。 毕竟,用户可以并且将会感受到这种可用性的影响。

代码段

这是场景:
假设集群中有2个代理:master-a和master-b。 每个都有四个队列:master-a(q0,q1,q2,q3)和master-b(q0,q1,q2,q3)。 最后一条消息已发送给master-a q0。 现在,master-a退出了。

这里的目标是尽最大努力继续传递消息。
有两种可能性:

如果未检测到中断

在这种情况下,RocketMQ将重试3次:

org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl#sendDefaultImpl:
int timesTotal = communicationMode == CommunicationMode.SYNC ? 1 + this.defaultMQProducer.getRetryTimesWhenSendFailed() : 1;
for (; times < timesTotal; times++) {
    // ...
}

默认数字为三,并且是可配置的。 有三种发送机制:SYNC,ASYNC和ONEWAY。

如果已检测到中断

好。 现在的问题变成了:我们如何避免去掌握-a?
首先,我们需要设置sendLatencyFaultEnable = true,然后选择一个消息队列:

org.apache.rocketmq.client.impl.producer.TopicPublishInfo#selectOneMessageQueue:
public MessageQueue selectOneMessageQueue(final TopicPublishInfo tpInfo, final String lastBrokerName) {
   if (this.sendLatencyFaultEnable) {
     try {
      int index = tpInfo.getSendWhichQueue().getAndIncrement();
      for (int i = 0; i < tpInfo.getMessageQueueList().size(); i++) {
        int pos = Math.abs(index++) % tpInfo.getMessageQueueList().size();
        if (pos < 0)
          pos = 0;
        MessageQueue mq = tpInfo.getMessageQueueList().get(pos);
        if (latencyFaultTolerance.isAvailable(mq.getBrokerName())) {
          if (null == lastBrokerName || mq.getBrokerName().equals(lastBrokerName))
            return mq;
        }
      }
      final String notBestBroker = latencyFaultTolerance.pickOneAtLeast();
      int writeQueueNums = tpInfo.getQueueIdByBroker(notBestBroker);
      if (writeQueueNums > 0) {
        final MessageQueue mq = tpInfo.selectOneMessageQueue();
        if (notBestBroker != null) {
          mq.setBrokerName(notBestBroker);
          mq.setQueueId(tpInfo.getSendWhichQueue().getAndIncrement() % writeQueueNums);
        }
        return mq;
      } else {
        latencyFaultTolerance.remove(notBestBroker);
      }
    } catch (Exception e) {
      log.error("Error occurred when selecting message queue", e);
    }
    return tpInfo.selectOneMessageQueue();
  }
  return tpInfo.selectOneMessageQueue(lastBrokerName);
}

重要的部分是:
delayFaultTolerance.isAvailable(mq.getBrokerName()); (第13行)
在正常时间,发送消息时,它将调用updateFaultItem():

org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl#sendDefaultImpl
sendResult = this.sendKernelImpl(msg, mq, communicationMode, sendCallback, topicPublishInfo, timeout - costTime);
endTimestamp = System.currentTimeMillis();
this.updateFaultItem(mq.getBrokerName(), endTimestamp - beginTimestampPrev, false);

当发生中断时,将调用相同的方法:

endTimestamp = System.currentTimeMillis();
this.updateFaultItem(mq.getBrokerName(), endTimestamp - beginTimestampPrev, true);

incurrentLatency表示当前延迟,隔离是是否避免使用此代理的标志。即,传输成功后,请勿避免使用此代理。 否则请避免。

delaymax和notAvailableDuration算法中的两个核心变量。 如果发生故障,他们还决定startTimestamp的值。

从代码中,我们可以看到经纪人是否缺席,等待时间为30秒。 然后,我们将从下往上扫描latencyMax'' 直到找到一个小于currentLatency的数字。这是latencyMax’'和notAvailableDuration的默认值:

private long[] latencyMax = {50L, 100L, 550L, 1000L, 2000L, 3000L, 15000L};
private long[] notAvailableDuration = {0L, 0L, 30000L, 60000L, 120000L, 180000L, 600000L};

如果Isolation = true,则此代理将避免10分钟。 否则,它取决于消息的延迟。

FalutItem存储失败的代理的信息,包括其名称,延迟和避免开始的时间。

org.apache.rocketmq.client.latency.LatencyFaultToleranceImpl#updateFaultItem
public void updateFaultItem(final String name, final long currentLatency, final long notAvailableDuration) {
  FaultItem old = this.faultItemTable.get(name);
  if (null == old) {
    final FaultItem faultItem = new FaultItem(name);
    faultItem.setCurrentLatency(currentLatency);
    faultItem.setStartTimestamp(System.currentTimeMillis() + notAvailableDuration);
    old = this.faultItemTable.putIfAbsent(name, faultItem);
    if (old != null) {
      old.setCurrentLatency(currentLatency);
      old.setStartTimestamp(System.currentTimeMillis() + notAvailableDuration);
    }
  } else {
    old.setCurrentLatency(currentLatency);
    old.setStartTimestamp(System.currentTimeMillis() + notAvailableDuration);
  }
}

此类将更新失败的代理的状态。 并且还将决定是否恢复了代理并重新加入集群。 这是方法:

org.apache.rocketmq.client.latency.LatencyFaultToleranceImpl.FaultItem#isAvailable:

public boolean isAvailable() {
  return (System.currentTimeMillis() - startTimestamp) >= 0;
}

结论

到目前为止,我们已经检查了用于实现HA机制的主要代码块。 基本上,将尽最大努力来传递消息。 我们看到许多持续的轮询和重试。 这确实是企业级解决方案的现实。 通过显示此代码,我们想证明在确保集群的高可用性方面所做的努力。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群 V–(ddmsiqi)来交流学习,里面都是同行,验证【优快云2】有资源共享。
不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代
在这里插入图片描述

RocketMQ〖六〗消息的存储,高可用性机制,负载均衡 RocketMQ〖六〗消息的存储,高可用性机制,负载均衡一. 消息存储1. 存储介质2. 性能对比3. 消息的存储和发送1)消息存储2)消息发送4. 消息存储结构5. 刷盘机制1)同步刷盘2)异步刷盘3)配置二. 高可用性机制1. 消息消费高可用2. 消息发送高可用3. 消息主从复制1)同步复制2)异步复制3)配置4)总结三. 负载均衡1. Producer负载均衡2. Consumer负载均衡1)集群模式2)广播模式制作不易,转载请标注~ 一. 消息存储 分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。 消息生成者发送消息 MQ收到消息,将消息进行持久化,在存储中新增一条记录 返 立即下载

相关推荐

让 AI 变聪明的 20 条指令:如何让大模型回答得更精准、更专业、更实事求是

让 AI 变聪明,本质上不是写几句神奇咒语,而是把你的任务表达得更清楚,把事实标准设得更严格,把输出格式规定得更明确,把不确定性管理得更认真,把历史对话利用得更充分。大模型的强项是语言生成、信息组织、模式归纳和方案扩展;弱项是事实核验、实时更新、责任判断和对模糊意图的准确猜测。好的指令,就是在用人的判断弥补模型的弱点,让模型把强项发挥在正确的地方。

Sumarua的博客 1488

数据结构实验课_实验四 队列

一、实验内容 1.采用顺序存储实现循环队列的初始化、入队、出队操作。 2.采用链式存储实现队列的初始化、入队、出队操作。 3.编写一个程序,使用两个链队q1和q2,用来分别存储由计算机随机产生的20个100以内的奇数和偶数,然后每行输出q1和q2的一个值,即奇数和偶数配对输出,直到任一队列为空为止。 顺序存储 代码实现: #include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 //最大队列长度 typedef int E

zavay的博客 3836

态路小课堂丨三款800G光模块方案介绍—SR8/DR8/2FR4

800G QSFP-DD 2FR4光模块使用CWDM4波长(1271/1291/1311/1331nm),单通道速率为100G,通过MUX减小光纤的数目,其光学接口采用CS接口或双芯LC接口。

poposu的博客 2386

RocketMQ架构:客户端分析

test

天涯明月 503

【PLIO学习总结】laserMapping中的时间戳与状态更新逻辑

本文仅用于个人学习总结记录。如有错误,请批评指正。

larrydong的博客 1648

【软考高项】五十一、常见必会的几种进度网络图(单代号、双代号、七格图、横道图)

软考高项计算题进度网络图画图介绍

有莘不破的博客 3万+

RocketMQ源码6-producer 容错机制

本文主要是介绍一下RocketMQ消息生产者在发送消息的时候发送失败的问题处理?这里有两个点,一个是关于消息的处理,一个是关于broker的处理,比如说发送消息到broker-a的broker失败了,我们可能下次就不想发送到这个broker-a,这就涉及到一个选择broker的问题,也就是选择MessageQueue的问题。

BASK2311的博客 330

matlab/simulink saw谐振器仿真,基于Matlab的SAW模态耦合模型的仿真研究

第32卷 第 4 期Vol. 32 No. 4重 庆 理 工 大 学 学 报 (自然科学)Journal of Chongqing University of Technology( Natural Science)2 0 1 8年 4 月Apr. 2018doi : 10.3969/j . issn. 1674-8425(z). 2018.04.002本文引用格式 :李志鹏,马龙祥,孟旭,等•基...

weixin_36192634的博客 1385

【消息队列】RocketMQ架构及其可用性保证

RocketMQ结构组成及其可用性保证基础原理。

Transient_的博客 240

Arcgis空间分布方向性分析

Arcgis空间分布方向性分析 一、标准差椭圆方法概述 空间分布方向性分析是指区域经济属性在空间分布上的轮廓和主导方向。 标准差椭圆法是分析空间分布方向性特征的经典方法之一,使用标准差椭圆可 从全局的、空间的角度定量解释经济要素空间分布的中心性、展布性、方向性和 空间形态等整体性特征,因其直观性与有效性已得到广泛应用,已成为 Arc GIS 空间统计模块的常规统计工具。SDE 方法生成的结果为一个椭圆,从其生 成算法来看,首先用平均中心来确定椭圆的圆心,然后由平均中心作为起点 对 X 坐标

端木宛白的博客家园 4万+

[亚信线上教学] AX58100: EtherCAT从站设备仿真功能设计教学

什么情况需要开启EtherCAT从站设备仿真功能呢? 一般来说, 当EtherCAT从站产品,不需要使用额外的微控制器介入,或使用不具备EtherCAT从站通讯协议栈的微控制器一同协作的情况下,就必须开启EtherCAT从站设备仿真功能,这样EtherCAT主站才能够正常设置从站设备的工作状态. 亚信AX58100 EtherCAT从站控制芯片的优点 AX58100 EtherCAT从站控制器, 集成2个百兆以太网Phis, 并支持一些额外的控制接口, 例如脉冲宽度调变, 增量, 霍尔编码器, .

allanchou1的专栏 7422

RocketMq 高可用性解析(一)存储高可用

引言 RocketMq 作为一个成熟的消息中间件,自身保证了高可用性。学习RocketMq中的高可用性可以帮助我们自己在平时编写代码时能够编写处高可用的代码。 对于RocketMq,高可用主要在这四块进行保证 消息发送的高可用:在消息发送时可能会遇到网络问题、Broker 宕机等情况导致消息没有发送成功 消息存储的高可用:在 RocketMQ 中消息存储时Broker发生故障导致消息没有保存下来 消息消费的高可用:可能由于网络原因导致,也可能由于业务逻辑错误导致消息一直消费失败 集群管理的高可用:整一个

曳凡的博客 3608

FPGA实现AXI-Stream通信

本文介绍了在FPGA中实现AXI-Stream接口的工业级方案,重点解析了核心协议信号(TVALID/TREADY/TDATA/TLAST)与可选扩展信号,并提供了Verilog最小化实现示例。文章详细阐述了握手协议规则、时序约束方法,以及吞吐量优化技巧(如寄存器切片和双缓冲策略),同时给出了跨时钟域处理的异步FIFO解决方案。此外,还包含验证调试方法(Testbench结构和ILA触发设置)和典型应用场景(视频处理/网络传输),最后提供了资源消耗参考数据。该实现方案严格遵循Xilinx/Intel官方规范

whm128的博客 1464

RocketMq详解:一、RocketMQ 介绍及基本概念

RocketMQ 是阿里巴巴开源的分布式消息中间件,现已成为 Apache 软件基金会的顶级项目。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等组件组成。

zhiyikeji的博客 2万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RocketMQ 集群与高可用性:深入解析与实践指南

在分布式消息中间件的设计与部署中,高可用性是确保系统稳定运行和业务连续性的关键因素。本文主要从集群的高可用与数据持久化两方面进行分析,并富有实战的简单集群搭建示例。

StaticKing的博客 1901

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

RocketMQ高可用性机制

一、分布式集群 RocketMQ分布式集群是通过Master和Slave的配合达到高可用性的。 Master和Slave的区别:在Broker的配置文件中,参数brokerId的值为0表明这个Broker是Master,大于0表明这个Broker是Slave,同时brokerRole参数也会说明这个Broker是Master还是Slave。 Master角色的Broker支持读和写,Slave角色的Broker仅支持读,也就是 Producer只能和Master角色的Broker连接写入消息;Cons.

HX_2021 1395

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RocketMQ 的高可用性:主从复制与多副本保证

高可用性(High Availability,HA)指系统在面临硬件故障、软件错误或其他意外情况下,仍能提供连续服务的能力。在消息队列系统中,高可用性尤为重要,因为它直接影响数据的可靠性和服务的持续性。

FireFox1997 1273

RocketMQ(五)RocketMQ高可用性机制

RocketMQ(六)RocketMQ高可用性机制

一恍过去 1万+

rocketMQ之十三 高可用性

高可用性机制 RocketMQ分布式集群是通过Master和Slave的配合达到高可用的 Master和Slave的区别:Broker配置文件中,参数brokerId的值为0带包这个Broker是Master,大于0是Slave Master角色的Broker支持读和写,Slave角色的Broker仅支持读 消费高可用 有了主从结构之后,内部实现了自动切换,当Master不可用或繁忙的时候,...

weixin_42672777的博客 259

Go微服务: 基于rocketmq:5.2.0搭建RocketMQ环境,以及示例参考

参考最新官方文档:https://rocketmq.apache.org/zh/docs/quickStart/03quickstartWithDockercompose 以及:https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard 综合以上两个文档来搭建环境

Wang的专栏 1932

RocketMQ优势剖析-容错性和高可用性

RocketMQ在设计上强调了容错性和高可用性,这使得它成为构建可靠分布式系统的重要组件。

Lin_Miao_09的博客 661

RocketMQ是如何处理消息的高可用性的?

RocketMQ 通过多种机制来确保消息的高可用性,这些机制涵盖了从消息发送、存储到消费的整个生命周期。

qq_33240556的博客 767

14.RocketMQ之高可用性机制

1.2 高可用性机制 RocketMQ分布式集群是通过Master和Slave的配合达到高可用性的。 Master和Slave的区别:在Broker的配置文件中,参数 brokerId的值为0表明这个Broker是Master,大于0表明这个Broker是 Slave,同时brokerRole参数也会说明这个Broker是Master还是Slave。 Master角色的Broker支持读...

qq_30635523的博客 1873
上一篇: 微服务的设计模式(二)
下一篇: 最佳解读整理 Spring Bean生命周期:使用Spring Aware接口
程序员plus
博客等级 码龄8年 41粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值