00:03
好,那么下面我们来看啊,第一个就是同步发送失败策略。对于普通消息啊,消息发送默认采用的是轮询策略。选择是要发送的队列对吧,它是轮巡的,就是一个一个挨着来,呃,如果发送失败,那么默认重试两次,这从事次数啊,我们前面就给大家说过。我们可以修改啊,呃,我是这样的啊,我把这这里边这个代码呢,除了这个文安会以外,另外的三个,呃这是异步的,呃这是同步的,这是我们的消费者啊,我又考不到这儿,他就有串这啊又考不到有串者,呃然后。这这个没啥用处啊。这没啥用处,有伤的。然后我们看这个同步发送。这我们以前就拷贝过那些代码,我们在这儿不是写过吗,你看。
01:02
是吧,这设置。呃。呃,就是。设置异步,我们现在要要的是同步是吧,我们要的是同步啊。这要同步啊,这这是我们要的是同步。对吧,同步不是这个。Set。嗯。瑞,这不是这个吗?这是同步。是吧,这是三。当然异步的,那我们一会儿一说也就知道了是吧,呃,同步发送重试啊,这是两次是吧。要那那要这样的话啊,我们我们这儿这个代码这儿稍改一下。没注意啊。
02:00
哎,这这我们这儿写的没错是吧,这没错,这拷贝过来这个,呃,那是是不是啥时候又又改动了一下啊。那那就这样,原来我们写的这是没错的啊。然后呢,这还有个什么发送超时实现。啊,发射超时时间啊,呃,默认是三秒,我们这是给它设成五秒。是吧,啊这些啊,我们可以。呃,就是在这儿可以给他修改。给大家照个图。呃,把它代码往这一放,大家就知道怎么怎么个改法是吧。是吧,这样就看得。更清晰一些啊。然后呢?对吧,但是在从事时是不会选择上次发送失败的broke,而是选择其他broke。
03:03
什么意思啊,什么意思?我这次给。我我我我这里边啊,有有好多主机,你注意这主机。有好多主机,主机里边是不是,呃,又有不同的。那又有不同的就是Q吧,这里面也有Q。啊,可能里边Q数量也不一样啊。有Q,那么我这个producer。我假设啊,这次发送的时候,我给它里边写。给这个里边写失败了,我要重试,重试的时候。他会给谁?会给这个主机,或者这个主机里边。但他不会挑他。都不会调这个Q。他选择主机为什么很简单呢?你原来给他发的时候,给这个主机发的时候他。他出问题了,所以我再给你发的,那那它出问题的概率就比较高。
04:06
是吧,所以他会选择其他的broke。答了,你如果说只有一个broker。你注意啊,呃。写上的,当然,若只有一个brokeer,那它就不发了吗?那不是啊啊七。也只能。呃。发送。但其会。什么?尽量。发送到。呃,尽量发送到这个这个这个。其他。发生的该。Broker上的。其他。是。就我反正是要给你避开一些。
05:00
为了保证我再次发送的时候成功率高一些。也正因为这些原因,所以大家想一下我们说的第一个,那说明里边。说这个顺序消息是没有重复重试机制的,为什么?顺序消息它都是在一个Q上。对不对,顺序消息都是在一个Q上。所以它上面就。它它上边没有从事机制啊,这个顺序效应没有从事机制。啊,就。就在这儿啊,发送的时候啊,发送的时候没有这个充值机制啊。呃。然后呢?呃,我们。再看这。继续啊。再说了。同时。Booker还具有。还具有这个这个失败隔离的功能。
06:02
博克还具有失败隔离的功能。呃,是producer,尽量呃,选择未发生过失败的brokeer的目标,这什么意思啊?其实换个角度来说啊,呃,就是。我们这个失败隔离。注意啊。失败。格林。就失败隔离啊他。是为了保证什么?保证其他消息。在发送的时候尽量不发给那些问题broke,你注意啊。呃。其可以保证,呃。其他消息,呃。尽量,呃。Down。问题。
07:04
问题就是曾经出现过问题的brokeer。但这个东西啊,给大家说说。是什么意思呢?就我们前面说的这个重发呀,一直说的都是啊,这个这个这个这个呃。就我这条消息发送失败了是吧?啊都是说的啊呃。啊,这是这是比如说Q是吧,这是Q啊,不管在哪个上啊,不管在哪个broke上,这是Q是吧。呃,或者或者这样说吧,这是博ER啊,咱咱不说Q啊,这是这都是博ER,三个博ER是吧,我前面说啊,你生产者我给他上班发消息的时候啊,呃,这个出现问题了,我重发,重发的时候我给他。或者给他是吧。那这是好理解的,那为什么?咱们说这个失败隔离指的什么呢?你这个消息啊,不管怎么样发送成功了,我同事经过同事我成功了啊。
08:05
还有下一条消息要发呀,下一条消息它采用的是轮询方式。采用的,比如说啊,我我们给他发啊,这个失败了是吧,然后给他发成功了。第二条消息啊呃,第一条消息给他发失败了,然后给他重试成功了,这是第一条消息,紧接着我要发第二条消息,第二条息也发的轮询方式,发给谁了,发给他了,对吧,你第一条最终是写给他了。那第三条呢?第三条给谁了?第三条是不是又又该给他了?给他又失败了?是不是从事又倒上了?所以也就是说,我们。我们这种如果啊,不采用失败隔离,就是最终这个消息也能写到我们的broke,他也不会丢。他这个效率会低,我都要做重试,通过重试最终成功。
09:06
对不对,所以呃,就是就是我们这个失败隔离啊,呃,其可以保证其他消息尽量不发送到我们的。啊,就是为了提高我们这个,呃。消息发送的这个效率。是吧,呃,然后然后然后这个这个这个。降低我们消息发送的这个耗时。对吧。对。提升。消息。效率。呃。降低。降低。消息发送。呃。考试。对吧。对。那么这里边啊,咱们再进一步的老师再给大家引申一些啊。
10:04
再引申一些,这个你要知道producer啊。就我们的生产者里边,他实际上是维护着,呃列表,呃有谁有谁呢,就是博。是吧,这些,当然这些brokeer从哪来的,这些broke肯定是从内serve过来的是吧?然后他在它本身的缓存里面肯定是有这一堆broke,我要选择啊,选择谁是吧进行发送的,那现在我要避开这些有问题的brokeer,那那我怎么知道你是有问题的呢。所以我们希望思考这个问题啊,就是怎怎么就知道他是这个博,这个是有问题,那个是没问题的呢。其实这个啊,呃,我们自己思考一下,如果让我们实现这个功能怎么做。就实现这个失败隔离功能。我们自己思考一下。思考。
11:01
思考啊,让我们自己的实现。呃。失败。隔离。呃。如何?如何来做?怎么做?是不是怎么做?我们怎么样能避开这些问题?Broke,这些有案底的broke。其实我们想一想啊,我们其实也可以这样啊。大家想想这样行不行,比如说我producer啊,我给他呃来一个集合。那第一种方案啊,我们深入的思思考一下这个问题啊,比如说我第一种方案,嗯,方案一是吧,呃,说。啊中,呃,这个维护。呃,维护。呃。某。
12:00
麦克,我还要map。某Mac即可。是吧,啊,其他的K是什么?K是时间是。发生,呃,失败啊,消息发送失败的。时间。是吧,啊是这样,当然这个map肯定是一个维护的,就是就是定是我们的。是吧,啊呃,因为这里边什么呢,博啊好多呃。呃,Guc的map,呃,我们其实用不着C的,还真是用不着C的,为什么?因为这个producer就我自己。是吧?就我自己,当然我们如果要GC的也行,表我发送线程可以是多个。是不管哪个县城。呃,我我发送只要失败了,所以用doc的也行,你多线程的是吧,那么它的K,呃是什么呢?是发送失败的时间车,然后value是什么呢。
13:08
就是。Broke chi力对吧,Whether是broke chi。呃。你只要发生这种这种。呃,发送失败了,我就把你这个时间。把你这个博实力给你往这里边儿一放,但同时啊,你注意他应该啊呃。说。比赛中还维护着啊一个。集合,这个集合我们其实用list完全是可以的啊,文合集合,呃,其中。陈放长。呃,所有。对。呃,发生,呃。这个发送。以强的。
14:04
对吧,只要你发生异常了啊,那我马上就给你扔到这个里边爬出,从这里边给你踢出去。但是这里面还有个问题。就一旦扔到这个里边了,但是我最终选择的啊,选择呃目标呃。Broker。Foroc。呃,选择目标是。从呃。该。我这儿写一个吧,就是啊。假设是个list啊,List或者set吧,无序性这个就无序就可以了。呃,选择该目标。Broker是从该。Set集合中。呃。选择的是吧,我是从他里边选。从它里边选,那这样啊,也就是说我选的时候都从这个赛集合选,这里边有个问题。
15:05
那你要都发生过呢?都发生过,那那是不是都扔到它里边了,那那不就拉倒了,那这里边就没有了,没有可用的了,所以我们应该是不是在设计的时候再设计一个什么。来个定时定时任务。让他定期,因为这里边有时间呢,定期清理那些。啊,很长时间没有发生过这个异常的,我给你清理数据是吧?嗯。应该呃,再定义一个呃,定时任务。呃。定期从。呃。Snap。集合中,呃。将呃。有。长期。
16:01
将长期呃。八。发送异常。的。请。出去啊。出去。添加到set。集合对不对,你这样的话就可以啊,一直在一直在做,这样是不是要合理一些。对吧,这样就合理一些啊。呃。那除了以外,有没有其他的方式,其实也有啊,比如说我们可以再来一个简单一些的方案。是吧,简单一些的方案,那我就为这个啊。呃,我就问ER,比如说这个类似于像这这样一个赛集合是吧,我这个赛集合里边这些,呃。
17:00
都给你添加一个。Go。That way。喂。说。User中的。Broker,吃力。添加一个。标识,比如说这个标识啊,呃,例如呃。是一个什么的。Atomic。属性,包括添加这样一个属性是吧,啊,只要你只要呃。上啊发生过呃,异常就是发送异常啊。发送。非常。那就七。呃,去为。
18:01
嗯,志为,比如说呃出版你发生过异常了啊,比就志为触。是吧?那选择。目标,呃。Work。就是选择。呃。该属性值为。Bo。对吧,我仍然是便利,我便利博便利到你一看哟,你是出我就再选下一个。是不是这样也可以,但是仍然存在这个问题啊,就是我们不能让它一直是。啊,一直是这个这个这个呃。For一直出是吧,我们也应该设置一个定时任务。把定时任务,我定时把这个再给你改成force是吧,所以他他也应该啊,呃,再定一个定时任务定期。
19:04
定期啊。将将这个。Walker,的的的的的。该。该属性。起来。是吧,具体的知分,但这种方案实际上你这里边存在一个问题,就是,但这个时间你这不是很好把握是吧,时间不是很好把握啊,你的定期把所有的broke呢都给你变成fo,那那我这个刚刚刚发生了议程,正好赶上你这个。这个这个变成false的时候还变成false了,这这其实也也不好是吧。呃,当然我们还可以。还可以来一个。Fire。一二再三是吧,这是方方。呃,这个我们还可以怎么做。
20:01
我们还可以啊,为了现在的标识。这个标识什么是,是一个什么呢。比如说呃,是一个atomic。属性。然后呢,只要该。上发生过呃发送呃异常。那么就。是。70。增一,我要让他加一。是吧,那我选的目标broke怎么选,选择目标。就是选择。该属性值。最小的。是吧,选择十分值最小的博,你最小,你越小说明你出现问题的这个这个。
21:04
呃,次数越低。出现问题的几率越低。是吧?啊,若该值。相同。方式。对不对,就是这个室外隔离啊,让我们自己来实现的话,其实我们实验方案也是蛮多的。对不对。OK,这深入的我们把这个东西给大家,呃,说说这么一说吧。呃,其他吧,其实我们把这说完吧,就这下边这俩就好说了啊。呃,大家看就是异步发送失败从事是吧?啊异步从事不会选择其他,你注意啊,异步发送的时候他不会选择其他broke。仅会在一个身上做。从事。所以这种策略无法保证消息不丢失。
22:01
他不能保证消息不丢失啊。那这个。呃,哎,对这这这这句话还没说呢,是吧。那如果说超,呃,超过重试次数了,抛已成。让producer会保证,呃,由producer去保证消息不停止。其实这句话的意思是什么?这个消息也丢了。这消息已经丢了啊,如果你超过从事次数以后,那我就直接跑一圈,这个消息就就就就就丢了。你要想让他不丢你producer,你自己再想办法。再怎么样给他从事是吧?然。呃,当然,当生产者出现啊,这个异常remote exception q client exception和q brokeer exception的时候啊,我producer会。自动从消息。所以这里边啊,我们大多数我们从事以后啊,呃,都能够保证消息不再啊,不丢失了,但你要说我从事超过了从事次数还不行,那这个消息就真的丢了,那这种情况下还不行,那说明什么,你要所有的MQ全。
23:14
全挂了,那我就没办法了呀,你服务器全断了,我肯定没办法了,是不是,所以这个我们大家就需要需要任何东西都是相对的啊。所以我们刚才说到这个异步发送的时候,异步发送那无法保证消息不丢失是吧,这种无法保证消息不丢失,其实这个里边也一样存在这个问题。你你你总得有MQ。是吧,我们的让他这个brokeer总得有brokeer是活着的,你全死了,那我这边怎么也不行,我我producer我给你保证不了。对不对。呃,大家这个啊,这个消息刷盘失败策略。呃,诶,这个。修改啊,刚才不是已经看看他也写到这。
24:02
异步的,异步的,其实。我们这儿也有。这是。义义务的。对吧,这不一不呢,我们当时指定的是零啊啊。啊,它是可以修改的啊。好,我们来看这个消息刷盘失败,策略消息刷盘是刷盘超时,这个消息刷盘啊,刷盘是指的什么了。上面是指的把内存里边的写到磁盘。所以这个是不管你master还是都存在这种可能性啊。Must。是吧,都存在这个问题。或者是sli不可用,什么叫sli不可用,他说了啊,返回状呃状态呃,不是这个send OK,什么意思啊,就是我们。
25:01
Sli不是要从master同步数据吗?是吧,就我们。啊呃在做呃,数据同同步时。呃。返回你你同步完了,同步成功了,他会向master返回什么啊send OK。如果。如果失败了。我就根本就没有可用的slave。那它会返回。什么?返回,返回。状态。不是不是四个啊,不是这个OK,就说如果刷盘超时或者不能用。怎么样默认啊,是不会将消息长,将消息尝试发送到其他的。他不会往其他博客发。不过对于重要消息,可以通过在博客的配置文件。
26:00
他。这个属性啊,我们设置这个属性的值为true,这个我们就不往那个配置文件里边写了啊,默认它是false。呃,你可以设置它为处,那么它就会。出现这种情况的时候,他会把消息写到其他的。要不然他就是一根筋认死了。呃,不往其他broke,谢谢。OK,呃,那么我们这样的话啊,就把这个消息发送重试机制。给大家就就说过了啊。
我来说两句