说说高并发系统的限流绝技-1,说说高并发系统的限流绝技-2,本文节选自《亿级流量网站架构核心技术》四章详细讲解限流,在前两篇的基础上增加了油门部分。有时我们希望在特定时间窗口内最多处理一次重复的相同事件,或者限制多个连续相同事件的最小执行时间间隔,这时我们可以使用节流(Throttle)来防止多个相同事件连续重复实现。Throttle主要有以下几种用法:throttleFirst、throttleLast、throttleWithTimeout。1、ThrottleFirst/throttleLastthrottleFirst/throttleLast表示在一个时间窗口内,如果有多个相同的事件需要处理,则只处理第一个或最后一个。它相当于一个事件频率控制器,将一段时间内重复出现的多个相同事件转化为一个,降低事件处理的频率,从而减少无用的处理,提高性能。如上图所示,throttleFirst只会在一个时间窗口内处理一个时间窗口内的第一个事件。而throttleLast将处理该时间窗口内的最后一个事件。一种场景是网页中的resize、scroll和mousemove事件。当我们改变浏览器的大小时,会触发resize事件,当页面元素滚动时,会触发scroll事件。当我们快速连续执行这些操作时,会不断触发这些事件,可能会导致UI响应缓慢,浏览器卡顿,这时节流就派上用场了。前端开发可以使用jquery-throttle-debounce-plugin,Android开发可以使用RxAndroid。2throttleWithTimeoutThrottleWithTimeout也叫去抖动(debounce),它限制两个连续事件的顺序执行时间不小于某个时间窗口。如上图所示,throttleWithTimeout限制了两个连续事件之间的最小时间窗口。ThrottleFirst/throttleLast是基于decisiontime的处理,基于固定的时间窗口,同一固定时间窗口内的多个连续事件只处理一个进程。ThrottleWithTimeout基于两个连续事件的相对时间。当两个连续事件之间的间隔小于最小间隔时间窗口时,前一个事件将被丢弃。如果最后一个事件已经等待了最小间隔时间窗口,则没有新的事件。事件到达,则处理最后一个事件。比如搜索关键词的自动补全,如果用户每输入一个字符就发送一次请求,先输入的单词自动补全会被下一个即将到来的字符覆盖,那么之前的自动补全就会无用。ThrottleWithTimeout就是为了解决这个问题,通过它来减少频繁的网络请求,避免每输入一个字就请求一次。使用RxJava1.2.0实现的测试代码。Observable.create(newObservable.OnSubscribe
