最新要闻
- 小米首款万兆路由发布:1799元
- 天天速递!只要699元!小米旗舰降噪耳机Buds 4发布:HiFi音质
- 小米8款新品价格汇总:3999元的小米13爱不爱?
- 全球新资讯:雷军:只有两家做双尺寸双高端 一家是苹果 一家是小米
- 小米13正式亮相:金属直边 继续对标iPhone!
- 今亮点!3999元起!小米13正式发布:黄金尺寸小屏、满血徕卡镜头
- 不涨价 小米13价格良心了:顶配12+512GB还便宜200元
- 全球微动态丨小米13 Pro正式亮相:中框仅仅3.2毫米!科技纳米皮手感无敌
- 全球信息:Intel显卡驱动即将大更新!DX9、DX11老游戏有惊喜
- 环球快资讯:MIUI 14“剃刀计划”砍向应用臃肿:微信文件重复存储问题终于解决
- 全球快看点丨全新界面 系统大幅精简!MIUI 14正式发布
- 环球快报:俞敏洪称不敢进高档美发店:一顿好酒肉没有了 心疼
- 当前热点-达尔文错了?螃蟹竟在地球上出现了5次
- 【天天聚看点】雷军晒小米13生产过程 由小米智能工厂全自动化装配
- 百事通!Intel独立显卡不做了?掌门人一句话 放心了!
- 长安深蓝SL03宣布涨价:预计上调2000元-8000元
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
焦点热文:异步批处理教程
书接上回 大数据量、高并发业务怎么优化?(一) 文章中介绍了异步批处理的三种方式,本文继续深入针对前两种进行讲解,并给出代码示例:
(相关资料图)
一 普通版本,采用阻塞队列ArrayBlockingQueue
使用普通方式能够直接基于JDK中现成的并发包ArrayBlockingQueue
提供的 offer(E e, long timeout, TimeUnit unit)
(添加元素到队列尾部,如果队列已满则等待参数指定时间后返回false)方法 和 poll(long timeout, TimeUnit unit)
(从队列头部获取元素,如果队列为空则等待参数指定时间后返回null)方法,来达到异步批处理效果
生产者代码:由于采用内存队列,最好在创建 ArrayBlockingQueue
时指定队列大小,防止队列无界,导致内存溢出
/** * 生产者 */@Component@Slf4jpublic class MonitorQueue { private BlockingQueue> queue = new ArrayBlockingQueue<>(10000000); public void put(List list) { try { queue.put(list); } catch (InterruptedException e) { log.error(String.format("队列put异常:%s", e.getMessage()), e); } } public void offer(List list, long timeout, TimeUnit unit) throws InterruptedException { queue.offer(list, timeout, unit); } public List poll(long timeout, TimeUnit unit) throws InterruptedException { return queue.poll(timeout, unit); }}
消费者代码:在创建生产者时开启一个子线程在死循环中一直读取队列元素,直到队列元素超过我们的 maxNum
时,将临时列表元素插入数据库中
/** * 消费者 */@Slf4j@Componentpublic class MonitorConsumer implements Runnable { @Autowired private MonitorQueue queue; @Autowired private MonitorService monitorService; @PostConstruct public void init() { new Thread(this, "monitor-collect").start(); } // 临时列表大小限制 private int maxNum = 2000; @SuppressWarnings("InfiniteLoopStatement") @Override public void run() { while (true) { handler(); } } private void handler() { try { List temp = new ArrayList<>(maxNum); while (temp.size() <= maxNum) { List list = queue.poll(20, TimeUnit.SECONDS); if (CollectionUtil.isNotEmpty(list)) { temp.addAll(list); } else { break; } } if (CollectionUtil.isEmpty(temp)) { return; } int i = monitorService.batchSave(temp); log.debug("----------------------------batchSave num:{}, collect.size:{}", i, collect.size()); } catch (Exception e) { log.error(String.format("消费者异常: %s", e.getMessage()), e); } }}
可以看到采用该种方式实现的异步批量入库代码比较简单,便于理解,在性能上,基本都能够满足日常普通业务存在的批量入库场景
二 进阶版,采用 Disruptor
队列,本文基于 Disruptor
最新4.0版本
先给出 Disruptor
官网简介
Disruptor 是一个提供并发环形缓冲区数据结构的库。它旨在在异步事件处理架构中提供低延迟、高吞吐量的工作队列。为了理解 Disruptor 的好处,我们可以将它与一些很好理解且目的非常相似的东西进行比较。在 Disruptor 的情况下,这将是 Java 的 BlockingQueue。与队列一样,Disruptor 的目的是在同一进程内的线程之间移动数据(例如消息或事件)。然而,Disruptor 提供的一些关键特性使其有别于队列。他们是:向消费者多播事件,带有消费者依赖图。为事件预分配内存。可选无锁
Disruptor
给我们在项目中实现异步批处理提供了另一种方式,一种无锁、延迟更低、吞吐量更高、提供消费者多播等等的内存队列
下面介绍如何使用
2.1 依赖安装
com.lmax disruptor 4.0.0.RC1
2.2 Disruptor
使用代码如下:
public class LongEvent{ private long value; public void set(long value){ this.value = value; } @Override public String toString(){ return "LongEvent{" + "value=" + value + "}"; }}@Slf4jpublic class LongEventMain { public static void handleEvent(LongEvent event, long sequence, boolean endOfBatch) { log.info("event: " + event + ", sequence:" + sequence + ", endOfBatch:" + endOfBatch); } public static void translate(LongEvent event, long sequence, ByteBuffer buffer) { event.set(buffer.getLong(0)); } public static void main(String[] args) throws Exception { int bufferSize = 128; // 1. 创建Disruptor对象 Disruptor disruptor = new Disruptor<>(LongEvent::new, bufferSize, DaemonThreadFactory.INSTANCE, ProducerType.SINGLE, new BlockingWaitStrategy()); // 2. 添加事件处理类(消费者) disruptor.handleEventsWith(LongEventMain::handleEvent); // 3. 开启事件处理线程 disruptor.start(); // 4. 获取ringBuffer RingBuffer ringBuffer = disruptor.getRingBuffer(); ByteBuffer bb = ByteBuffer.allocate(8); for (long l = 0; true; l++) { bb.putLong(0, l); // 5. 发布事件(生产者) ringBuffer.publishEvent(LongEventMain::translate, bb); Thread.sleep(1); } }}
2.3 上面代码完成了一个事件发布后,事件处理类就能够收到对应事件信息的功能,但是我们想要的是能在消费者线程中批量处理生产者数据的逻辑,还得再修改一下事件处理类代码,如下:
@Slf4jpublic class LongEventBatch implements EventHandler { private static final int MAX_BATCH_SIZE = 20; private final List batch = new ArrayList<>(); public LongEventBatch() { // 虚拟机关闭处理 Runtime.getRuntime().addShutdownHook(new Thread(() -> { log.info("------------------ShutdownHook-DataEventHandler,上报tempList"); if (batch.size() > 0) { // 批量入库伪代码 int i = xxxService.batchSave(temp); } })); } @Override public void onEvent(final LongEvent event, final long sequence, final boolean endOfBatch) { log.info("event: " + event + ", sequence:" + sequence + ", endOfBatch:" + endOfBatch); batch.add(event); if (batch.size() >= MAX_BATCH_SIZE) { processBatch(batch); } } private void processBatch(final List batch) { // 批量入库伪代码 int i = xxxService.batchSave(temp); // 记得清空batch列表 batch.clear(); }}
由此,我们就实现了基于 Disruptor
的异步批处理逻辑,该方式会比普通版本性能高出一个数量级,大家在工作中可以尝试使用一番
最后
附博主 github
地址 https://github.com/wayn111
焦点热文:异步批处理教程
小米首款万兆路由发布:1799元
天天速递!只要699元!小米旗舰降噪耳机Buds 4发布:HiFi音质
小米8款新品价格汇总:3999元的小米13爱不爱?
全球新资讯:雷军:只有两家做双尺寸双高端 一家是苹果 一家是小米
小米13正式亮相:金属直边 继续对标iPhone!
今亮点!3999元起!小米13正式发布:黄金尺寸小屏、满血徕卡镜头
不涨价 小米13价格良心了:顶配12+512GB还便宜200元
全球微动态丨小米13 Pro正式亮相:中框仅仅3.2毫米!科技纳米皮手感无敌
焦点消息!ELK+FileBeat日志分析系统
快看点丨差错控制
全球信息:Intel显卡驱动即将大更新!DX9、DX11老游戏有惊喜
环球快资讯:MIUI 14“剃刀计划”砍向应用臃肿:微信文件重复存储问题终于解决
全球快看点丨全新界面 系统大幅精简!MIUI 14正式发布
【世界聚看点】使webworker中支持使用import导入模块——threads.js
世界速看:说人话系列:DOM(Document Object Mode)究竟是怎么来的呢?
环球快报:俞敏洪称不敢进高档美发店:一顿好酒肉没有了 心疼
当前热点-达尔文错了?螃蟹竟在地球上出现了5次
全球新资讯:时间轮 (史上最全)
【天天聚看点】雷军晒小米13生产过程 由小米智能工厂全自动化装配
百事通!Intel独立显卡不做了?掌门人一句话 放心了!
长安深蓝SL03宣布涨价:预计上调2000元-8000元
环球快讯:沉船捞出165年前牛仔裤80万卖出:更有数不清的黄金
SpringMVC执行流程
全球快资讯丨任务调度系统-业务线资源隔离
天天微速讯:echarts设置暂无数据
老版本微博下线倒计时!新版已无法返回老版本
舒适降噪的天花板 索尼WH-1000XM5耳机跌破2000元
全球视点!苹果把果链撤出中国?难度可是地狱级的
天天滚动:SQLyog连接MYSQL时报错 Client does not support authentication protocol requested
世界快报:小米发布米家智能小厨宝7L S1:2000W速热、1年省电100度
播报:男子将手机改装成“偷拍神器”:摄像头改到耳机插孔 赚了30万
世界资讯:我迟早被这些AI绘画笑死
世界快报:买不到抗原检测试剂盒怎么办?不要慌
重点聚焦!Intel A750显卡新驱动性能实测:《CS:GO》帧数飙升79%
公众号附件怎么添加?还在用阅读原文的方式来添加吗,你已经落伍啦,现在大家都在用这个新方法,不仅方便还省事!
TabControl控件的简单使用-添加tab
【全球时快讯】Python爬虫实战,requests+xlwt模块,爬取螺蛳粉商品数据(附源码)
环球微速讯:Linux笔记03: Linux常用命令_3.3文件操作命令
新资讯:canvas分享
全球今头条!推特重推蓝V认证服务 苹果用户得多交3美元!马斯克也无能为力
每日焦点!三星S23 Ultra关键参数确定:首发高频版第二代骁龙8、祖传25W快充
童年记忆的黄桃罐头为啥突然火了?专家建议不要盲目囤
世界今头条!【2023最新B站评论爬虫】用python爬取上千条哔哩哔哩评论
【世界快播报】刘强东称新冠比感冒还轻微!王石也发声:只有鼻子不舒服 10天转阴
全球今亮点!再见C罗!C罗赛后痛哭:葡萄牙0-1摩洛哥 非洲球队首进4强
世界杯英法大战结束!法国2-1淘汰英格兰 晋级四强
中国市场已合资30年!又一车企资不抵债:销量暴跌
全球观速讯丨中国车企在俄罗斯销量飙升:市占率超1/3 主打中高端
每日消息!uniapp+unicloud开发微信小程序流程
焦点快看:清理备用内存 - 解决方案(备用内存占用过高且不自动释放)--九五小庞
天天日报丨Blazor和Vue对比学习(进阶.路由导航四):路由传参
王冰冰反向操作:戴摩洛哥围巾 希望葡萄牙获胜
今日看点:老黄怎么看?这张RTX 4090卖到了10万块 有钱也不一定买到:EVGA绝版货
东北市民网购宠物猪收到已冻僵 网友唏嘘:一个敢买一个敢发
【环球新要闻】从 695. 岛屿的最大面积 入手深度优先搜素DFS
快资讯丨用户重复注册分析-多线程事务中加锁引发的bug
【焦点热闻】PTA作业6-8电信系列总结
环球要闻:C#中的WebAPI
专为AR/VR打造!苹果全新操作系统名为xrOS:有专属应用商店 最早明年推出
全球看点:高校花2.4亿把教学课堂搬到了海上 网友羡慕不已
2022-6.824-Lab2:Raft
007爬虫之requests模块进阶
全球今日讯!攻防世界-unseping(序列化,Bash shell)
全球观速讯丨《暗黑破坏神4》赛季通行证需氪金购买 暴雪重申:不会充钱就变强
JavaScript:this指针
20点狂欢:淘宝每满200减30、天猫/京东每满300减40
厂家称黄桃罐头没药效 网友调侃:黄桃罐头为何成东北人疯狂膜拜的神物
全球看点:验证jenkins自动化部署
世界速读:首个进入太空的人类 宇航员加加林个人档案已解密:34岁死于空难
天天即时看!女生高铁录乐器考试被打断:工作人员知道情况后特意给换了地方
2021冬--简单描述时间复杂度
PDF转图片
Python实战案例,tkinter+random模块,实现课堂随机抽选提问并语音播报学生姓名
世界关注:将近30万人预约!有米粉要当小米13 Pro钉子户
每日观察!86寸4K巨屏!小米EA Pro 86电视今日开售 5999元
比Zen4还火 AMD游戏神U锐龙7 5800X3D史低2199元(首发3099)
MIUI 14花宠摆件上线!米粉:小时候的QQ农场又回来了
每日快报!刘强东分享抗新冠经验:比感冒还轻微 京东将开通热线帮助员工
Windows OpenGL ES 图像透明度
热门看点:我“采访”了 ChatGPT
观察:Blazor和Vue对比学习(进阶.路由导航二):布局(母版/嵌套)
世界简讯:WPF内嵌Http协议的Server端
造车大战中360赢麻了?周鸿祎大赞自己投资的哪吒汽车
天天快看:整活!MIUI 14桌面大变:支持图标自定义调整
当前速读:post表单数据格式完全解析multipart/form-data(C#实现)
队列之王: Disruptor 原理、架构、源码 一文穿透
每日视讯:Python如何导入自定义模块?
环球通讯!进制转换和计算机存储规则
SpringBoot整合Swagger2在线文档
迷惑!大妈凌晨骑车撞上路边停放车辆:怒斥司机不开车灯
黄桃罐头遭疯抢 厂家实诚回应“没药效” 网友调侃:你不懂
环球观焦点:曝Redmi K60系列依然将采用塑料支架 为了性价比?
注意!鲍鱼被列入濒危物种红色名录:20种或灭绝
10.3寸墨水屏!联想YOGA Paper墨水平板今日开售 3699元
天天热点评!环形队列、 条带环形队列 Striped-RingBuffer (史上最全)
梅西进4强 雷军点赞:阿根廷门将神了 太给力
全球微速讯:苹果要大赚!消息称iPhone 15又涨价 高端万元起:华为Mate60等跟涨吗
天天快资讯:深度学习基础课:最大池化层的前向传播推导
阿根廷点球大战淘汰荷兰:梅西点射破门 追平巴蒂纪录网友纷祝贺