徒手撸框架--高并发环境下的请求合并
2018年1月23日 03:10
原文地址:https://www.xilidou.com/2018/01/22/merge-request/
在高并发系统中,我们经常遇到这样的需求:系统产生大量的请求,但是这些请求实时性要求不高。我们就可以将这些请求合并,达到一定数量我们统一提交。最大化的利用系统性IO,提升系统的吞吐性能。
所以请求合并框架需要考虑以下两个需求:
- 当请求收集到一定数量时提交数据
- 一段时间后如果请求没有达到指定的数量也进行提交
我们就聊聊一如何实现这样一个需求。
阅读这篇文章你将会了解到:
- ScheduledThreadPoolExecutor
- 阻塞队列
- 线程安全的参数
- LockSupport的使用
设计思路和实现
我们就聊一聊实现这个东西的具体思路是什么。希望大家能够学习到分析问题,设计模块的一些套路。
1. 底层使用什么数据结构来持有需要合并的请求?
- 既然我们的系统是在高并发的环境下使用,那我们肯定不能使用,普通的
ArrayList来持有。我们可以使用阻塞队列来持有需要合并的请求。 - 我们的数据结构需要提供一个 add() 的方法给外部,用于提交数据。当外部add数据以后,需要检查队列里面的数据的个数是否达到我们限额?达到数量提交数据,不达到继续等待。
- 数据结构还需要提供一个timeOut()的方法,外部有一个计时器定时调用这个timeOut方法,如果方法被调用,则直接向远程提交数据。
- 条件满足的时候线程执行提交动作,条件不满足的时候线程应当暂停,等待队列达到提交数据的条件。所以我们可以考虑使用
LockSupport.park()和LockSupport.unpark来暂停和激活操作线程。
经过上面的分析,我们就有了这样一个数据结构:
1 | private static class FlushThread<Item> implements Runnable{ |