首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从等待7*24小时到秒出结果,我是这样优化的...

“ 你是否遇到过这样的困扰:明明数据就在那里,却要等好久好久才能查出来;眼睁睁看着数据量越来越大,系统却越来越慢。这些问题在电商搜索、用户画像、日志分析等场景中太常见了。...这让我想起了Apache Doris强大的索引能力,尤其是它2.0版本推出的倒排索引特性。 经过一番调优后,我们的查询性能提升了近100倍。这次经历让我对Doris的索引体系有了更深的认识。...在深入探讨这些索引的技术细节之前,我想先分享一个有趣的观察: Doris的索引设计非常贴合人类的思维方式。...唯一需要注意的是,FLOAT和DOUBLE这样的浮点类型不支持倒排索引,需要改用DECIMAL类型。 这里分享一个实战技巧:在创建倒排索引时,要根据数据特点选择合适的分词器。...在处理时序数据时,我发现一个有趣的组合:把时间列放在排序键的第一位,同时对它建立倒排索引。这样时间范围查询既能用到前缀索引,又能用到倒排索引,查询优化器会选择最优的执行计划。

5500

你知道吗?使用ES的坑

这个问题还是比较严重的,优先解决报错的问题,回想了升级的内容后,很容易就定位到问题了,顺利解决(你以为我要说报错的问题吗?这是另一个更长的故事)。...02 根据对系统的了解,我判断出列表数据读取的是ES上的数据,而详情页(第3步)中的数据来源于数据库,是因为两边的数据不一致吗?查了下数据库,确实没有那几条重复的数据。...因为双写(同时写数据库和ES),才导致了这个问题,那就去掉双写,只写数据库,然后通过异步或者MQ的方式,再去写ES,这样能解决一致性的问题,但是时效性会差点。 2....在异常类中统一处理,如果发现这个方法有异常抛出,就记录数据信息,去ES中做对应的回退操作(分类处理,例如数据库是insert操作,就调用ES的delete操作数据删除),人为实现ES的回滚; 3....解偶,在方法中只处理双写操作,其他的业务逻辑做异步处理(例如这个场景中,事件更新可以异步处理,并做对应的补偿机制),这样就不会影响主数据的一致性。

56830
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    事务一致性测试

    这个问题还是比较严重的,优先解决报错的问题,回想了升级的内容后,很容易就定位到问题了,顺利解决(你以为我要说报错的问题吗?这是另一个更长的故事)。...02 根据对系统的了解,我判断出列表数据读取的是ES上的数据,而详情页(第3步)中的数据来源于数据库,是因为两边的数据不一致吗?查了下数据库,确实没有那几条重复的数据。...因为双写(同时写数据库和ES),才导致了这个问题,那就去掉双写,只写数据库,然后通过异步或者MQ的方式,再去写ES,这样能解决一致性的问题,但是时效性会差点。 2....在异常类中统一处理,如果发现这个方法有异常抛出,就记录数据信息,去ES中做对应的回退操作(分类处理,例如数据库是insert操作,就调用ES的delete操作数据删除),人为实现ES的回滚; 3....解偶,在方法中只处理双写操作,其他的业务逻辑做异步处理(例如这个场景中,事件更新可以异步处理,并做对应的补偿机制),这样就不会影响主数据的一致性。

    31220

    Flutter中Dart异步模型

    异步任务调度 为什么单线程也可以异步?这里有一个大前提,那就是我们的 App 绝大多数时间都在等待。比如,等用户点击、等网络请求返回、等文件 IO 结果,等等。...而这些等待行为并不是阻塞的。比如说,网络请求,Socket 本身提供了 select 模型可以异步查询;而文件 IO,操作系统也提供了基于事件的回调机制。...所以,基于这些特点,单线程模型可以在等待的过程中做别的事情,等真正需要响应结果了,再去做对应的处理。因为等待过程并不是阻塞的,所以给我们的感觉就像是同时在做多件事情一样。...异步函数 Future 是异步任务的封装,借助于 await 与 async,我们可以通过事件循环实现非阻塞的同步等待。Dart 中的 await 并不是阻塞等待,而是异步等待。...Dart 会将调用体的函数也视作异步函数,将等待语句的上下文放入 Event Queue 中,一旦有了结果,Event Loop 就会把它从 Event Queue 中取出,等待代码继续执行。

    1.9K42

    如何用信号量去实现一个限流器?

    一个计数器,一个等待队列,3个方法(init(),up(),dowm()) 3)信号量的工作原理是什么?...当线程进临界资源的时候,先把count-1,然后看是不是等待队列去。...如果>=0,那么可以进入,出来的时候把count+1,当count>=0了,那么就去唤醒等待队列的一个线程。 4)有了管程了,那信号量还有存在的意义吗?...那我可以这样设计,count初始化为10,那么我10个线程拿到count的时候,都是>=0的,第11个线程来的时候,把count-1,count=-1小于0了,所以进等待队列去。  ...pool.exec(t -> {      System.out.println(t);      return t.toString();  }); 6)思考一下,上面的限流器使用的是vector来做对象集合的

    27410

    【5min+】帮我排个队,谢谢。await Task.Yield()

    它会和我们C#里面都关键字一样吗? 而且您会在某些框架或者代码中看到:一旦使用它的话前面都会加上await关键字。这样就写成了 await Task.Yield() 。那么这种写法到底有什么意义呢?...传说中的await Task.Yield() 国际惯例,先来看看Msdn给出的解释: 创建异步产生当前上下文的等待任务。 这NM,什么鬼。...以吃火锅为例,我们寝室聚餐,我第一个先到了,此时不用排队,但是小王要加班没那么快到,所以我还是只能去前台拿号等待。...而火锅店门口那些等待的人就是系统中其他的任务。 我们怎么去保证任务分配最优呢? 是我先来火锅店门口所以就让我先进店一直坐在位置上吗?...所以现在来看MSDN对Yield方法的解释:“创建异步产生当前上下文的等待任务。可以在异步方法中使用 await Task.Yield(); 来强制异步完成方法” 。

    2.3K30

    ✨从异步讲起,时间,时间,请给函数以答案!

    这样做有何好处?核心好处是分离 创建(发布)  和 调用(订阅消费) 。 异步与回调的核心意义不正在于此吗?...我订阅你的博客,你发布了新内容,于是就通知我这边,好了,这样一来,我也不用干等,只要你发布了新的文章,我就可以按照自己的方式来消费它们。各干各的。...并且我消费的方式可以是花里胡哨的,可以坐着看、躺着看、上班看、睡觉前看、拉屎看,与你发布无关。 异步和函数式 “JavaScript 异步和函数式有什么关系?” 有关系吗?...异步与时间 “JavaScript 异步真的简单吗?” 想一想,JavaScript 异步的设计真的就是简单吗?...结语 为什么是异步?因为我们不想浪费因同步等待阻塞的时间。 但是你时间又总给函数带来困惑,异步中,我要沿着时间线不断去追溯你,协调因响应先后不同带来的差异。

    1.1K20

    谈谈async await的理解!

    不过比起Promise之后用then方法来执行相关异步操作,async/await则把异步操作变得更像传统函数操作。...如果要把async函数方法跟Promise对象方法做对比的话,那么下面的Promise对象异步方法代码是完全相等于上面的async函数异步方法。...await await 操作符用于等待一个 Promise 对象,它只能在异步函数 async function 内部使用。...async函数运行的时候是同步运行,但是当async函数内部存在await操作符的时候,则会把await操作符标示的内容同步执行,await操作符标示的内容之后的代码则被放入异步队列等待。...(await标识的代码表示该代码运行需要一定的时间,所以后续的代码得进异步队列等待) 下面放一段await标准用法: function testAwait (x) { return new Promise

    47330

    【数据结构】你知道波兰表达式和逆波兰表达式吗?我才知道原来栈在表达式求值中还能这样使用……

    从这两种表达式形式我们可以看到,相对于中缀表达式,它们仅仅是改变了操作符的位置,这样做真的能够不依赖操作符的优先级吗?...如果仅仅通过文字,我相信这样的表述并不清晰,因此我们还是通过图来进行理解: 从图中我们可以到,对于波兰表达式而言操作符的顺序越靠后,运算时则越先运算,这个操作特性大家有没有想到什么?...如果是这样的话那逆波兰表达式不就正好相反吗?那具体是不是这样呢?...就比如对于波兰表达式而言,操作符都是放在操作数前面的,因此我想要栈中存放的是操作符的话,那我则可以从左往右进行扫描;而对于逆波兰表达式而言,操作符都是放在操作数后面的,因此我想要栈中存放的是操作符的话,...有这些想法的朋友,是真的有在认真思考问题,而且确实是这样,在表达式中,操作数既可以是整数,也可以是小数,当然,操作数还可以是表达式、函数、字符……因此我想说明的是,我们在看待表达式的组成形式时,不能局限自己的思维

    8410

    Web APP编程模型和IO策略

    一个极简高并发模型 因为有数年的嵌入式领域的经验,先说一下我认为的比较高效的处理模型。 硬件环境:单机30core, 1G Hz。...心中有这么一个极简的高效模型,后面学习其他模式的时候可以暗做对比看一下到底会有哪些额外的开销。...是比较常见的IO模型,网络编程中如果创建的socket的描述符属性设置为阻塞的,当socket对应的用户空间缓冲区内尚无可读数据时,该进程/线程在系统调用read/recv socket时,会将自己挂起阻塞等待...当然这样做对单个socket来说没有多大的意义,如果要支持大量socket的并发就很有用了,也就是IO复用。...异步非阻塞IO ? 对比同步非阻塞IO,异步非阻塞IO也有个名字—Proactor。这种策略是真正的异步,使用注册callback/hook函数来实现异步。

    91970

    RPC异步化原理

    试想一下,如果我们每次发送一个异步请求,发送请求过后请求即刻就结束了,之后业务逻辑全部异步执行,结果异步通知,这样可以增加多么可观的吞吐量? 效果不用我说我想你也清楚了。...有更好方案吗?服务端业务处理逻辑异步是个好方案。 调大业务线程池的线程数 勉强可解决这问题,但对RPC框架,往往都有多个服务共用一个线程池情况,即使调大业务线程池,较耗时服务很可能还会影响其它服务。...CPU大部分时间都在等待,并未得到充分利用,因此CPU利用率和服务吞吐量当然上不去了。对于这段话,其实线程处于等待状态时,不占用CPU资源。...更准确的描述:浪费宝贵线程资源,大量线程处等待状态,可能(不是一定)导致CPU利用率低。 使用异步的时候返回的速度变快了,但是后台所需要的线程数会变少吗?,线程池我理解还是被打满?...这样调用端就能发送更多的请求消息,提高吞吐量 服务端异步化,核心在于重分利用单机服务端的资源,避免CPU闲置,业务处理线程处于等待状态 若“业务线程池的线程数配置到200”,线程池被打满了,若单纯增加线程数量有用吗

    1.1K30

    深入理解RPC之传输篇

    使用 Netty 不能保证返回的字节大小,所以需要加上 in.readableBytes() 这样的判断,以及 in.markReaderIndex() 这样的标记,用来区分报文头和报文体。...同步与异步 阻塞与非阻塞 这两组传输特性经常被拿来做对比,很多文章声称 Socket 是同步阻塞的,Netty 是异步非阻塞,其实有点问题。...同步和异步关注的是消息通信机制所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。...如果不关心其返回值,则可以将其做成异步接口,以提升效率。 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态. 阻塞调用是指调用结果返回之前,当前线程会被挂起。...在上述的例子中可以看出 Socket 通信我们显示声明了一个包含10个线程的线程池,每次请求到来,分配一个线程,等待客户端传递报文头和报文体的行为都会阻塞该线程,可以见得其整体是阻塞的。

    1.1K70

    javaScript回调函数

    var A = function(){ console.log("我是回调函数A。")...; }; var B = function(callback){ console.log("我是主函数B内的代码。")...估计大伙会想,这样的回调有意义吗?把A函数的代码直接写到B函数里面不是更好吗? 如果在实际项目里这样写回调真的是糟糕透了。往下看,了解回调是如何应用的。...二、同步回调和异步回调 什么,回调不是异步的吗?仔细看看上面的例子,大家就能明白,回调不一定都是异步的,他有同步和异步之分。...由于 JS 是单线程的,一旦我们要执行一个长耗时的任务时,如果一直单线程的堵塞下去会导致程序的等待时间过长而使页面失去响应,非常影响用户体验。 为了解决这样的问题,我们就可以使用异步回调。

    3.6K20

    Kotlin | 从线程到协程,你是否还存在 上的使用疑问

    背景 事情源自这样,今天早上在群里,发现有同学问到了这样一个问题: 协程A:开启一个等待页面,wait,等到B完成后显示成功 协程B:与下位机通讯,等到下位机回复成功后,通知A协程 notify 具体对话图示如下...: 这个同学的想法是: 开启两个协程,协程A开启一个等待页面,然后在这里 wait 等待;等协程B这边执行成功后,再通知协程A去刷新。...作为过来人,我们不难第一反应,协程默认不就是同步吗,直接 suspend 就完了啊?为什么要通知呢?不是很麻烦吗? 解决这个问题很简单,但我的第一反应是,他似乎理解错了协程中的同步?...但反过来又仔细一想,这个同学为什么能存在疑问,似乎我也曾问过,为什么不可以等待另一个job来通知我完成了呢?所以我更想告诉他为什么要这样写?...而面对难解决的异步代码时,我们首要的不应该考虑如何去通知,而是看看能不能将任务拆分,比如将原有需要通知的这一步拆为三步走: 在非协程的世界,我们可能想,先执行任务A,等待任务B成功后,再去通知A继续执行

    1.4K20

    「消息队列」看过来!

    这不就是一堆消息的集合吗,关心这些消息的人都能通过「购买」来获得这些消息,而我可以通过不同种类的「杂志」或许到不同的消息。...然后就会去做对应的事,这样各个模块之间就解耦了。...发送邮件」、「修改库存」以及「通知经理」的代码都写入了我们的 Service 代码中,它们分别耗时:30ms、50ms、80ms,并且我们得知,原本最主要的功能其实是「发送邮件」,但我们完成主要的功能之后却等待了更多的额外时间...场景一:异步处理 通过上述的问题你也看到了,「消息队列」适用于异步处理,并且是那些不期望从消费者得到反馈的处理。...就好像一开始说到的设备坏了的问题,我只需要通知设备坏了,至于之后需要做什么事,关心的人自然会去做相应的处理。 场景二:日志收集 上面提到的异步处理,跟日志系统似乎搭配起来也很好。

    59020

    五分钟教会你JUC中的“CountDownLatch”和“CyclicBarrier”应该如何使用

    我们设想这样一个业务场景:我们的代码中需要执行三个任务A,B,C。 在这其中,任务B的执行需要A,C任务执行得到的结果。那么最简单的执行逻辑就应该是这样: 可是这样串行执行也太low了。...身为一名合格的程序员,我必须使用多线程了:我们把任务A和任务C调成为子线程异步执行。...于是我们的执行逻辑变成了这样: 可这样也不对啊,还记得我们之前说过任务B的执行需要依赖任务A和任务C的执行结果吗? 主线程是没办法直接执行任务B的。...也就是说在我们异步处理执行任务A和任务C的同时,还要设计代码逻辑使得主进程等待任务A和任务C的执行完毕。 在主线程内使用join方法吗?这也太low了。...而且这段代码会频繁的创建两个线程用来异步执行任务A和C。 [在 Java 中,join 方法是 Thread 类的一个实例方法,它的作用是让当前线程等待调用 join 方法的线程终止。

    10410

    说说你项目里使用的 MQ ,分布式系统中 MQ 作用?

    不要求实时的业务异步处理 用户注册业务流程为例, 用户注册入库 用户验证邮件发送 用户验证短信发送 原来的系统设计,这样的服务流程会串行处理,即先 1-2-3 ;但是这里可以思考下,如果单个服务单台机器的情况下...QPS * 3 提升三倍,这个时候引入 MQ 服务作为中间件 [异步] 如图可见,我在 A 服务用户注册完成后,就直接返回了,这个时候 MQ 用来发送异步处理消息,B,C 服务分别处理。...A 不用等待 B、C 的返回结果 ,这样用户体验就是只有 50ms 等待时间。而在邮件、短信这个阶段,因为网络延迟原因, 用户可以接受一定时间的等待。...真是缺乏社会的教育啊,兄弟 养得起吗?动不动一套保养套餐,1W/月 守得住吗?隔壁老王经常来你家吃饭吧,疯狂脑补。。。 吃的消吗?...红枣+枸杞+肾宝片,怕是心有余力不足吧 言归正传,其实我觉得这是一个思考题,首先我们要看的应该是条件是哪些? 用途?是用来做日志、解耦、还是异步处理 公司情况?

    2.1K00

    从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步

    你心里肯定已经骂上了:“WTF,你有这么闲吗?盯着老子,你就不能去干点其他事情吗?” 老板仿佛接收到了你的脑电波一样:“我就在这等着,你写完前我哪也不去,厕所也不去。”...我们可以看到同步这个词往往和任务的“依赖”、“关联”、“等待”等关键词相关,而异步往往和任务的“不依赖”,“无关联”,“无需等待”,“同时发生”等关键词相关。...就像下图这样: 从上图中我们可以看到:主线程中会有“空隙”,这个空隙就是主线程的“休闲时光”,主线程在这段休闲时光中需要等待数据库查询完成才能继续后续处理流程。...这样复杂数据库的团队就和使用方团队实现了所谓的解耦。 现在你应该明白回调函数的作用了吧。 另外:仔细观察上面两张图,你能看出为什么异步比同步高效吗?...原因很简单,这也是我们在本篇提到过的,异步天然就无需等待,无依赖。

    65151

    What, 数据库脑裂了?

    在朋友圈,我经常唠叨,数据中心的两地三中心架构。 郑州的期货交易所,就是采用了这样的架构,在三次暴雨袭击后,仍能屹立不倒,从容不迫服务每笔交易。...详细请戳这里: 郑州暴雨肆虐,商交所数据中心屹立不倒,它做对了什么?...我没有郑交所的工作经历,并不知道具体内幕。...当再增加“从从”库,虽说能服务的用户更多,但等待时间也会线性加倍延长,而且大有提高更新失败的概率。 当每一个从库都采用同步策略时,仅等待日志确认,都可以杀死一大批请求。...而当采用异步时,从从从库的数据又丧失了与主库的一致性。 因此,折中的办法就是一台从库采用同步,其他从库则采用异步复制数据。 复制,一个倒下去,另一个站起来 数据复制的另一个好处,提供高可用。

    1K10
    领券