使用ChronicleQueue创建低延迟的TB级别的队列D
本文介绍如何使用开源ChronicleQueue创建巨大的持久队列,同时保持可预测和一致的低延迟。
在本文中,目标是维护来自市场数据馈送的对象队列(例如,在交易所交易的证券的最新价格)。也可以选择其他业务领域,例如来自物联网设备的感官输入或读取汽车行业的碰撞记录信息。原理是一样的。
首先,定义一个持有市场数据的类:
publicclassMarketDataextendsSelfDescribingMarshallable{intsecurityId;longtime;floatlast;floathigh;floatlow;Gettersandsettersnotshownforbrevity}
注意:在实际场景中,使用float和double保存货币值时必须非常小心,否则可能会导致舍入问题〔Bloch18,Item60〕。但是,在这篇介绍性文章中,我想保持简单。
还有一个小的实用函数MarketDataUtil::create将在调用时创建并返回一个新的随机MarketData对象:staticMarketDatacreate(){MarketDatamarketDatanewMarketData();intidThreadLocalRandom。current()。nextInt(1000);marketData。setSecurityId(id);floatnextFloatThreadLocalRandom。current()。nextFloat();floatlast20100nextFloat;marketData。setLast(last);marketData。setHigh(last1。1f);marketData。setLow(last0。9f);marketData。setTime(System。currentTimeMillis());returnmarketData;}
现在,目标是创建一个持久、并发、低延迟、可从多个进程访问并且可以容纳数十亿个对象的队列。
天真的方法
有了这些类,就可以探索使用ConcurrentLinkedQueue的简单方法:publicstaticvoidmain(String〔〕args){finalQueueMarketDataqueuenewConcurrentLinkedQueue();for(longi0;i1e9;i){queue。add(MarketDataUtil。create());}}
导致失败的有几个原因:ConcurrentLinkedQueue将为添加到队列中的每个元素创建一个包装节点。这将有效地使创建的对象数量增加一倍。对象放置在Java堆上,导致堆内存压力和垃圾收集问题。在我的机器上,这导致我的整个JVM变得无响应,唯一的办法是使用kill9强行杀死它。无法从其他进程(即其他JVM)读取队列。一旦JVM终止,队列的内容就会丢失。因此,队列不是持久的。
查看其他各种标准Java类,可以得出结论,不支持大型持久队列。
ChronicleQueue
ChronicleQueue是一个开源库,旨在满足上述要求。这是设置和使用它的一种方法:publicstaticvoidmain(String〔〕args){finalMarketDatamarketDatanewMarketData();finalChronicleQueueqChronicleQueue。single(marketdata);finalExcerptAppenderappenderq。acquireAppender();for(longi0;i1e9;i){try(finalDocumentContextdocumentappender。acquireWritingDocument(false)){document。wire()。bytes()。writeObject(MarketData。class,MarketDataUtil。recycle(marketData));}}}
使用配备2。3GHz8核英特尔酷睿i9的MacBookPro2019时,仅使用一个线程即可插入每秒超过3,000,000条消息。队列通过给定目录marketdata中的内存映射文件持久化。人们会期望MarketData对象至少占用4(intsecurityId)8(longtime)43(floatlast,high和low)24字节。
在上面的示例中,附加了10亿个对象,导致映射文件占用30,148,657,152个字节,这意味着每条消息大约30个字节。在我看来,这确实非常有效。
从编年史队列中读取很简单。继续上面的示例,下面显示了如何从队列中读取前两个MarketData对象:publicstaticvoidmain(String〔〕args){finalChronicleQueueqChronicleQueue。single(marketdata);finalExcerptTailertailerq。createTailer();for(longi0;i2;i){try(finalDocumentContextdocumenttailer。readingDocument()){MarketDatamarketDatadocument。wire()。bytes()。readObject(MarketData。class);System。out。println(marketData);}}}
还有许多其他功能超出了本文的范围。例如,可以将队列文件设置为以特定间隔(例如每天、每小时或每分钟)滚动,从而有效地创建信息分解,以便随着时间的推移清理旧数据。还有一些规定能够隔离CPU并将Java线程锁定到这些隔离的CPU,从而显着减少应用程序抖动。
ChronicleQueue更多:使用ChronicleQueue创建低延迟的TB级别的队列DZone
韬蕴资本至今未向乐视控股支付收购易到资金3月8日消息,日前,韬蕴资本CEO温晓东此前接受媒体采访时表示,内部启动了对乐视系50亿元的全面追偿。对此,乐视控股债务处理小组相关负责人表示,温晓东所述易到负债总额超过50亿……
雷军奋斗之作最成功的3款小米手机,好用不卡,非常经典!小米科技创办到今天已经差不多有九年了,曾经也给我们带来了无数惊艳的故事和产品,还记得第一代手机小米1999元隆重登场的时候,就像是给手机行业扔了一个重磅炸弹,当然这也让发烧而生……
赋能路径清晰5G工业互联网应用场景扩容11月26日,工业和信息化部信息通信管理局发布《5G工业互联网典型应用场景和重点行业实践(第二批)》,涉及生产单元模拟等10个5G工业互联网的典型应用场景,以及石化化工、建材、……
号称怼爆苹果AirPodsPro的小米耳机,它来了5月10日,小米冷不丁地宣布要在3天后发布小米年度降噪耳机小米降噪耳机Pro。算起来,这也才是小米旗下的第二款真无线降噪耳机。相比与上一代,这货究竟是进步了,还是原……
为什么中国大力发展ETC,而不推广车牌识别技术?ETC技术在上世纪80年代就已经成熟,在90年代开始在世界各地普及,准确来说这确实一种过时的技术。那么,现在停车场都普及车牌识别付费了,为何高速收费站还在普及20年前的ETC技……
呼叫中心软件应具备的5个关键功能对于当今的呼叫中心,重要的是能给我们相关通信解决问题。借助智能移动工具和互联网,呼叫中心给用户带来了即时的满意度和不同的访问权限。因此,当客户打给您呼叫中心的电话时,他们希望立……
蓝牙耳机行业市场规模如何?2016年,苹果凭借其推出的AirpodsTWS耳机产品的时尚外观设计、强大续航能力和稳定便捷的使用方式以及与iOS生态的高度融合,迅速掀起了TWS行业热潮。TWS耳机让耳机从……
黄峥难道有预感?辞职后拼多多问题浮现,一夜蒸发近千亿本文原创,请勿抄袭和搬运,违者必究拼多多问题浮现,市值大跌很多消费者都有货比三家的习惯,在不同的电商平台挑选同类商品中最便宜,最实惠的。一般购买一些小物件不在意质量问题的……
曝光宁德时代在北美建厂价值超过50亿美元为特斯拉等车企供货两名知情人士称,宁德时代在北美的新工厂将生产镍锰钴电池和磷酸铁锂电池,来为特斯拉和其他汽车制造商供货。3月19日消息,据报道,宁德时代考虑为建造一座价值50亿美元的电池工……
看好新能源汽车行业【金鼎观点】1、终于有了救市举措,不过确实来得晚了一些,这种心理创伤是很难弥补的!以为你既然到了3000点,难免就有资金觉得还会到28002、整体来说,还是太卷了,……
都说网购便宜,为什么摄影器材线下实体店比线上的旗舰店便宜?摄影器材是贵重物品,很多摄影人喜欢在线下买有以下原因:1、价格便宜。很多在网上买都是买附件之类,网上相机只能作价格参考。摄影器材商因为得到厂家的支持,经常搞活动,举办讲座……
机器人鱼鳞焊工艺美,你见过吗?快来学习怎么做到的机器人鱼鳞焊接是一种工艺美,可以欣赏下面的几张照片。以上图片源于网络看完上图后是不是非常震撼吗?是不是赞不决口吗,VeryVeryBeautiful。我们传统的手工……