00:00
接下来我们的任务当然就是把这个自定义的k process function要做一个实现了啊,这里边class loging field voing result,而这里边有一个I,这是我们传进来的,就是呃,当前你到底是fail了几次对吧?呃,那这个我们叫做fail times吧,就设定好的不能超过这个上限啊,它本身是一个key的process function,然后里边我们有这个泛型KIO,大家还记得当前的K是什么呢?当前的K是user ID,而且我们用的是下划线点的这种方式实现的,所以它本身是长整型,这里就是长整型对吧?哎,不会再去有那个Java元组的类型了,所以直接就是长整型,然后后边呢,输入输出我们是不是都包装成样样样例类了,对吧?哎,所以接下来是logging event,这是我们的输入,然后还有一个logging fair warning。
01:00
这是我们的输出,对吧?把这个一写上面,不再报错,没有问题了对吧?啊,类型是对的啊,大家每次都养成好习惯,把这个确认一下,然后呢,就是每来一条元素都会调用到这里的process element的方法,我们在这个处理的过程当中呢,就会用到一些状态,对吧?这里我们就要做一个分析了,到底怎么样去做这个处理呢?我们对应之前十秒钟之内温度连续上升的那个例子,当时我们是怎么做的呢?我们其实非常简单,就是保存的一个状态,保存的是什么?保存的是上一次登录的那个,呃呃,上一次温度的那个值对吧?然后就是新来一个温度的时候呢,就判断是不是比它大啊,就是如果要是比它大,那是上升吧,上升的话,呃,我们先判断之前有没有注册过定时器,对吧?呃,如果注册过的话,那就不用什么都不用干,如果要是没注册过的话,注册一个十秒钟之后的定时器,然后就静等定时器。
02:00
点到点的时候,出发的时候去输出一个报警信息,那什么情况下他不报警呢?就是假如说你遇到一个温度下降的时候,对吧?大家还记得那个流程吧,把那个就直接就把定时器给删掉了啊,所以我们当时保存状态的时候是除了要保存上一次的温度值,还保存了一个定时器的时间戳也保存到,就当时我们保存到这个状态里了,对吧?啊,那现在我们可以用同样的方法来做这样的一个操作吗?整体来讲是差不多的,对吧?只不过现在我们要考虑到当前的这个扩展性的话,你想我现在是连续两次登录失败,呃,大大家有可能想,那我就直接记录一下上一次是不是登录失败不就完了吗?对吧,甚至我都不用保存那个数据,我直接录一个一个标志位,一个布尔类型就完了,对吧,就是布尔类型如果是true的话,那就表示上一次是登录失败了,那接下来再来了登录失败,诶那那我就一直等着,然后如果说要是来了登录成功的话。
03:00
那我把那个定时器删了不就完了吗?哎,这是一种想法,但是这种方法呢,可扩展性不强,对吧?哎,这里边的这个我们正常来讲的话,应该是比方说我们要求是连续五次登录失败,那你怎么办呢?你肯定不能只保存,哎我我之前是不是已经来了好几次登录失败了,就是一个true或者false,不能用这个来判断,那用什么来判断呢。大家想到是不是可以拿一个list来保存下来之前所有登录失败的那些数据啊,对吧?诶,我就相当于有一个最简单的实现思路,就是我用一个list来保存当前所有登录失败的数据,然后呢?诶,如果当前是第一个数,第一次登录失败来了,那我注册一个定时器对吧?呃,两秒钟之后触发,然后在这个过程当中,假如来的都是失败,那就是来一个就放到LIST4里边,来一个放到list里边啊,那如果说最后他一直都没有,就相当于我们这里边处理的过程当中一直都是失败的话,那最后我们肯定定时器就会触发对吧?触发的时候我就去判断一下这里边到底有几次登录失败不就完了吗?啊对吧,你现在要求是两次登录失败,那我拿出来大于等于二报警对吧?啊,如果说你要是要十次登录失败,那我就判断大于等于十个数,大于等于十报警就完了嘛,哎,这是非常简单的一个操作啊,一个思路。
04:26
啊,那当然了,如果中间你来了这个成功登录成功的数据的话,我就直接清空就完了对吧?哎,整个前面登录失败都作废了,都直接清空,定时器也删掉啊,这就是一个最简单的实现啊好,那呃,这里我们就来给大家先把状态做一个定义啊,定义状态,定义状态,那首先我们需要保存应该是啊当前所有的登录失败事件对吧?所以这里边我们需要有一个list的列表啊,就是一个list set,把这个当前所有登录失败的事件都保存下来,另外我们可能还需要有一个有一个value state来保存我们设置的那个定时器的时间戳,对吧?你如果要是想要删它的话,必须得知道时间戳才行嘛,哎,所以我们还要保存呃定时器的时间戳好。
05:26
好,把这个先定义在这儿,然后我做一个lazy懒加载的定义啊,那这里边首先是一个logging feel list set,这是一个list state。然后里边的泛型,我们就直接把这个他登录失败那个数据原封不动的保存进去吧,那就应该是一个logging feel让类,诶,我们这里边logging event对吧,Logging event样类练习,然后里边的这个定义当然还是get wrongtime contacts get,现在是list state啊,这个大家应该还是非常熟悉的啊,里边要去new的是一个list state script,给一个名字当前这个叫logging feel list,然后后边给一个类型class of啊,这里我们的类型给一个还是当前的样衣类类型啊,Logging event,然后下边同样定义对应的这一个保保存时间戳的这个状态啊,这个状态呢,就是呃,Timer ts state,这个大家知道就应该是一个value state了,Value state长整型了。
06:42
同样这里边从上下文里边获取它的状态句柄,你有一个value state script里边给一个当前的这个名称,这是timer ts,然后另外长整型类型类型写在后边,对吧?哎,这就是我们先定义好的这个状态,然后接下来我们就是判断了,哎,当前这个一条数据来了之后,接下来到底是该怎么做呢?哎,这里大家注意,我们是不是首先应该要判断什么呢?是不是要判断事件的类型啊,对吧?呃,如果说它是失败的话,才添加到当前的这个,呃,Logging fel list里面去,如果要是成功的话,那应该干什么?应该要清空状态,清空计时器,对吧?啊,然后就重新开始了。所以这里边我们主要的判断标准就是判断当前登录事件是成功还是。
07:42
失败,我们最关心的应该是啊,当前这个value.even的type,对吧?我们最关心的是它如果等于few的话,这里如果是,诶首先我先把它加入到当前的这个list里边来,对吧?只要是feel就把它加进来,这是没什么毛病的,然后另外还有一个问题就是要不要注册定时器呢?诶这个就稍微麻烦一点,是不是你得判断一下啊,我们这里边本来可以去定义一个布尔类型的标识位,对吧?判断它是不是第一次来,那这里呢,我可以做一个,呃,做一个这个投机取巧的操作啊,因为这里边我们有一个定时器,对吧?大家知道定时器,如果一开始我什么都没有定时器注册呢,那现在定时器时间戳是不是应该是零啊?哎,但是大家会想到零,那是1970年1月1号零点吧,我正常来讲肯定不会注册那个时间的定时器啊,啊,所以这就表示我们之前没有数据来对吧?啊,就是如果它是。
08:42
是零的话我就注册,所以接下来我们是判断一下啊,如果没有定时器,那么注册注册一个两秒后的定时器啊,那这里的判断我就不单独定义变量去拿那个值了,因为它本身就是一个value state嘛,我直接点value拿出来就完事,假如说它等于零的话,哎,那接下来我们要做的这个操作得定义一个TS啊,这个TS就是当前的时间,大家知道这个叫做不是一问type啊,叫做time step,然后乘以1000,这是当前的这个时间戳,对吧?本身这个数据里面带着的时间,然后我们要加上两秒,那是加2000。
09:34
就是一个两秒之后的时间,接下来呢,注册定时器对吧?C TX timer service register,当前要的是一个事件时间定时器啊,因为我们现在都是以事件时间为准的嘛,它还乱续嘛,所以把TS传进去,另外记得保存我们之前的那个状态对吧,Timer ts state update成当前的这个TS,这就是如果来了一个失败,我们现在要做的事情,好,然后接下来,诶,这里还有一个else啊,当然如果说我们这里边的这个even type啊,如果要是除了呃,Fail和success还有别的类型的话,那我这里应该做一个else if,对吧,如果它是成功的话,再怎么怎么样,那这里我们默认就是除了feel就是success,那就那就算了,对吧,直接else就完事了,直接else啊啊,那这里的判断其实是,如果是成功。
10:35
那么直接清空状态和定时器重新开始对吧?所谓的重新开始是什么?就下一次如果又有数据来了之后,它如果是fail的话,是不是就又开始添加到list里边,然后判断没有定时器就注册了啊,就重新新一轮又开始了对吧?啊,这个就完全可以从头开始啊,所以这里边的操作也非常简单,我先把这个CDX调用这个timer service先删了这个定时器,对吧?那这个定时器怎么删,是不是就得从状态里边保存的这个值拿出来啊,啊,对吧?把这个timer ts拿出来去删,然后另外清空状态,我们这里的状态主要有有两个,一个是logging fair list state做一个清空,另外还有一个是当前的这个timer ts state做一个清空,这里大家注意就是你肯定是要先把这个值拿出来,删了这个才能去做清空,对吧?哎,你不能是先清空,先清空之后。
11:35
这个就变成零了嘛,啊,这个就没有意义了啊,所以这就是我们完整的一个处理流程,数据来了之后就这么干啊,然后还没完成呢,因为你还没有真正的输出报警呢,那什么时候输出报警呢?哦,大家会不会发现我们这里边其实还需要有一个on timer方法,对吧?啊,就是我们真正定时器触发的时候,这个操作那是要在这里边去做的,所以把这个on timer方法做一个实现啊,那在这个里边,大家想到这个on timer到了这儿的时候,就相当于在这个过程当中,是不是应该是没有成功的数据来啊,那那就是全是失败对吧?哎,或者说是你像我们这个定义的,你假如说只有一次登录失败,按照这个它是不是也注册了定时器,然后后面不删就会触发了,哎,所以我还得判断一下里面到底有几个登录失败对吧?哎,是不是符合我们当前要求的这个数量,所以接下来呢,诶,我首先应该把它要拿出来对吧?诶这还是。
12:35
定义我们之前比方说我定义一个这个,呃,这个叫all logging feel fair list,呃,我把这个定义成一个这个list buffer,大家还记得之前我们那个把所有数据拿出来之后,呃,去去从那个list set里边挨个便利数据拿出来那个状态对吧?我要去做后续的判断的话,我也为了方便操作,可以先把它拿出来,那这里边同样还是啊,里边的这个数据类型还是样一类loging event,我去new一个buffer buffer定义出来,呃,然后接下来下边做这个操作的时候,那还是之前大家比较熟悉的啊,我定义一个这个迭代器对吧?呃,直接用当前log,呃,Logging field list state直接get拿到的这个,它本身是一个可迭代类型,然后我把它这个迭代器获取到,那接下来就是一个while循环便利了嘛。
13:35
这里边假如说当前它还有has next的话,那我就在这个all logging feel list里边把它加进来对吧?点next把它添加进来啊,就是这么简单的一个过程,先把相当于就是就是get所有的这个数据数嘛,你或者如果要get出来之后直接用它,其实这里边大家会发现我好像不这么做也行,因为后边怎么呃,为什么呢?后边我要做的事情比较简单对吧,就我只判断一下它的size就可以了,所以其实你不把它拿出来也是可以的啊,这里我们是就是经常还是还是习惯这么做对吧?啊就是把它先拿出来,然后接下来那就是判断对判断呃,登录失败事件的个数,如果超过了上限报警,输出报警信息对吧?所以这里边我们接下来一幅。
14:35
当前的这个all loging fair list,哎,它这个就非常简单了,我们直接用这个length对吧?或者直接用size直接把它拿出来,如果大于等于,我们当时不是传进来一个参数叫few吗?如果大于等于当前这个few times的话,那就做一个输出,是不是就直接out.collect呀,主流输出对吧?这是主流输出的方法啊,我们要包装成一个logging field warning样例类,那这里边我们要的是当前的user ID,然后还有第一次和最后一次登录失败的时时间,当前的user ID怎么去定义呢?这里边从哪里去取?
15:16
诶,我们一方面是可以从上下文里边去获取那个key,对吧,另外一方面呢,还可以,诶这里边你这个list里边不是所有数据都在里边保存着吗?哎,所以不管是登录失败时间也好,还是这个UID也好,都可以从里面去拿啊,那比方说这里边我直接拿这个all logging feel list,大家会想到我直接拿第一个是不是点had呀,点had肯定有对不对?哎,这里边直接把它拿出来,然后用它的user ID放在这儿,这是第一个字段,然后第二个字段,那大这就肯定知道了啊,肯定就是had第一个的时间嘛,Time stamp,对吧,直接把它输出就完事了,因为这个稍微有点多,我把它做一个换行啊,大家看的稍微的清楚一些,我们做一个换行,呃,然后后边接下来还应该有最后一次登录失败的时间,哎,那我们当然。
16:17
就是last了,有害的就有last嘛,同样还是它的time STEM,最后还有一个就是我们说的一个报警信息,对吧?哎,比方说我现在说logging feel,呃,我们现在是在两秒钟之内啊,呃,For一共多少次呢?加上我们现在就是logging feel time它本身的这个长度对吧?啊,这里就是假如说它不仅仅是登录失败两次的话,其实我们这里边也可以直接把它的次数直接输出,对吧?假如你是连续登录失败十次,我也能检测出来,直接输出这个长度就完事了啊这里边加一个type对吧?这就是完整的一个处理流程,最后大家不要忘记,既然已经输出报警信息了,已经做过判断了,定时器也出发了,最后是不是应该把我们的状态清空,做一个收尾啊,啊,清空状态啊,所以接下来我们就是logging feel list,做一个clear。另外还。
17:17
还有timer ts state做一个clear,这样就完成了整个的处理流程,好,这就是这个需求的一个实现啊,那接下来我们来运行一下,看看效果怎么样。我们看到代码已经运行完毕,诶我们看一下啊,这里面检测出来一个输出了一条报警对吧,检测到了一种登录是这个连续登录失败的情形啊,这个报的是1035,这个用户在842和844这个时间段内,诶连续三次登录失败,诶那我们来在这个数据里面再确认一下啊,1035我们搜一下。
18:00
搜一下诶在这我们看到果然这里边诶他还换了IP是吧,大家看这个IP不一样啊,连续三次这个费用,然后呢,842843844,连续三次,然后这里边输出了一个报警啊,这个就是完全符合我们的要求,就实现了这个功能。
我来说两句