这是我参与8月更文应战的第3天,活动概略查看:8月更文应战

前语

文本已收录至我的GitHub库房,欢迎Star:github.com/bin39232820…
种一棵树最好的时刻是十年前,其次是现在
我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Java菜鸟学习群,群聊号码:549684836 鼓舞咱们在技术的路上写博客

唠叨

上一章现已完毕大部分的根底学习,这个咱们就来学习学习实在的根线程池的七个参数底案例吧,嘻嘻。

  • 小六六带咱们来撸撸rocketmq(一)
  • 小六六带咱们来撸撸rocketmq(二)
  • 小六六带咱们来撸撸rocketmq(三)
  • 小六六带咱们来撸撸rocketmq(四)

音讯存储

分布式部队由于有高可靠性的要求,所以数据要进行耐久化存算法是什么储。

小六六带我们来撸撸rocketmq(五)

  1. 音讯生成者发送音讯
  2. MQ收线程池创立的四种mysql暗码忘记了怎么办音讯,将音讯进行耐久化,在存储中新增一条记载
  3. 回来ACK给生产者
  4. MQ push 音讯给对应的顾客,索引失效然后等候顾客回来ACK
  5. 假定音讯顾客在指守时刻内成功回来ack,那么MQ以为消算法的时刻复杂度取决于息消费成功,在存application储中删去音讯,即实行第6步;假定MQ在指守时刻内没有收到ACK,则以为音讯消费失利,会检验从头push消mysql增修改查句子息,重复实行4、5、6进程
  6. M算法的有穷性是指Q删去音讯

存储介质

  • 联络型数据库DB

Apache下开源的其他一款MQ—ActiveMQ(默许选用的KahaDB做音讯存储)可选用JDBC的方法来做音讯耐久化,经过简略的xml装备信息即可完毕JDBC音讯存储。由于,一般联络型数据库(如Mysql)在单表数索引是什么意思据量抵达算法的时刻复杂度取决于千万等级的状况下,其IO读写功用往往会呈现瓶颈。在可靠性方面,该种计划非常依托DB,假定一旦DapplicationB呈现缺陷,则算法的时刻复杂度是指什么MQ的音讯就无法落盘存储会导致线上缺陷

  • 文件体系

现在业界较为常用的几款产品(RocketMQ/Kafka/RabbitMQ)均选用的是音讯刷盘mysql优化至所安置虚拟机/物理机的文件体系来做耐久化(刷盘一般能够分为异步刷盘和同步刷盘两种方法)。音讯刷盘为音讯存储供应了一种高效率、高可靠性和高功用的数据耐久化方法。除非安置MQ机器自身或是本地磁盘挂了,否则一般是不会出算法导论现无法耐久化的缺陷问题。

小六六带我们来撸撸rocketmq(五)

功用比照

文件体系>联络型数据库DB

音讯的存储和发送

  • 音讯存储

磁盘mysql装置装备教程假定运用妥当,磁盘的速度彻底能够匹配上网络 的数据传输速度。现在的高功用磁盘,次序写速度能够抵达600MB/s, 跨越了一般网卡的传输速度。但是磁盘随机写的速度只要大概100KB/s,和次序写的功用相差6000倍!由于有如此巨大的速度不同,算法的时刻复杂度取决于好的音讯部队体系会比一般的音讯部队系APP统速度快多个数量级。RocketMQ的音讯用次序算法的有穷性是指写,确保了音讯存储的速度。

  • 音讯发送

Linux操作线程撕裂者体系分为【用户态】和【内核态】,文件操算法的时刻复杂度是指什么作、网络操作需求涉索引及这两种形状索引失效的切换,免不了进行数据复制。

一台服务器 把本机磁盘文件的内容发送到线程数客户端,一般分为两个进程:

1)read;读取本地文件内容;

2)write;将读取的内容经过网络发送出去。

这两个看似简略的操作,实践进行了appointment4 次数据复制,分别是:

  1. 从磁盘复制数据到内核态内存;
  2. 从内核态内存复 制到用户态内存apple
  3. 然后从用户态 内存复制到网络驱动的内核态内存;
  4. 毕竟是从网络驱动的内核态内存复 制到网卡中进行传输。

小六六带我们来撸撸rocketmq(五)

经过运用mmap的方法,能够省去向用户态的内存复制,前进速度。这种机制在Java中是经过MappedByteBuffer完毕的

RocketMQ充分利用了上述特性,也就是所谓的“零复制”技术,前进音讯存盘和网络发送的速度。

这儿需求留神的是,选用MappedByteBuffer这种内存映射的方法有几个捆绑,其间之一是一次只能映射1.5~2G 的文件至用户态的虚拟内存,这也是为何RocketMQ默许设置单个CommitLog日志数据文件为1G的原因了

音讯存储结构

RocketMQ音讯的存储是由ConsumeQueue和CommitLog协作完毕 的,音讯实在的物理存储文件是CommitLog,Consmysql数据库umeQueue是音讯的逻辑部队,类似数据库的索引文件,存储的是指向物理存储的地址。每 个Topic下的每个mysql暗码忘记了怎么办Message Queue都有一个对应的Co索引符号nsumeQueue文件。

小六六带我们来撸撸rocketmq(五)

  • CommitLog:存储音讯的元索引页是哪一页数据
  • ConsumerQueue:存储音讯在CommitLog的索引
  • Indexmysql面试题File:为了音讯查询供应了一种经过key或时刻区间来查询音讯的方法,这索引失效种经过IndexFile来查找音讯的方法不影响发送与消费音讯的主流程

刷盘机制

RocketMQ的音讯是存储到磁盘上的,这样既能确保断电后康复, 又能够让存储的音讯量超出内存的捆绑。RocketMQ为了前进功用,会尽或许地确保磁盘的次序写。音讯在经过Producer写入RocketMQ的时 候,有两种写磁盘方法,分布式同步刷盘和异步刷盘。

小六六带我们来撸撸rocketmq(五)

  • 同步刷盘

在回来写成功状况时,音讯现已被写入磁盘。具体流程是,音讯写入内存的PAGECACHE后,马上告诉刷盘线程刷盘, 然后线程安全等候刷盘完毕,刷盘线程实行完毕后唤醒等候的线程,回来音讯写 成功的状况。

  • 异步刷盘

在回来写成功状况时,音讯或许只是被写入了内存的PAGECACHE,写操作的回来快,吞吐量大;当内存里的音讯量堆集到索引超出矩阵维度必定程度时,一致触发写磁盘动索引作,快速写入。

  • 装备

同步刷盘仍是异步刷盘,都是经过Broker装备文件里的flushDiapplicationskType 参数设置的,这个参数被装备mysql面试题成SYNC_FLUSH、ASYNC_FLUSH中的 一个appointment

高可用性机制

小六六带我们来撸撸rocketmq(五)

RocketMQ分布式集群是经过Master和Slave的协作抵达高可用性的。

Master和Slave的差异:在Broker的装备文件中,参数 brokerId的值为0标明这个Broker是Master,大于0标明这个Broker是 Slave,一起brokerRole参数也会阐明这个Bmysql面试题roker是Mastapp是什么意思er仍是Slave。

Master人物的Broker支撑读索引失效和写,Slave人物的Broker仅索引失效支撑读,也就是 Producer只能和Master人物的Broker联接写入音讯;Consumer能够联接 Master人物的Broker,也能够联接Slave人物的Broker来算法的时刻复杂度是指什么读取音讯。

音讯消费高可用

在Conappearancesumer的装备文件中,并不需求设置是从Master读仍是从Slave 读,当Master不可用或许繁忙的时分,Consumer会被主动切换到从Slave 读。有了主动切换Consumer这种机制,当一个Master人物的机器呈现缺陷后,Consumer依然能够从Slave读取音讯,不影MySQL响Consumer程序。这就抵达了消费端的高可用性。

音讯发送高可算法工程师

在创立Topic的时分,把Topic的多个Message Queue创立在多个Broker组上(相同Broker称谓,不同 brokerId的机器组成一个Broker组),这样当一索引页是哪一页个Broker组的Master不可 用后,其他组的Master依然可用,Producer依然可MySQL以发送音讯。 RocketMQ现在还不支撑把Sla算法的时刻复杂度是指什么ve主动转成Master,假定机器资源缺少, 需求把Slave转成Masapplicationter,则要手动中止Slave人物的Broker,更改装备文 件,用新的装备文件建议Broker。

小六六带我们来撸撸rocketmq(五)

音讯主从复制

假定一个Broker线程池创立的四种组有Master和Slave,音讯需求从Master复制到Slamysql装置ve 上,有同步和异步两种复制方法。

同步复制

同步复制方法是等Master和Slavapprovee均写 成功后才反应给客户端写成功状况;

在同步复制办approve法下,假定M线程数aster出缺陷, Slave上有悉数的备份数据,简单康复,但是同步复制会增大数据写入 推迟,下降体系吞吐量。

异步复制

异步复制方法是只需Master写成功 即可反应给客户端写成功状况。

在异步复制方法下,体系具有较低的推迟和较高的吞吐量,但是假定Master出了缺陷,有些数appearance据由于没有被写 入Slave,有或算法与数据结构许会丢掉;

装备

同步复制和异步拷mysql面试题贝是经过Broker装备文件里的brokerRole参数进行设置的,这个参数能够被设置成ASmysql怎么读YNC线程池的七个参数_MASTER、 SYNC_MASTER、SLAVE三mysql增修改查句子个值中的一个。

总结

小六六带我们来撸撸rocketmq(五)

实践运用中要结合事务场景,合理设置刷盘方法和主从复制方法, 尤其是SYNC_FLUSH方法,由于一再地触发磁线程的几种状况盘写动作,会显着下降 功用。一般状况下,应该把Master和Save装备成ASYNC_FLUSH的刷盘 方法,主从之间装备成SYNC_MASTER的拷mysql数据库命令大全贝方法,这样即便有一台 机器出缺陷,依然能确保数据不丢,是个不错的挑选。

负载均衡

Producer负载均衡

Producer端,每个实例在发音讯的时分,默许会轮询悉数的message queue发送,以抵达让音讯均匀落在不同的queue上。而由于queue能够散落在不同的brokermysql数据库,所以音讯就发送到不同的broker下,如下图:
小六六带我们来撸撸rocketmq(五)

图中箭头线条上的标号代表次序,发布方会把第一条消线程和进程的差异是什么息发送至 Quemysql装置装备教程ue 0,然后第二条音讯发送至 Queue 1,以此类推。

Consu算法是什么mer负载均衡

集群方法

在集群消费方法下,每条音讯只需求投递到订阅这个topic的Consumer Group下的一个实例即可。RocketMQ选用主动拉取的方法索引贴拉取并消费音讯,在拉取的时分需求明晰指定拉取哪一条message queue。

索引贴每当实例的数量有改变,都会触发一次悉数实例的负载均衡,这时分会依照queue的数量和实例的数量均匀分配queue给每个实例。

默许的分配算法是AllocateMessageQueueAveragely,如下图:

小六六带我们来撸撸rocketmq(五)

还有其他一种均匀的算法是AllocateMessageQueueAveragelyByCircle,也是均匀分摊每一条queue,只是以环状轮流分qmysql暗码忘记了怎么办ueue的方法,如下图:

小六六带我们来撸撸rocketmq(五)

需求留appreciate心的是,集群方法下,queue都是只容许分配只一个实例,这是由于假定多个实例一起消费一个queue的音讯,由于拉取哪些音讯是consumer主动控制的,那样会导致同一个音讯在不同的实例下被消费多次,所以算法上都是一个qu索引是什么意思eue只分给一个consum索引失效的几种状况er实例,一个consumer实例能够容许一起分到不同的queue。

经过增加cons线程的几种状况umer实例去分mysql数据库命令大全摊queue的消费,能够起到水平扩展的消费才能的效果。而有实例下线的时分,会从头触发负载均衡,这时分本来分配到的queue将分配到其他实例上持续消费。

但是假定consumer实例的数量比message queue的总数appstore量还线程池面试题多的话,多出来的consumer实例将无法分到queue,也就无法消费到音讯,也就无法线程池起到分摊mysql装置负载的效果了。所以需求控制让queue的总数量大于等于consumer的数量。

播送方法

由于播送方法下要求一条音讯需求投递到一个消费组下面悉数的顾客实例,所索引有哪几种类型以也就没有音讯被分摊消费的说法。

在完毕上,其间一个不同就是在consumer分配queue的时分,悉数consumer都分到悉数的queue。

小六六带我们来撸撸rocketmq(五)

音讯重试

次序音讯的重试

关于次序音讯,当顾客消费消mysql暗码忘记了怎么办息失利后,音讯部队 RocketMQ 会主动不断进行音讯重试(每次距离时刻为 1 秒),这时,运用会呈现音讯消费被阻塞的状况。因而,在运用次序音讯时,务必确保运用能够及时监控并处理消费失利的状况,防止阻塞现象的发生。

无序音讯的重试

关于无序音讯(一般、守时、延时、事务音讯),当顾客消费音讯失利时,您能够经过设置回来状况抵达音讯重试的成果。

无序音讯的重试只针对集群消费算法的五个特性方法收效;播送方法不供应失利重试特性,即消费失利后,失利音讯不再重试,持续消费新的音讯。

#### 重试次数

音讯部队 RocketMQ 默许容许每条音讯最多重试 16 次,每次重试的距离时刻如下:

小六六带我们来撸撸rocketmq(五)

假定音讯重试 16 次后依然失利,音讯将不再投递。假定严厉appearance依照上述重试时刻距离核算,某条音讯在一贯消费失利的前提下,将会在接下来的算法与数据结构 4 小时 46 分钟之内进行 16 次重试,跨越这个时刻规划音讯将不再重试投递。

留神: 一条音讯不管重试多少次,apple这些重试音讯的 Message ID 不会改动。

装备方法

消费失利后,重试装备方法

集群消apple费方法下,音讯消索引失效费失利后期望音讯重试,需求在音讯监听器接口的完毕中明晰算法的时刻复杂度是指什么进行装备(三种方法任选一种):

  • 回来 Action.ReconsumeLater (举荐)索引是什么意思
  • 回来 Null
  • 抛出异常
public class MessageListenerImpl implements MessageListenerappreciate {
@Override
publimysql面试题c Action consume(Message message索引, ConsumeContext cont索引的效果及优缺陷ext) {
//处理音讯
doConsumeMess线程池age(message);
//方法1:回来 Action.ReconsumeLater,音讯将重试
rAPPeturn Action.ReconsumeLater;
//方法2:回来 null,音讯将重试
return null;
//方法3:mysql数据库直接抛出异常, 音讯将重试
throapproachw new RuntimeException("Consumer Message exceotion");
}
}

消费失利后,不重试装备方法

集群消费方法下,音讯失利后期望音讯不重试,需求索引的效果及优缺陷捕获消费逻辑中或许抛出的异常,毕竟回来 Action.CommitMesmysql优化sage,此后这条音讯将不会再重试。

public class MessageLisappeartenerImpl implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext context) {
try {
doConsumeMessage(message);
} c索引失效atch (Thro线程安全wable e) {算法的时刻复杂度是指什么
//捕apple获消费算法的时刻复杂度是指什么逻辑中的悉数异常,并回来 Action.CommitMessagemysql增修改查句子;
return Action.CommitMessage;
}
//音讯处理正常,直接回来 Action.CommitMessagappeare;
return Action.CommitMessage;
}
}

自定义音讯最大重试次数

音讯部队 RocketMQ 容许 Consumer 建议的时分设置最大重试次数,重试时刻距离将依照如下战略:

  • 最大重线程池的七个参数试次数小于等于 16 次,则重试时刻距离同上表描述。
  • 最大重试appointment次数大于 16 次,跨越 16 次的重试时刻距离均为每次 2 小时。
Properties properties = new Proper算法的时刻复杂度是指什么ties();
//装备对应 Group ID 的最大音讯重试次数为 20 次
properties.put(PropertyKeyConst.MaxReconsumeTimes,"20");
Consumer consumer =ONSFactory.cr线程安全eateConsumer(pr线程的几种状况operties);approve

留神:

  • 音讯最大重试次数的设置对相同 Group ID 下的悉数 Co线程池的七个参数nsummysql增修改查句子er 实例有用。
  • 假定只对相同 Group ID 下两个 Consumer 实例中的其间一个设置了 MaxReconsumeTimes,那么该装备对两个 Consumer 实例均收效。
  • 装备选用掩盖的方法收效,即毕竟建议mysql增修改查句子的 Consumer 实例会掩盖之前的建议实例的装备

死信部队

当一条音讯初度消费失利,音讯部队 RocketMQ 会主动进行音讯重试;抵达最大重试次数后,若消费依然失利,则标明顾客在正常approve状况下无法正确地消费该音讯,此刻,音讯部队 Rocket算法规划与分析MQ 不会马上application将音讯丢掉,而算法的五个特性是将其发送到该顾客对应的特别部队中。算法的时刻复杂度是指什么

在音讯部队 RocketMQ 中,这种正常状况下无法被消费的音讯称为死信消线程是什么意思息(Dead-Let线程和进程的差异是什么ter Message),存储死信音讯的特别部队称为死信部队(Dead-Letter Queue)。

死信特性

死信音讯具有以下特性

  • 不会再被顾客正常消费。
  • 有用期与正常音讯相同,均为 3 天,3 天后会被主动删去。因而,请在死信音讯发生后的 3 天内及时处索引符号理。

死信部队具有以下特性:

  • 一个死信部队对应一个 Group ID, 而不是对应单个顾客实例。
  • 假定一个 Group ID 未发生死信音讯,音讯部队 RocketMQ 不会为其创立相应的死信部队。
  • 一个线程死信部队包含了对应 Group索引页是哪一页 Imysql索引D 发生的悉数死信音讯,不论该音讯归于哪个 Topic。

查看mysql装置死信信息

在控制台查询呈现死信部队的主题信息

小六六带我们来撸撸rocketmq(五)

在音讯界面依据主题查询死信音讯

小六六带我们来撸撸rocketmq(五)

挑选从头发送音讯

一条音讯进入死算法与数据结构信部队,意味着某些要素导致顾客无法正常消费该音讯,因而,一般需求您对其进行特别处理。排查可疑要素并解决问题后,能够在音讯部队 RocketMQ 控制台从头发送该音讯,让顾客从头消费一次。

消费幂等

在互联网算法运用中,尤其在网络不稳定的状况下,音讯部队 RocketMQ 的音讯有或许会呈现重复,这个重复简略算法的时刻复杂度取决于能够概括为以下状况:

  • 发送时音讯重复

当一条音讯已被成功mysql面试题发送到服务端并完毕耐久化,此刻呈现了网络闪断或许客户端宕机,导致服务端对客户端应对失利。 假定此刻生产者意识到音讯发送失利并检验再次发送音讯,顾客后续会收到两条内容相同而且 Message ID 也相同的音讯。

  • 投递时音讯重复

息消费的场景下,音讯已投递到顾客并完毕事务处理,当客户端mysql增修改查句子给服务端反应应对的时分网络闪断。 为了确保音讯至少被消费一次,音讯部队apple RocketMQ 的服务端将在索引贴网络康复后再次检验投递之前已被处理过的音讯,顾客后续会收到两条内容相同而且 Message ID 也相同的音讯。

  • 负载均衡时音讯重复(包含但不限于网络颤抖、Broker 重启以及订阅方运用重启)

当音讯部队 RocketMQ 的 Bromysql数据库ker 或客户端重启、扩容或缩容时,会触发 Rebalance,此刻顾客或许会收到重复音讯。

处理方法

由于 Message ID 有或许呈现抵触(重复)的状况,所以实在安全的线程数幂等处理,线程安全不建议以 Message ID 作为处理依据。 最好的方法是以事务仅有标识作为幂等处理的要害依据,而事务的仅有标识能够经过音讯 Key 进行设置:

Message message = new Message();
message.setKey("ORDERID_mysql索引100");
SendResult sendResult = producer.send(message);

订阅方收到音讯时能够依据音讯的 Key 进行幂等处理:

consumer.subscribe("ons_test",线程撕裂者 "*", new MessageListener() {
public Action cons算法的时刻复杂度取决于ume(Message message, ConsumeContext context) {
String key = message.线程数getKey()
// 依据事务仅有标识的 key 做幂等处理
}
});

完毕

持续学习的是一些概念内的东西。咱们加油!

日常求赞

好了各位,以上就是这篇文章的悉数内容了,能看到这儿的人呀,都是真粉

创造不易,各位的支撑和认可,就是我创造的最大动力,咱们下篇文章见

六脉神剑 | 文 【原创】假定本篇博客有任何错误,请批判指导,不胜感激 !