buffer-slayer是github上的一个开源项目,当有批量插入的需求时可以引入这个开源组件,可以大大的提高性能。
github地址:https://github.com/sxhyljava/buffer-slayer
下面是根据github中简介翻译过来的,翻译的不好,大家可以留言指正。
buffer-slayer是一个缓冲请求并批量发送请求的工具,比如Spring JdbcTemplate(batchUpdate)、Redis(pipeline)。
它有一个队列,允许多个生产者发送到该队列,并对其进行限制,以防止应用程序溢出。
此外,还有一个固定大小的缓冲区来规范数据传输。缓冲区的数据将在其已满或达到特定超时(以先到者为准)时发送。
这个项目的灵感来自 zipkin-reporter-java。
作用
- 比起一个一个处理,批量的处理性能会更好。
- 消费者比生产者慢很多的时候,注意不要内存溢出。
- 如果大量请求即将到来,请降低对备份存储(DB、redis等)的影响。
- 异步发送返回一个响应。即使消息是成批发送的,也可以从响应结果中得到一对一的响应。
JdbcTemplate
bufferslayer-spring-jdbc是spring的JdbcTemplate的缓冲实现。
查询被转发到委托的JdbcTemplate并被阻塞地执行。
更新直接发送给记者并立即返回一个响应。
快速启动
引入如下maven
<dependency>
<groupId>io.github.tramchamploo</groupId>
<artifactId>bufferslayer-spring-jdbc</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>io.github.tramchamploo</groupId>
<artifactId>bufferslayer-boundedqueue</artifactId>
<version>2.0.4</version>
</dependency>
可以直接新建一个springboot项目
写如下代码
AsyncReporterProperties reporterProperties = new AsyncReporterProperties()
.setFlushThreads(5)
.setSharedSenderThreads(10)
.setBufferedMaxMessages(500)
.setPendingMaxMessages(10000)
.setMetrics("inmemory")
.setMetricsExporter("http");
BatchJdbcTemplate template = new BatchJdbcTemplate(yourFormerJdbcTemplate, reporterProperties);
MessageFuture<Integer> future = template.update(...);
future.addListener(f -> {
// Your callback
});
ReporterProperties参数详解
- sender 发送者。用户不需要配置。
- sharedSenderThreads 发送者执行的线程数。
- timerThreads 调度执行器中的线程数,以固定速率刷新消息。
- flushThreads 将消息刷新到发件者的线程数。一直等到缓冲区满了。
- metrics 记录已发送、已丢弃、已排队消息的num的度量。
- metricsExporter (http,log)exporter,让用户知道度量的数据。
- bufferedMaxMessages 缓冲的最大消息数。
- messageTimeoutNanos 如果未达到缓冲区大小,则在此超时之后将调用刷新。
- pendingMaxMessages 在触发OverflowStrategy之前要缓冲的最大消息大小。
- pendingKeepaliveNanos 如果在其keepalive期间没有消息排队进入,则挂起队列应终止。
- overflowStrategy (DropHead,DropTail,DropBuffer,DropNew,Fail)到达pendingMaxMessages后,触发策略。
- singleKey 如果该值为true,则不同类型的消息将暂存在同一SizeBoundedQueue中。
Benchmark
直接贴图了
组件 - Reporter 发送请求到队列,发送给消费者。
- Sender 批量发送缓冲区消息
- SizeBoundedQueue 以特定大小为界限的队列。同时支持多个生产者。它支持下列的溢出策略:
DropHead: drops the oldest element 去除最老的
DropTail: drops the youngest element 去除最新的
DropBuffer: drops all the buffered elements 去除所有缓冲的元素
DropNew: drops the new element 去除新的元素
Block: block offer thread, this can be used as a simple back-pressure strategy
Fail: throws an exception 报错 - QueueManager 管理SizeBoundedQueue的生命周期。负责队列的创建和销毁。
- Buffer 具有固定大小的列表,只有在达到超时或已满时才能排出。
英文不好,翻译的不准确大家可以看看英文。
欢迎捐赠