首页 > 滚动 > > 内容页

全球观速讯丨单机最快的队列Disruptor解析和使用

2023-04-05 15:43:16 博客园
前言

介绍高性能队列Disruptor原理以及使用例子。

Disruptor是什么?

Disruptor是外汇和加密货币交易所运营商 LMAX group 建立高性能的金融交易所的结果。用于解决生产者、消费者及其数据存储的设计问题的高性能队列实现。可以对标JDK中的ArrayBlockingQueue。是目前单机且基于内存存储的最高性能的队列实现。见 与ArrayBlockingQueue性能对比。

Disruptor高性能秘诀使用CAS代替锁

锁非常昂贵,因为它们在竞争时需要仲裁。这种仲裁是通过到操作系统内核的上下文切换来实现的,该内核将挂起等待锁的线程,直到它被释放。系统提供的原子操作CAS(Compare And Swap/Set)是很好的锁替代方案,Disruptor中同步就是使用的这种。


【资料图】

比如多生产者模式中com.lmax.disruptor.MultiProducerSequencer就是用了Java里sun.misc.Unsafe类基于CAS实现的API。

等待策略com.lmax.disruptor.BlockingWaitStrategy使用了基于CAS实现的ReentrantLock。

独占缓存行

为了提高效率CPU硬件不会以字节或字为单位移动内存,而是以缓存行,通常大小为 32-256 字节的缓存行,最常见的缓存行是 64 字节。这意味着,如果两个变量在同一个缓存行中,并且由不同的线程写入,那么它们会出现与单个变量相同的写入争用问题。为了获得高性能,如果要最小化争用,那么确保独立但同时写入的变量不共享相同的缓存行是很重要的。

比如com.lmax.disruptor.RingBuffer中属性前后都用未赋值的long来独占。com.lmax.disruptor.SingleProducerSequencerPad也有相同处理方式。

环形队列使用有界队列,减少线程争用

队列相比链表在访问速度上占据优势,而有界队列相比可动态扩容的无界队列则避免扩容产生的同步问题效率更高。Disruptor和JDK中的ArrayBlockingQueue一样使用有界队列。队列长度要设为2的n次幂,有利于二进制计算。

使用环形数组,避免生产和消费速度差异导致队列头和尾争用

Disruptor在逻辑上将数组的的头尾看成是相连的,即一个环形数组(RingBuffer)。

Sequence

生产和消费都需要维护自增序列值(Sequence),从0开始。

生产方只维护一个代表生产的最后一个元素的序号。代表生产的最后一个元素的序号。每次向Disruptor发布一个元素都调用Sequenced.next()来获取下个位置的写入权。

在单生产者模式(SINGLE)由于不存在并发写入,则不需要解决同步问题。在多生产者模式(MULTI)就需要借助JDK中基于CAS(Compare And Swap/Set)实现的API来保证线程安全。

多个消费者各自维护自己的消费序列值(Sequence)保存数组中。

而环形通过与运算(sequence & indexMask)实现的,indexMask就是环形队列的长度-1。以环形队列长度8为例,第9个元素Sequence为8,8 & 7 = 0,刚好又回到了数组第1个位置。

见com.lmax.disruptor.RingBuffer.elementAt(long sequence)

预分配内存

环形队列存放的是Event对象,而且是在Disruptor创建的时候调用EventFactory创建并一次将队列填满。Event保存生产者生产的数据,消费也是通过Event获取,后续生产则只需要替换掉Event中的属性值。这种方式避免了重复创建对象,降低JVM的GC产频率。

见com.lmax.disruptor.RingBuffer.fill(EventFactoryeventFactory)

消费者8种等待策略

当消费速度大于生产速度情况下,消费者执行的等待策略。

策略类名描述
BlockingWaitStrategy(常用)使用ReentrantLock,失败则进入等待队列等待唤醒重试。当吞吐量和低延迟不如CPU资源重要时使用。
YieldingWaitStrategy(常用)尝试100次,全失败后调用Thread.yield()让出CPU。该策略将使用100%的CPU,如果其他线程请求CPU资源,这种策略更容易让出CPU资源。
SleepingWaitStrategy(常用)尝试200次 。前100次直接重试,后100次每次失败后调用Thread.yield()让出CPU,全失败线程睡眠(默认100纳秒 )。
BusySpinWaitStrategy线程一直自旋等待,比较耗CPU。最好是将线程绑定到特定的CPU核心上使用。
LiteBlockingWaitStrategy与BlockingWaitStrategy类似,区别在增加了原子变量signalNeeded,如果两个线程同时分别访问waitFor()和signalAllWhenBlocking(),可以减少ReentrantLock加锁次数。
LiteTimeoutBlockingWaitStrategy与LiteBlockingWaitStrategy类似,区别在于设置了阻塞时间,超过时间后抛异常。
TimeoutBlockingWaitStrategy与BlockingWaitStrategy类似,区别在于设置了阻塞时间,超过时间后抛异常。
PhasedBackoffWaitStrategy根据时间参数和传入的等待策略来决定使用哪种等待策略。当吞吐量和低延迟不如CPU资源重要时,可以使用此策略。
消费者序列

所有消费者的消费序列(Sequence)都放在一个数组中,见com.lmax.disruptor.AbstractSequencer,通过SEQUENCE_UPDATER来更新对应的序列值。

调用更新的地方在com.lmax.disruptor.RingBuffer.addGatingSequences(Sequence... gatingSequences)。

消费太慢队列满了怎么办?

生产者线程被阻塞。生产者调用Sequenced.next()争夺写入权的时候需要判断最小的消费序列值进行比较。如果写入的位置还未消费则会进入循环不断获取最小消费序列值进行比较。

见包com.lmax.disruptor下SingleProducerSequencer或MultiProducerSequencer中next(int n)方法。

Disruptor开发步骤创建Event、EventFactory、EventHandler和ExceptionHandler类

Event是环形队列(RingBuffer)中的元素,是生产者数据的载体;EventFactory是定义Event创建方式的工厂类;EventHandler则是Event的处理器,定义如何消费Event中的数据。

另外有必要定义一个消费异常处理器ExceptionHandler,它是和EventHandler绑定的。当EventHandler.onEvent()执行抛出异常时会执行对应的异常回调方法。

实例化Disruptor

创建Disruptor需要指定5个参数eventFactory、ringBufferSize、threadFactory、producerType、waitStrategy。

EventFactory是上面定义的Event工厂类;

ringBufferSize是环形队列的长度,这个值要是2的N次方;

threadFactory是定义消费者线程创建方式的工厂类;

producerType是指明生产者是一个(SINGLE)还是多个(MULTI)。默认是MULTI,会使用CAS(Compare And Swap/Set)保证线程安全。如果指定为SINGLE,则不使用没必要的CAS,使单线程处理更高效。

waitStrategy指明消费者等待生产时的策略。

设置消费者

指明EventHandler并绑定ExceptionHandler。指定多个EventHandler时,会为每个EventHandler分配一个线程,一个Event会被多个并行EventHandler处理。

也可以指明多个WorkHandler,每个WorkHandler分配一个线程并行消费队列中的Event,一个Event只会被一个WorkHandler处理。

创建/实例化EventTranslator

EventTranslator定义生产者数据转换为Event的方式,不同数量参数有不同的接口用来实现。

最后用Disruptor.publishEvent() 来发布元素指明EventTranslator和参数例子程序先引入Maven依赖
  com.lmax  disruptor  3.4.4
Event
/** * 事件 * * @param 发布的数据类型 */public class MyEvent {    private T data;    public T getData() {        return data;    }    public MyEvent setData(T data) {        this.data = data;        return this;    }}
EventFactory
import com.lmax.disruptor.EventFactory;/** * 创建事件的工厂 * * @param 发布的数据类型 */public class MyEventFactory implements EventFactory> {    @Override    public MyEvent newInstance() {        return new MyEvent<>();    }}
EventHandler
import com.lmax.disruptor.EventHandler;/** * 事件消费方法 * * @param 发布的数据类型 */public class MyEventHandler implements EventHandler> {    @Override    public void onEvent(MyEvent tMyEvent, long l, boolean b) throws Exception {        System.out.println(Thread.currentThread().getName() + "MyEventHandler消费:" + tMyEvent.getData());    }}
ExceptionHandler
import com.lmax.disruptor.ExceptionHandler;/** * 消费者异常处理器 * * @param 发布的数据类型 */public class MyExceptionHandler implements ExceptionHandler> {    @Override    public void handleEventException(Throwable ex, long sequence, MyEvent event) {        System.out.println("handleEventException");    }    @Override    public void handleOnStartException(Throwable ex) {        System.out.println("handleOnStartException");    }    @Override    public void handleOnShutdownException(Throwable ex) {        System.out.println("handleOnShutdownException");    }}
单消费者
import com.lmax.disruptor.EventTranslatorOneArg;import com.lmax.disruptor.ExceptionHandler;import com.lmax.disruptor.SleepingWaitStrategy;import com.lmax.disruptor.WaitStrategy;import com.lmax.disruptor.dsl.Disruptor;import java.util.concurrent.Executors;import java.util.concurrent.ThreadFactory;import static com.lmax.disruptor.dsl.ProducerType.SINGLE;/** * 单消费者 */public class SingleConsumerSample {    public static void main(String[] args) {        // 环形数组长度,必须是2的n次幂        int ringBufferSize = 1024;        // 创建事件(Event)对象的工厂        MyEventFactory eventFactory = new MyEventFactory<>();        // 创建消费者线程工厂        ThreadFactory threadFactory = Executors.defaultThreadFactory();        // 等待策略        WaitStrategy waitStrategy = new SleepingWaitStrategy();        Disruptor> disruptor =                new Disruptor<>(eventFactory, ringBufferSize, threadFactory, SINGLE, waitStrategy);        // 指定一个处理器        MyEventHandler eventHandler = new MyEventHandler<>();        disruptor.handleEventsWith(eventHandler);        // 处理器异常处理器        ExceptionHandler> exceptionHandler = new MyExceptionHandler<>();        disruptor.setDefaultExceptionHandler(exceptionHandler);        disruptor.start();        // 通过事件转换器(EventTranslator)来指明如何将发布的数据转换到事件对象(Event)中        // 这里是一个参数的转换器,另外还有两个(EventTranslatorTwoArg)、三个(EventTranslatorThreeArg)        // 和多个(EventTranslatorVararg)参数的转换器可以使用,参数类型可以不一样        EventTranslatorOneArg, String> eventTranslatorOneArg =                new EventTranslatorOneArg, String>() {                    @Override                    public void translateTo(MyEvent event, long sequence, String arg0) {                        event.setData(arg0);                    }                };        // 发布        for (int i = 0; i < 10; i++) {            disruptor.publishEvent(eventTranslatorOneArg, "One arg " + i);        }        disruptor.shutdown();    }}
单消费者Lambda写法

这种只是迎合Java8 Lambda语法特性,代码更简洁。

import com.lmax.disruptor.*;import com.lmax.disruptor.dsl.Disruptor;import java.util.Arrays;import java.util.List;import java.util.concurrent.Executors;import java.util.concurrent.ThreadFactory;import java.util.stream.Collectors;import static com.lmax.disruptor.dsl.ProducerType.SINGLE;public class LambdaSample {    public static void main(String[] args) {        // 环形数组长度,必须是2的n次幂        int ringBufferSize = 1024;        // 创建消费者线程工厂        ThreadFactory threadFactory = Executors.defaultThreadFactory();        // 等待策略        WaitStrategy waitStrategy = new SleepingWaitStrategy();        Disruptor> disruptor =                new Disruptor<>(MyEvent::new, ringBufferSize, threadFactory, SINGLE, waitStrategy);        // 指定一个处理器        EventHandler> eventHandler = (event, sequence, endOfBatch) ->                System.out.println(Thread.currentThread().getName() + "MyEventHandler消费:" + event.getData());        disruptor.handleEventsWith(eventHandler);        // 处理器异常处理器        ExceptionHandler> exceptionHandler = new MyExceptionHandler<>();        disruptor.setDefaultExceptionHandler(exceptionHandler);        disruptor.start();        // 通过事件转换器(EventTranslator)来指明如何将发布的数据转换到事件对象(Event)中        // 一个参数的转换器        disruptor.publishEvent((event, sequence, param) -> event.setData(param), "One arg ");        // 两个参数的转换器        disruptor.publishEvent((event, sequence, pA, pB) -> event.setData(pA + pB), "Two arg ", 1);        // 三个参数的转换器        disruptor.publishEvent((event, sequence, pA, pB, pC) -> event.setData(pA + pB + pC)                , "Three arg ", 1, false);        // 多个参数的转换器        disruptor.getRingBuffer().publishEvent((event, sequence, params) -> {            List paramList = Arrays.stream(params).map(Object::toString).collect(Collectors.toList());            event.setData("Var arg " + String.join(",", paramList));        }, "param1", "param2", "param3");        disruptor.shutdown();    }}
多消费者重复消费元素

关键只在于指定多个EventHandler,并且EventHandler还可以分别绑定不同的ExceptionHandler。

每个EventHandler分配一个线程,一个Event会被每个EventHandler处理,适合两个不同的业务都需要处理同一个元素的情况,类似广播模式。

import com.lmax.disruptor.*;import com.lmax.disruptor.dsl.Disruptor;import java.util.concurrent.Executors;import java.util.concurrent.ThreadFactory;import static com.lmax.disruptor.dsl.ProducerType.SINGLE;/** * 一个元素多个消费者重复消费 */public class RepetitionConsumerSample {    public static void main(String[] args) {        // 环形数组长度,必须是2的n次幂        int ringBufferSize = 1024;        // 创建事件(Event)对象的工厂        MyEventFactory eventFactory = new MyEventFactory<>();        // 创建消费者线程工厂        ThreadFactory threadFactory = Executors.defaultThreadFactory();        // 等待策略        WaitStrategy waitStrategy = new SleepingWaitStrategy();        Disruptor> disruptor =                new Disruptor<>(eventFactory, ringBufferSize, threadFactory, SINGLE, waitStrategy);        // 这里指定了2个消费者,那就会产生2个消费线程,一个事件会被消费2次        EventHandler> eventHandler = (event, sequence, endOfBatch) ->                System.out.println(Thread.currentThread().getName() + "MyEventHandler消费:" + event.getData());        EventHandler> eventHandler2 = (event, sequence, endOfBatch) ->                System.out.println(Thread.currentThread().getName() + "MyEventHandler——2消费:" + event.getData());        disruptor.handleEventsWith(eventHandler, eventHandler2);        // 分别指定异常处理器        ExceptionHandler> exceptionHandler = new MyExceptionHandler<>();        disruptor.handleExceptionsFor(eventHandler).with(exceptionHandler);        disruptor.handleExceptionsFor(eventHandler2).with(exceptionHandler);        disruptor.start();        for (int i = 0; i < 10; i++) {            disruptor.publishEvent((event, sequence, param) -> event.setData(param), "One arg " + i);        }        disruptor.shutdown();    }}
多消费者

关键只在于定义WorkHandler,然后实例化多个来消费。

每个WorkHandler分配一个线程,一个元素只会被一个WorkHandler处理。

import com.lmax.disruptor.ExceptionHandler;import com.lmax.disruptor.SleepingWaitStrategy;import com.lmax.disruptor.WaitStrategy;import com.lmax.disruptor.WorkHandler;import com.lmax.disruptor.dsl.Disruptor;import java.util.concurrent.Executors;import java.util.concurrent.ThreadFactory;import static com.lmax.disruptor.dsl.ProducerType.SINGLE;public class MultiConsumerSample {    public static void main(String[] args) {        // 环形数组长度,必须是2的n次幂        int ringBufferSize = 1024;        // 创建事件(Event)对象的工厂        MyEventFactory eventFactory = new MyEventFactory<>();        // 创建消费者线程工厂        ThreadFactory threadFactory = Executors.defaultThreadFactory();        // 等待策略        WaitStrategy waitStrategy = new SleepingWaitStrategy();        Disruptor> disruptor =                new Disruptor<>(eventFactory, ringBufferSize, threadFactory, SINGLE, waitStrategy);        // 处理器异常处理器        ExceptionHandler> exceptionHandler = new MyExceptionHandler<>();        disruptor.setDefaultExceptionHandler(exceptionHandler);        // 设置2个消费者,2个线程,一个Event只被一个消费者消费        WorkHandler> workHandler = tMyEvent ->                System.out.println(Thread.currentThread().getName() + "WorkHandler消费:" + tMyEvent.getData());        disruptor.handleEventsWithWorkerPool(workHandler, workHandler2);        disruptor.start();        for (int i = 0; i < 10; i++) {            disruptor.publishEvent((event, sequence, param) -> event.setData(param), "One arg " + i);        }        disruptor.shutdown();    }}
参考链接

Disruptor 主页

Disruptor 技术文档

GitHub Disruptor

GitHub Disruptor Getting Started

Maven Repository Disruptor Framework

LMAX 官网

x 广告
最近更新

全球观速讯丨单机最快的队列Disruptor解析和使用

2023-04-05

盘点A股天价离婚案:最高235亿元!周鸿祎90亿“分手费”什么水平?还有一大疑点|全球聚焦

2023-04-05

湖人险胜爵士!詹眉狂笑庆祝胜利,老詹拥抱众老友,爵士沮丧离场

2023-04-05

阿根廷与七个主要债权国签署债务重组协议

2023-04-05

quot 我怕来不及 我要抱着你 hellip hellip quot 这首是什么歌 歌词是什么 时快讯

2023-04-05

贵州黔东南:携手七省七地共赴税法宣传“千里之约”-全球今日报

2023-04-05

环球快资讯:王荧欣_关于王荧欣介绍

2023-04-05

当前最新:万达购物跟万达广场一样吗_万达百货和万达广场区别

2023-04-05

如成语开头的四字成语 如成语 每日快讯

2023-04-04

信通院专家:关注开源软件供应链风险已经成为行业共识

2023-04-04

世界新资讯:2023大足公租房租金标准是多少

2023-04-04

消渴丸说明书用法用量_消渴丸用量_天天时讯

2023-04-04

侵犯商业秘密有哪些侵权行为

2023-04-04

环球速递!十一届区委第二轮第一批巡察全面进驻

2023-04-04

全球今亮点!油价预计大涨231元/吨!老百姓都缺钱了,怎么油价一直居高不下?

2023-04-04

上海再推重磅措施吸引外国投资:可直接给予现金奖励!

2023-04-04

明天免费!太原周边高速部分路段可能拥堵,这些道路可绕行!

2023-04-04

每日播报!马寨镇开展雨后围挡隐患排查整治行动

2023-04-04

大连商品交易所3月处理异常交易行为61起-世界即时

2023-04-04

达州美娜整形医院怎么样?正规吗?医生资料介绍/擅长项目一览

2023-04-04

如何去除皱纹最有效_怎么样去除皱纹

2023-04-04

三十年不见,这对父子为何重逢?瑞金二路街道思南居民区牵起割不断的亲情

2023-04-04

天天快看:那些困在房市“围城”的年轻人

2023-04-04

晴不知夏去雨后方觉秋深下一句(晴不知夏去雨后方知深秋什么意思)_全球动态

2023-04-04

2022胡润品牌榜发布:茅台第一抖音第四

2023-04-04

官宣!世乒赛名额尘埃落定,林高远压哨入围,单打还是看10大主力-全球时讯

2023-04-04

天天时讯:lols8总决赛theshy剑魔_7月5号LOL洲际赛Theshy剑魔强势带领IG吊打M17赢下比赛你怎么评价

2023-04-03

张颂文:演《狂飙》是我最后悔的事 今日热闻

2023-04-03

2023年社保每月缴多少钱?现在社保个人要交多少钱一个月

2023-04-03

湖人接近西部前六!有詹姆斯和戴维斯的他们真要争冠!

2023-04-03

龙南集中签约10个重点项目 全球看热讯

2023-04-03

数据中台成本高?火山引擎DataLeap有妙招!

2023-04-03

4月03日15时黑龙江伊春现有疫情多少例及伊春疫情最新消息今天|全球消息

2023-04-03

里昂:重申中国海外发展(00688)“跑赢大市”评级 目标价降至20.9港元 天天热议

2023-04-03

新疆维吾尔自治区和田地区发布霜冻蓝色预警

2023-04-03

热点评!描写山水的诗句超优美_描写山水的诗句

2023-04-03

四川经视麻辣烫电视剧(四川经视节目表) 全球独家

2023-04-03

环球视点!总冠军化成泡影,MVP渐行渐远!凯尔特人成最大克星,哈登挺可怜

2023-04-03

天天实时:著名建筑师王澍接受环球时报专访:“我造的房子,要扎根中国人的生活”

2023-04-03

定位安卓旗舰 绝不加广告 蔚来手机 3 季度交付_每日快讯

2023-04-03

千里送健康 温州市人民医院开展短期柔性医疗援疆|热门

2023-04-03

海带丰收满船舱|世界观察

2023-04-03

全球热点!每个年龄生日礼物

2023-04-03

东盟计划加强本地货币使用以应对全球危机_环球资讯

2023-04-03

国象女子世界冠军候选人赛决赛:谭中怡与雷挺婕前半程平分秋色 快资讯

2023-04-01

以色列连续两天空袭叙利亚 一名伊朗革命卫队军官死亡|快消息

2023-04-01

“刮腻子世界冠军”马宏达:不言放弃,是少年的底色

2023-04-01

什么是贝壳马赛克(贝壳马赛克背景墙) 当前快报

2023-04-01

美国阿肯色州连遭两次龙卷风袭击 超7万用户停电_环球视讯

2023-04-01

现实版“药神”案宣判:免刑罚!

2023-04-01

每日观点:比亚迪出海印度,将交付100辆乘用车

2023-03-31

因编制虚假资料,鼎和财险武汉中支合计被罚12万元-天天亮点

2023-03-31

香港中文大学深港创新研究院(福田)正式启用

2023-03-31

环球快讯:浙商证券:给予东方证券买入评级,目标价位13.36元

2023-03-31

牙仙女的礼物红樱教育

2023-03-31

世界通讯!带龙字的公司名称 龙字配什么字开公司好

2023-03-31

银保监会:鼓励人身险公司使用保单贴现法开展人寿保险与长护险责任转换业务试点

2023-03-31

GUCCI古驰复古又好看这几款真的太值得了!

2023-03-31

保险科技初创公司Qoala获得750万美元融资

2023-03-31

收藏版!山东文旅深度融合29条来了

2023-03-31

世界新动态:欧洲整形外科医生要求停售透明质酸

2023-03-31

魅族20系列现场体验:无界版有惊喜|当前报道

2023-03-31

血脂检测列入中小学体检常规项目|全球报资讯

2023-03-31

洛阳将收购5000套存量商品住宅、公寓用作租赁住房 天天热消息

2023-03-31

省级示范!德州市平原县入选!-天天亮点

2023-03-31

tt玩 官网_tt娱乐城官方网站

2023-03-31

溥仪至死都不清楚最后一位妻子的身世, 李淑贤的经历很神秘

2023-03-31

孩子的抚养费标准到底是多少啊?

2023-03-31

天天快讯:海信视像2022年营业收入457.38亿元

2023-03-31

焦点简讯:嘉泓物流(02130.HK)发布公告,该公司将于2023年7月17日派发末期股息每股0.1港元

2023-03-31

全球快消息!天使只喝碳酸饮料3 (new bing机翻润色)第二章(2)

2023-03-30

大盘全天探底回升!大消费概念股午后集体走强

2023-03-30

湖南发展(000722):年度股东大会通知,审议提案1:关于《公司2022年度董事会工作报告》的议案等多项议案

2023-03-30

四川省工业和信息化技术技能大赛——首届中药炮制工技能大赛决赛在峨眉山市举行

2023-03-30

今日观点!信阳市固始县公安局组织开展“认识自我 与压力共处 ”专题心理健康讲座

2023-03-30

“东北药茅”长春高新年报出炉,这份成绩单如何?

2023-03-30

2023年的经济,第一个季度就倒下了...|环球观天下

2023-03-30

贝泰妮(300957):限制性股票激励计划目标积极 科研赋能高质量发展 头条

2023-03-30

壕!国产商用卫星上架淘宝,200万元起,可领3元满减券

2023-03-30

当前通讯!Experts share views on Chinese modernization at Boao | 博鳌论坛,专家学者“对话海南”

2023-03-30

天天新消息丨送男孩什么礼物好呢,最佳值得入手送礼指南

2023-03-30

一手是多少股 全球最资讯

2023-03-30

信捷电气:公司业务涉及智能制造

2023-03-30

全球快资讯:华金证券给予宁德时代买入评级

2023-03-30

天天热议:福建2023年护士执业资格考试准考证打印入口已开通

2023-03-30

临泉一男子报警求助反被查出酒驾!还想甩锅蛋黄派?!|全球视讯

2023-03-30

环球热点!网传量化圈知名大佬给李蓓发半裸照被吐槽:我一点儿兴趣都没有

2023-03-30

今热点:伊尔62中国民航_伊尔62

2023-03-30

西蒙斯向蔡老板索要12万血汗钱,如果篮网队不给西蒙斯直接摆赛 全球简讯

2023-03-30

瑞港建设2022年业绩亏损1.2亿港元

2023-03-29

春风花海中 用脚步丈量宁波美景 环球速看

2023-03-29

全球微资讯!2日1板兆龙互连:可应用于云计算和数据中心领域的高速互连产品体量较小,公司业务基本面没重大变化

2023-03-29

2023上海二级建造师成绩查询时间+查询入口-全球即时

2023-03-29

天天微头条丨快手2022年第四季度财报:营收283亿元 同比增长15.8%

2023-03-29

部编版语文一年级上册《夺冠金卷》(可下载)

2023-03-29

坚决拆除违法建设,全面优化市容环境

2023-03-29

环球今头条!冷眼是什么意思 冷眼的用法

2023-03-29

大象微评|城市“面子”很重要,但还有更重要的东西

2023-03-29

b to b是什么意思_世界微速讯

2023-03-29

当前热讯:春天的风说来长春逛公园吧~

2023-03-29

高铁隔音板有效果_高铁隔音板

2023-03-29

当前热议!全球及中国IGBT器件行业专项深度调研及投资规划指导可行性预测报告(2023版)

2023-03-29

节理按成因分为几种类型_节理

2023-03-29

今日播报!发挥知产司法保护优势 助力新时代东北全面振兴

2023-03-29

全球快资讯:极兔快递拿下TikTok

2023-03-29

明日湖人客战公牛 詹姆斯出战成疑 浓眉&拉塞尔大概率出战 世界短讯

2023-03-29

天堂2020完整版免费(天堂2誓言) 每日快讯

2023-03-29

大港油田建成10万吨级页岩油效益开发示范平台

2023-03-28

南钢股份: 南京钢铁股份有限公司2022年年度利润分配预案的公告-环球快看点

2023-03-28

念好山海经 走好振兴路-环球速讯

2023-03-28

“春游模式”已开启,上海这个景点已被学生承包,单日迎来万人团

2023-03-28

Apple Music Classical 古典乐上架App Store,苹果官方解释原因

2023-03-28

信用卡逾期7万怎么办?信用卡逾期了公积金还能提么?

2023-03-28

环球关注:伟星股份:截至2022年12月31日,公司共拥有授权专利1,139项(海外授权专利18项),其中发明专利207项

2023-03-28

GPT-4救了我狗的命

2023-03-28

全面提额!牡丹江市住房公积金优惠政策来了

2023-03-28

当前看点!厦门户籍单身人士可购第二套住房

2023-03-28

闭嘴当我的丈夫游戏(闭嘴当我的丈夫中文全流程攻略_千金逼我嫁全流程攻略)

2023-03-28

观焦点:太原移动紧急提醒:警惕!新型GOIP可能就在你的身边

2023-03-28

苏菲·玛索主演的5部限制级电影,全看过的真是幸运了

2023-03-28

Elle编辑在斯德哥尔摩平静舒适的现代公寓 视讯

2023-03-28

【独家】限免丨3 月 27 日优质应用限免,值得拥有~

2023-03-28

直播出故障,红毯临时取消女明星各拍各明争暗斗 当前信息

2023-03-28

即时焦点:吃牛油果能减肥吗?

2023-03-27

上海钢联:公司是大宗商品及相关产业数据服务商-信息

2023-03-27

“单腿走路”的毛戈平:产品全靠代工,研发费用率不足1%,核心品牌存货逐年攀升 | IPO观察

2023-03-27

幼儿园保教工作计划模板(5篇)

2023-03-27

无尽守护牛牛破防流怎么搭配 牛牛破防流阵容搭配推荐 世界实时

2023-03-27

港股异动 | 建滔积层板(01888)绩后跌超4% 全年营收减少22% 纯利同比下滑近72%

2023-03-27

描述秋天的词语有哪些(描述秋天的词语) 世界动态

2023-03-27

经济大家谈|新时代促进农民增收的经验启示 焦点滚动

2023-03-27

世界聚焦:安老院

2023-03-27

1-2后,国足要拼命,目标反超亚洲第9,为世预赛铺路,新帅迎曙光

2023-03-27

我国首座深远海浮式风电平台将出海,漂浮式海风未来可期,关注四条投资主线_每日短讯

2023-03-27

沉默的真相结局什么意思(沉默的真相结局)|世界快看

2023-03-27

救人牺牲消防员父母两遭丧子之痛 具体是怎么回事 天天热点

2023-03-27

【快播报】最初的梦想歌曲mv_最初的梦想歌曲

2023-03-26

重庆大学附属肿瘤医院科学城院区奠基 预计2026年3月投入使用

2023-03-26

2019年的今天:郭艾伦砍下生涯最高的46分 世界聚看点

2023-03-26

多姆专访吴冠希 |最后四场对我们都很重要 要拿出必胜的心态去打_当前观察

2023-03-26

大湾区,文化“春雨”正及时_全球热点评

2023-03-26

加百利是什么啊 环球视点

2023-03-26

中国足彩网竞彩26日推荐:神户胜利船全取3分

2023-03-26

谷氨酰转肽酶偏高的原因100严重吗_谷氨酰转肽酶偏高的原因

2023-03-26

chkdsk命令可以终止吗

2023-03-26

环球精选!哲仁王后大结局是什么

2023-03-25

苹果到底还有可能发表哪些产品?_前沿热点

2023-03-25

我的愿望普通话三分钟500字_我的愿望普通话三分钟

2023-03-25

南昌西二环项目稳步推进

2023-03-25

抖音月月大小姐事件是什么

2023-03-25

vivo将于2023年第3季度推出S17系列手机:3款机型 最高16GB内存

2023-03-25

货运代理合同中有哪些权利义务

2023-03-25

对劳动仲裁部分不服法院应当如何处理

2023-03-25

金陵科技学院图书馆怎么样

2023-03-25

全球前三大富豪两个卖奢侈品

2023-03-25

观察:如何快速实现一个定时器

2023-03-25

环球观天下!圣诞节儿歌贝瓦儿歌_圣诞节儿歌

2023-03-25

斗牛技巧和概率5张牌_斗牛技巧

2023-03-24

假面骑士Geats:说说四位支持者所追求的东西,都是属于感情的一部分-视点

2023-03-24

如何举报一个网站_全球快看

2023-03-24

河南长葛市开展“两看两讲两比”活动推进“五星”支部创建

2023-03-24

记者谈纳帅下课:表现不稳定&球员反对他,拜仁不想错过图赫尔|当前观察

2023-03-24

美财长说准备采取更多行动确保银行存款安全 环球通讯

2023-03-24

【热闻】云岩区大凹村:绘就幸福街 打造舒心港

2023-03-24

东宝生物:公司已实现药典二部明胶的销售 开发苏州贝朗作为药典二部明胶的明星客户

2023-03-24

当前热门:颈椎病治疗5个小窍门_7个有效的颈椎病的自我治疗方法

2023-03-24

如何查找之前的QQ聊天记录

2023-03-24

闻气味、想脱单?瓦屋山野生大熊猫集体出游_世界观察

2023-03-24

焦点消息!盐湖股份:近年来,公司钾肥产量维持在500万吨左右

2023-03-24

我国科学家发现耐碱基因可使作物增产

2023-03-24

环球速看:送女友 足浴磨脚器5.9元

2023-03-24

文丘里混合器与射流器的区别_文丘里混合器-环球简讯

2023-03-24

每日热议!关于弹簧钢成分分类

2023-03-23

【世界速看料】结婚的秘密郑雅文结局_结婚的秘密

2023-03-23

环球今热点:Java循环运行时暂停一段时间

2023-03-23

11万元现金被盗嫌疑人拒不认罪,一组编码成破案关键…… 热点聚焦

2023-03-23

世界热推荐:硅谷银行破产、瑞信银行被收购,一文读懂欧美银行业为何持续波动|钛度图闻

2023-03-23

美联储加息“靴子”落地 A股迎来反弹 能持续多久?

2023-03-23

安徽一市教育局原局长受审!被控受贿900多万! 环球今热点

2023-03-23

一键加油怎么操作 天天视讯

2023-03-23

大众v6有什么车型 全球视点

2023-03-23

全国水利工程供水能力超过8900亿立方米 全球热讯

2023-03-23

复方鲜竹沥液的功效_复方鲜竹沥液的功效 每日简讯

2023-03-23

快看:凯发电气:公司并不是国资控股企业

2023-03-23

稳经济 促发展 强信心 | 做好企业“娘家人” 助企纾困解难题

2023-03-23

郭守敬主持修订了什么东西|前沿热点

2023-03-23

嵯峨天皇_嵯峨

2023-03-23

3月23日起,天府机场公交专线增至5条均24小时运行

2023-03-22

海南开展“六水共治 共护母亲河”节水宣传活动

2023-03-22

光棍节分别是几月几号

2023-03-22

股票期权是什么意思?股票期权交易规则是什么?

2023-03-22

环球实时:与你相遇,怦然“新”动 郑州11中开展学生社团纳新活动

2023-03-22

天津养老金上调方案最新消息2022-2023 天津退休金计算公式2022-2023计算举例

2023-03-22

身体这2处“越痛”,说明血管堵得越严重,不能拖,该清理血栓了

2023-03-22

天天热讯:1至2月全区规上工业增加值比增7.7%

2023-03-22

内蒙古发布暴雪橙色预警-天天快消息

2023-03-22

被多国“疯抢”的中国罐头为啥这么火 海外需求持续增长创新高!

2023-03-22

全球新消息丨金智科技(002090):3月21日北向资金减持2.8万股

2023-03-22

什么是主营业务成本_什么是主营业务

2023-03-22

翘首企盼的意思_企盼的意思

2023-03-21