HBase_Java离线脚本或单机部署服务中使用Queue队列实现限流和削峰实战
1.Queue读写缓冲区
在HBase推数脚本中,当用到多线程并发写入来提升写入速度时,涉及到多线程交流。一个实例只创建一个数据库连接,则需要将多个线程中的数据合并到一起写入到数据库中,涉及到线程通信,为了避免数据不一致问题,创建一个Queue来承接所有线程写入。
另外还可以配合AtomicLong属性,控制Queue队列最大长度,达到最大长度后阻塞写入线程,可以用来防止数据流入速度大于数据流出,造成jvm内存过大,实现削峰效果。
实战Writer如下:
1 | /** |
2.令牌桶算法实现限流
以下是一个简化的使用队列实现限流的示例,这个例子大致模拟了令牌桶算法的逻辑:1. 创建一个队列来作为令牌桶;2. 有一个后台线程或定时任务以固定的速率向队列中添加”令牌”,本例中以时间戳作为令牌,直到达到最大容量MAX_TOKENS;3. 当请求到达时,尝试从队列中获取一个令牌;4. 如果能够获取到令牌,则允许请求继续执行;5. 如果无法获取到令牌,即队列为空,则拒绝或排队请求,实现限流。
那么通过调整后台任务的添加速率以及令牌桶的容量,就可以对请求频率进行精确的控制。实现代码如下:
1 | public class RateLimiter { |