百度AI创业大赛第一名融资-AI导购-终面

2024年4月22日 上午 10:23|32分钟 22秒

关键词:

线程池、电商、链路、流量、压测、飞书、产品、数据库、异步、后台系统、核心链路、京东零售、外包项目、工作线程、链路接口、业务场景、跨境服务、业务核心

文字记录:

我主要工作其实就是旧的整个 bytesmart 点 AI 的工程这一块,尤其是主要是后端 Server 这一块,然后目前也在做那个用户增长,就是广告投放那一块。然后你对 bytesmart 公司团队或者产品有什么想要了解的或者问题,可以我们最后留 5- 10 分钟时间,我们可以,你可以随时问我,让他先简单自我介绍一下。

需要开视频吗?

都可以。

那我开一下吧。

自我介绍

还在?

那为什么不在德欧继续实习假群呢?

他这边没有转正机会,主要是然后我马上要毕业了,我。

他让你一直实习到毕业,但是没给你转正机会,是吧?

嗯,对,这边都没有转正机会,实习生。

OK,所以你在看新的信息就会并且有可能短暂的,是吧?嗯,对。OK,行,对,我看你简历经历还是挺丰富的,然后你说一下你在那个得物实习的相关工作内容,我要讲一下业务场景,然后你做的一,你整个公司或者整个大盘的业务场景,以及你做的一些事情。

噢,好,我主要是国际电商部门的,然后我是这边的一个跨境小组,这跨境域的这个小组这边的主要做的话就是我们关于我们可以。

稍微大一点点,不好意思,现在可能在机房可能有点吵,好声音大一点点,可以。

我是得物这边国际电商部门的,然后主要做这个声音可以吗?可以可以,主要做的我是国际电商部门的,然后主要是跨境域这个小组里边的,我们主要做的是跨境后台系统的一个迭代,然后主要的功能的话,就是一方面的话是主要是接入我们这个 c 端的一个,就是我们平时涉及到一些得物,全球购里边涉及到一些进口商品的一个三单,进出口商品的一个三单报关,就是说订单报关、运单报关,还有支付报关,还有就是我们国际出,国际进口和出口它需要经过我们的海关吗?它里边会涉及到一些商品的一些备案的话,也是我们在这边在做。

还有就是我们涉及到一些跨境出口三单报关里边涉及到一些关务的一些主体,然后主要也是我们这边国际跨境后台这边在提供,然后我的话是跨境一小组里面的,然后主要负责的有三大块,第一块的话就是负责我们个跨境后台系统,一些小区的一些迭代。第二块的话主要是我们跨境计划域里边,我们涉及到了一个飞书机器人里边一些需求的一些编写。第三块的话就是我参与过一些我们小组内的一些技术改造的一些工作。主要是。

这些,你刚才说到这个后台系统,那这个相关后台从我理解应该是他的用户应该是得物内部的,像一些运营一些工作人员的,不是直接的得物 c 端用户的。

不是我们这边跨境服务的话主要有两部分,一方面的话是服务于我们的跨境后台系统的,另一方面的话我们需要去,就是我们需要去服务我们的 c 端,因为它里边涉及到就是一些,就比如用户买了一个,它涉及到每它支付完成之后,它我们需要去提供给我们另外一个部门,它去进行一个支付报关嘛。比如用户支付之后,然后这个支付报关里面的话需要去调用我们这个海关的一些接口来去校验当前用户,就是他,比如说他本当年的话有没有他海外商品的一个消费金额?他有没有到达某一定的金额吗?如果到达的话,那么他就不能够去购买,所以。

说有可能 c 端请求会直接扩到你的 Server 吗。

是的。

那你大概这个 QPS 量有多少?

q p s 的话一般就几百吧。

有几百个 QPS 吗?

有的,我们现在的话其实就是每分钟的订单量的话,我们都其实都接入了我们那个飞书,就是我们接入的监控,它每分钟的话都有 300 个订单。

对,每分钟 300 个,那转换成 QPH 的话是多少?

具体的我不是很清楚,我没有参与过这个压测。

说让你开发了一些feature。说让你开发的一些功能。

比如我们涉及到一个电商主体可配置本身的话,我们电商主体可配置它主要是适应我们那个深圳一些口岸的一些政策,比如它可能假设我们就是报关的一个主体,如果是深圳那边的企业的话,那么它可能会退税六六七八六七百万嘛。然后原本的话,我们报关主体的话主要有三个,一个是得物主体的,一个三爷主体的,还有一些其他的一些待曝光的一些指的。曝光。

指的是什么呀?

就是我们就是曝光的时候,它不是有一个关物的一个主体,就是我们电商企业。电商企业是什么?然后他就是,然后他那个报关的那个主题是什么啊?OK,然后然后我们本身的话它全都是写死,就是本身的话全部是写死在我们那个注册中心 Ark 里面的,然后它通过我们的 LK 进行一个下发的,然后现在的话我们就是需要去定对它进行一个动态的一个变更嘛。

所以的话我们就是在对于我们这个跨境后台系统去新增一个功能,就是能够去支持我们这个就是不同口岸的一些报关主体的一个动态的一个切换嘛。这是第一个,还有的话就是我们监控里边的话,比如最简单的一个,可能我们本身的话,现在飞书的话,它因为它才刚迁移不久,所以它并不是合理怎么。

做,刚刚那个动态是要做个什么动态的配置中心吗?还是什么做动态可配置的东西,是吗啊?

对,我们是写最后,其实写到全部写到数据库里边了吗啊?因为我们这个跨境后。

那直接读数据库的数据可以了,不需要动态配置吗?还是说动态去修改?

就是我们本身的话全部是写在注册中心里边的,然后现在的话就全部搞到数据库里边去进行一个配置。因为我们的话就是它涉及到就是具体走哪个口岸的话,它我们跨境后台系统里边会有一个配置来去根据我们这个就是我们这个商品的一个类型,然后还有他一些其他条件,比如他发货的地,发货的一个区域是什么?还有就是我们他的一个价格是什么?然后他会去动态地去选择,因为他有很动态选择走哪个口岸,然后具体走哪个口岸它已经关联了,我们这个就是报关的一些主体在里边了。

对,但其实说要素材料就做直接从数据库里面读取消息就可以了,是吧?读取数据就可以了,是吧?

嗯,对,它其实就是跟我们其他一系列具,比如我们有一个商品在下单之后,具体走哪个口岸,它是需要去根据我们电商跨境电商后台里边那个配置的一些规则去进行一个判断的。然后它根据一些前置的规则判断之后,再去选择我们到底走哪个口岸,然后这时的口岸的话,它已经跟我们在配置里面已经去绑定了我们这个报关的一个企业是什么?

那里面数据库用的是什么MySQL?那你 Server 这边就服务这边呢?嗯,服务这边是用的怎么写的?

服务?哦,我们全部是用的 spring boot,然后以前的话是使用的是 spring cloud 那一套的,然后现在的话其实然后现在的话全部已经从我们的那个 open FIN 迁移到我们的 double 了嘛。然后现在的话,其实我们项目里边就起耦合了很多框架了,已经属于是,然后因为它。

不好很。

比如,对,比如我们注册中心,它里面可能就有三个注册中心在里面。我们那个现在用的是Nicos,他自己自研的那个 AR k 现在角度,然后它里边还有可能还有以前那种。

阿波罗,是那个配置中心吗?

这个现在不用了,主要是可能以前就是我们里边有些代码是以前的,然后之前最近的话做了一些改造,他还没有办法立刻去删掉嘛。

你这个 you Bob 那个异步化改进是什么东西?

就是我们 double 了,它本身,比如我们以前,我们,我先说一下我们这边的话,就是关于我们 open thing 是如何切到 double 这一块的,说它本身我们里边全部是用的 open 费,然后他要切 double 的话,其实改造起来是比较麻烦的,而且就是所以他其实的话是重写了我他用了一个 double transfer 一个模块,它是重写了我们 open FIN 的一个代理层,然后它是用了我们这个 FIN 的一种声明方式,然后去底层的话会去调用我们 double 的一个接口。然后它再采用我们那个 FIN 接口去进行一个兜底的。如果 double 没有调用成功的话,这样。

的话改动起来 double 是什么呢?你的 double 是一个什么东西啊?你的 double 是什么?

就是 RPC 框架。 double 不是 r v c 框架吗?OK。

然后,然后你们就把之前的 RPC 框架改成现在这个 double s 的。

之前是用那个 open fee,就是基于 HTTP 那个,然后现在的话就是重写了代,重写了 open feed 代理层,然后用 feed 的声明方式去调用我们的double,但是里边的话就是它随着接口我们越来越多,还有就是我们以前在实现我们 open fan 进行一个多接口、多个服务、多跨微服务调用多个接口并发的时候,它需要实现我们的异步来提高我们接口的性能吗?他以前的话其实是由我们那个自定义线程池来实现的,然后我们现在项目里面其实就是有非常多的一些线程自,就是我们开发里边在定义了非常多的一些线程池。然后我们没有去对线程池的资源进行严格管控。然后的话就是我们以前那种实现我们 open fee 异步化那种方式的话,其实在 double 里边的话其实是一种资源的浪费,因为我们 double 它底层的话,它其实是用的我们那个 native 本身的话,它其实是一个同步非组织的一个模型,属于是我们 IO 多物复用它本身的话,它其实就是一个异步化的一个框架double。

然后它 double 底层的话它其实是为了帮助我们,为了适应我们平时同步一同步调用的一种方式,然后它是自动去帮我们进行了一个封装,就比如我们 double 底层它可能返回的就是一个 future 对象。然后它自底层的话就自动帮我们去调用了我们那个 future Git,所以它的话是一个同步的一个模型,所以我们 double 异化的话主要就是将我们 double 那个限制 double 变成异步来进行一个执行,然后通过我们那个 compatible future 来进行一个异步的一个编排嘛。

对,你刚刚说它底层用的是那个 filter 到get,那怎么把它变成一组?

它本身的话其实就是异步的,它本身就是一个 future 返回,然后它底层的话是把我们那个 future 包装成了一个那个 comparable future,然后支持我们的异步化。

我想一下就是我们本身如果使用我们那个 FIN 来进行一个调用的话,那么它全部的阻塞都是放在了我们这个 Java 的自定义线程池里面嘛。但是如果我们使用了 double 异步化之后,相当于我们把原本假设,如果我们还是按照原本的方式在我们的线程池里面去调用 double 接口,那么它就是,嗯, double 里边是组, double 里边那个调用的话,它其实就是阻塞住的,然后它本身又转化成了同步调用,相当于我们在线程池里面又调了我们的 future 点get,相当于又把我们这个 Java 线程这个阻塞了,所以它并没有真正去解决我们这个阻塞转移的这个问题啊。阻塞的问题,而是去把我们的阻塞又转移了一份到我们那个 Java 线程池里面去,所以我们其实 double 异步化就是把我们 Java 线程的阻塞重新回归到我们 double 那个里边去。因为我们 double 底层。

的意思就是说你在 Java 里面线程里面不再开一个线程去调double,直接用在主线程里面调 double 吗。

不是,我们,就比如我们 spring 内部的一个接口下面有我,然后到我们 Tomcat 的一个工作线程,然后它里边要去调用我们五个其他微服的一些接口嘛。然后其中的话可能还有一些接口的话,它是存在一些相互依赖的关系的。那此时的话我们要实现去并发调用的话,那么如果是 double 的话,那么这我们就可以去对它,对我们这些接口进行一个改造,就是我们可以让它全部都去返回我们的 compare be future。它的 future 的话,它其实就是。

把这五个对外接口全部放到一个 future 里面,是吧?

就是,嗯,那个可。

5 个,五个对外接口全部, 5 个对外接口全部放在一个 future 里面去,是吧?

对,因为我们可怕。

future 里面,是。

吧啊?对。这样的话它其实底层的话就真正阻塞的时间只有我们调用最长的那个接口的一个时间,在我们那个工作线程里面,然后 double 线程池的话,它其实也是一直在工作的,因为它是基于 IO 多路复用的嘛。

然后如果之前是怎么做的?之前这样做,你们之前是怎么做的?

之前的话其实就是用的 Java 线程池,就是我们里边调 double 接口,因为它一那些 double 接口的话都是通过那个 Vin 以前那种遗留下的 FIN 改造过来的吗?

所以你们之前没用 future 去存结果吗?去去拿,去存外部 API 的请求的结果吗?

用了,就是怎么说呢?它?就是我们以前它没有用 double 异步化,而是像我之前说的,就是用了一个线程池来实现我们不同接口之间的一个异步调,用的相当于我们就可能它也使用了我那个 compare future,但是它依赖是我们 Java 自己定义的一个线程池,所以它还是产生了一些多余的阻塞。然后我们 Java 线程池里边如果参数一旦我们没有配好的话,那么流量一大的话,它也可能会卡死吗?

对,然后这个 double 里面,你之前也是在 Java 限量词里面用,再去调double,然后用 future 包装了 double 的结果。那你后面呢?后面怎么改的呢?这有点。

后面的话其实就是基于我们 double 异步化,等一下,我说一下,就比如我们有一个方法,它本身的话是我们远程暴露的一个 double 接口,比如我们在一个公共模块里边定义了一个接口,然后它本身的话返回值是一个result。然后我们现在其实只需要去在我们对端新增一个方法,然后新增一个方法,让它返回我们的那个 compare future,那么它底层 du double 底层的话会自动去进行一个判断,我根据我们的返回去进行一个判断。如果我们返回只是一个 compare future 的话,那么它就不会去自动帮我们进行一个同步,而是就直接把我们的 compare few future 进行一个返回嘛。然后我们就可以根据它进行一个异步编排,然后后续的话,如果对端法调用完毕有返回值之后,那么它就会通过我们的 native 传输到我们那个消费者端,然后再去根据我们缓存。就是我们会它底层的话会对我们那个future,然后根据我们协议头里边带了一个唯一ID,然后去进行一个缓存嘛。然后我们后续的响应的话也只要带着这个协议投回来,然后在解析的时候他会。

帮你去处理这 5 个 API 的这么一个个等待时间或者结果,你不用自己去在外面用 Java 的那个。

对对对。

去阻塞主线程,是吧?

对对对。

就你们那边只要拿一个结果就可以了,是吧?

嗯,对,主要就是最多。

那至少要输入一些,比如说最大等待时间或者 time out 之类的一些参数,要配置。

一般来说的话,一般来说最后的话都是用那个 off 来等待,一般等待时间的话,其实这个的话就设置,一般设置只有 3 秒钟吗?

OK,这个解决方案是你提出的吗?还是。

不是。

你们一起啊?这个。

是,其实是中间件部门下发的这个任务,他们中间件主要负责就是我们基础架构的一个改造,这是他们下发的一个任务。

然后你负责来代码实践,对吧。

对,我负责,主要负责就是我们。

做完之后有做一些 Benchmark 的一些。

做过的。

大概怎么样?

压测过的,他们就是中间件部门,他们压测过主要就是我们机器响应 RT 可以提高30%,然后我们这个机器就是我们机器资源服务器,机器资源可以缩减到 1/ 3,缩减 1/ 3 可以。

一天缩减 1/ 3。

他们的话主要压测的是通过我们那个 c 端,就是得物里边有一个订单,有一个机器人, c 端里面有个机器人,它主要是通过那个机器人压测。

那你们比如说扩外部的一个大概请求的耗时多少呢?扩外部。

c 端的话,主要 c 端的话必须在 c 端的话主要是必须在 200 毫秒以内的,有的有些极端场景,有些比如我们那个支付域,它必须要求在 100 毫秒以内,如果是 b 端场景的话,一般来说就 500 毫秒以内就可以。

对,你们不是刚刚提到有 5 个对外,一个 5 个过外面的接口,是吧?嗯,是这个意思吗?你看刚刚用多线程不是要去处理有 5 个对外的接口,是吧啊?调用这 5 个对外的接口,然后拿结果,是吧?嗯,主要的主要服务的耗时是在这里,是吗啊?对,它,因为它涉及到就是个 IO 的一个 IO 的一个一个等待,对吧?

对,因为它里面涉及到一些那个统计接口信息统计一些,那你。

如果说做的话应该是如果提升,那就应该是CPO, CPO 利用率会下来,是吧?巅峰时间,这是做了之类的 Benchmark 吗?

还是 CPU 是长高了呀?因为它那个等待时间早了,然后出一些请求就请求多了耶。

等待时间少,请处理请求多,但是你 QPS 一般也不会太变了。

因为我们服务器资源缩减了,它属于降本增效了,这个属于是。

对,所以我刚才就问你,如果不说的情况下,你的 CPR 数其实会降下来啊。对对对,你这个现在是隔离怎么做的呀?第三点, APP 核心链路和现在只隔离。

这个是我参与的,但并不是我负责的。我可以讲一下,就是我们那个出,就是我们得物里边有一个出价,我们得物 APP 里边的话它是谁价格出得低,那么就谁间谁,就那么谁的那个商品的话就会露出来。嗯,然后这里的话就涉及到两个端,一个是我们。

的卖家,是吧?卖家对。

出的低,对对对,OK,这里涉及到两个端,一个是我们 APP 端,一个是我们的商家端。然后上 APP 端的话主要是我们的个人卖家的话,是不需要去进行一个企业的一个认证的,主要是在 APP 端进行一个出价。还有就是我们商家端商家的话,商家的话主要是我们入驻进行,我们入驻的一些企业,然后他去进行,对,我们他自己上传了一些商品的话去进行一个出价。

还有就是我们 c 端的话,涉及到我们在查询商品的时候需要去比对,就是把我们查询我们那个最低价露出来。还有就是我们涉及到出价接其他一些查询接口,主要的话做线程机构一的背景的话,其实就是我们某一次他那个飞书上面告警,就是我,因为我们之前的话是对我们这个出价的这个流量的话是做了一个预估,然后每如果他突然飙高或者突然下跌的话,都是会监控告警的吗?然后主要是就是我们出主要是这样一个背景,后面的话。

再说一遍,你是先看到流量下降,还是先看到报错?对。

先是那个流量下降了,然后后面的话产生了客诉,客诉有人投诉了,然后后面商后面知道那个商家端和那个出价都用不了。

那基本上就得服务器有问题了。

对,然后后面的话其实是通过那个 APM 我看了一下,然后发现是我们这个 double 线程池它打满了全部走到那个拒绝策略,通过那个 p m 看了一下。

OK,就是说 CPU 已经比例非常高了,然后现在这边占满了,然后现在请求就被拒绝掉了,是。

吧?嗯,对。

然后这是原因什么呢?为什么会突然打满掉?

其实当时的话并没有排查出某些。

线程憨度了,是吗?

不是某些线程憨出了,就是有一些非核心的那个接口,然后他那个 QPS 很高,然后直接就,然后他响应 RT 就比较长。然后他直接就把我们的 double 线程直接给打满了,也就相夯住了。然后他就没有办法去处理我们一些出价的一些接口,嗯,然后他就直接报错了嘛。

主要是这样一个背景,然后,然后后面的话其实就是一开始的话就是只能够去快速进行一个重启来进行一个恢复嘛。嗯,然后后面的话我们其实就是去进行开展了一个小组,然后去进行一个紧急修复。主要的话其实就是我们会去根据我们 APM 上面那个流量调用的一个比例图,然后去梳理一下我们那哪些接口的一些响应 RT 比较高,然后哪些接口的那些流量是比较高的?然后我们还需要去梳理一下我们 APP 端的一个接口是有哪些那个b,然后 b 端的一些接口有哪些?然后主要就是我们会去对它做一个隔线程池的一个隔离吗?因为之前的话它其实就是所有的那个出价链路,所有的一些接口它全都是放在一个线程池里边去运行的,因一开始的话没有做隔离,然后我们做隔离的话啊。

没有继续。

然后我们主要隔离的其实有三方面,一方面的话就是我们对 APP 端和我们商家端进行一个隔离,还有就是对于一些响应 2T 场的一些非核心的一些链路接口,然后我们再做一个隔离。所以的话当时的话其实就是我们采用了通过我们协议 double 那个协议配置的方式,配置了三块,我们的一个线程池 APP 端一块,商家端一块,然后还有就是我们其他的一些非核心的一些接口,然后配的一块,然后都采用的是我们那个 fix 的那个固定长度的固定大小的那个线程池,然后配了。

你这样做完之后,不是也限制了你能够你那个核心的业务核心链路能处理的一个总的请求数吗?因为它每一个线程总占的那么多,或者 CPU 总数那么大。如果说你把它分开之后,不是也是限制了你那个主链路的一个请求数,对吧?

嗯,对,是一开始是这样的,因为它后续的话上线前的话还是会经过压测,其实后面的话,后续的话它其实流量的话都没有去把我们这些,就是它主要是我们一些非核心链路接口它流量比较大才被打满的。

那非核心链路有做一些限流吗?或者说会做一些,比如说现在占用时间太长,就自动摊贸的,或者是自动释放的之类的东西。

有的这个有的。因为我们现在如果。

说我理解你继续说。

这个是一个紧急方案,然后我们后续的话,其实就是我们一开始出价应用它全部是隔离的,全部是放在一起的嘛。然后我们现在的话其实也是在对这个出价去进行一个改造,因为它就是我们需要去整理一些,把我们一些读的接口和我们的写的接口去重新区分两个服务。还有就是我们需要去对我们这个商家端的一个出价和我们 APP 端的一个出价去进行两个应用的一个隔离吗?

我的意思就是说还是最根本的还是要把服务拆开来的。

嗯,对。一开始的话只能够做紧急的一个预防的一个措施,因为他拆服的话是其实是比较时间比较长的,然后。

那比如说发现问题之后,你这个 case 的话,当时第一时间发现报警整个流程,你们整个完整的一个从线上发生报警,然后解决临时方案,临时方案之后开会讨论长期方案,这个完整的能给我快速过一遍吗?就你们怎么做的?或者你怎么。

做的啊?这个是我们,就是我们接已经接入飞书,然后它里边有那个普罗与米修斯,然后它其实都已经接入了,就是一旦出现了一些监控告警的,然后它会自动去将一些这个服务的一些负责人以及一些其他人自动拉一个群,然后我们就,然后它里边就会去告诉我们哪个服务出现了一些问题,然后就这个肯定不是我排查的,这肯定是他们技术专家去排查的嘛?然后后续的话就是这个方案的话,其实是他们技术专家提的,不是我提的,我只能说参与过。然后我了解这些。

就是说你全程基本上就是一个观众,是吧。

对,我主要是负责就是梳理一些,根据我们那个流量去梳理一些接口,这个肯定不可能派给实习生做。

OK,一般正常流程的话,现在发生报警,然后先快速方法先把 bug 解决掉,然后再讨论临时方案嘛。

对,然后再先。

先,然后还做一个。没有做复盘。

吗?做的后续的话其实还不就是总结一些文档,然后分做一些复盘,总结当时的话就是一些立刻出现问题的话,就是保留一下当时的一个现场,然后去快速进止血恢复。

得物。 9 月份 11 到现在大概有五六个月的时间,都是吗?嗯,五六个时间在得物实习。

吗?对。

然后每天是工作多久啊?或者说每周工作多久?

5 天,每天倒 10 万10。

OK。然后你京东零售为什么只有一个月。

因为那是大二的时候,暑期实习差不多是从那个7月半,然后到8月半,然后就结束了,因为要上学了。

我看你还写了很多其他一两个月的项目,这些都是,这个是外包项目吗?还是也是其他什么东西。

这个是自己写的,写。

那比如说那个陈璐出行这个是实习吗?

还是不是下面的项目的话?都是我自己平时写的。

就是一些外包项目吗?

不是外包项目,就是自己学习的一些项目。

那你这个橙露出行它不是已经是一个线上产品吗啊?

不是,不是。

这个也是一个小小项目,是吧?你给它命名为晨露出行。

是吧啊?对对对。

我以为是一个线上的一个产品。OK。

这个是根据以前一家那个倒闭的公司的原型做的,一家杭州的打车。

OK,行,我们来写一个代码,你可以共享你的屏幕。

吗哦?我现在拿手机。

你可以打开你的电脑,然后共享你的屏幕,我们写一道题吧。

对,我电脑现在不在这边。我得。

那你现在没有办法写代码吗?嗯,对,那你看看你什么时候有时间可以写代码?要过多久呢?还是要换一个时间呢?

我的电脑在外面,我也去拿一下,然后开机的。

大概需要多久?

估计得 10 分钟,我要我得上楼去拿。

可以,那你去拿吧。没事,我等你拿好之后再回来吧。好好,那先把这个链接关了,然后待会你重新进来。好,连好了之后,好。

全部评论

相关推荐

点赞 2 评论
分享
牛客网
牛客企业服务