09 | 线上服务:如何在线上提供高并发的推荐服务?
09 | 线上服务:如何在线上提供高并发的推荐服务?
讲述:王喆
时长13:39大小12.49M
工业级推荐服务器的功能
高并发推荐服务的整体架构
搭建一个工业级推荐服务器的雏形
小结
课后思考
赞 24
提建议
精选留言(17)
- smjccj2020-10-23源地址哈希,或根据服务器计算能力加权随机分配,当出现大量节点利用率很低时,进行资源回收,减少虚拟机,当大部分节点都出现overload情况,进行扩容,增加虚拟机数量。
作者回复: 非常专业的回答,赞。
共 4 条评论55 - 范闲2020-11-261.如果硬件配置基本一样且部署服务一样,就采用轮询或者随机的负载均衡策略 2.如果硬件配置不同,可以根据硬件的计算能力做加权的负载均衡策略 3.同样也可以利用源地址hash做策略 4.关于扩容和缩容:可以根据系统负载情况做动态调整。
作者回复: 非常好了,基本就是主流的负载均衡策略。推荐其他同学学习。
共 2 条评论32 - 那时刻2020-10-29请问老师,按照一些规则预先缓存好几类新用户的推荐列表,等遇到新用户的时候就直接返回,这算是冷启动策略么?
作者回复: 其实是非常好的冷启动策略,业界也有很多是这样做的。再优化一点,可以利用新用户有限的信息,比如ip,注册信息等做一个简单的聚类,为每个人群聚类产生合适的推荐列表提前缓存。
共 2 条评论22 - Geek_04634b2021-01-12这个课199我都买,太值钱了,现在什么算法都是浮云,关键是落地
作者回复: 有兴趣的话你可以去看看一些价值4999的训练营内容,然后再评估一下到底应该值多少钱。
共 4 条评论12 - 冻糕2021-04-14带我入门的师兄说推荐服务理论上限是100ms延迟,但实际上只会给你最多85ms的时间,超过就要必须优化。其中多路召回加重复过滤上限25ms,排序上限45ms 业务规则加生成json 上限10到15ms,请问老师这个延迟数据是否是业界通用的勒?
作者回复: 你师兄说的基本是业界通用指标。
共 2 条评论11 - shenhuaze2020-10-25王老师,如果推荐服务选择java和jetty,那么如果要上线基于tensorflow或者pytorch训练的深度学习模型,是需要自己用java改写预测的代码吗?还是有什么现成的解决方案?
作者回复: 过几天会谈model serving的几种方式。一般选择请求tensorflow serving,或者embedding上线的方式。到时候我们可以再详细讨论。
共 5 条评论9 - 雪焰🐻🥑2020-10-24王老师好,请问对于:“在一个成熟的工业级推荐系统中,合理的缓存策略甚至能够阻挡掉 90% 以上的推荐请求,大大减小推荐服务器的计算压力”,我理解每个用户的请求,在不同的时间,地点,context下是不一样的,这样千差万别的请求,数量级应该很大,不知道是如何把大部分都缓存起来的呢?谢谢
作者回复: 缓存服务一般都要指定ttl,就是过期时间,ttl要根据缓存的可用大小进行设定。 如果每次请求的变量确实完全不一样,就不用缓存了,因为没有意义。但在实际的应用中总是有优化的空间,比如电商网站,在没有产生新的历史行为的时候你没必要每次请求都产生不同的结果,就可以利用缓存来挡掉重复的请求。
共 4 条评论8 - 张弛 Conor2020-10-23有一个小错误,文中说输入http://localhost:6010/getmovie?movieId=1可以看到 getmovie 接口的返回对象,但在代码里访问提取的参数是id,所以这里应该输入的链接是:http://localhost:6010/getmovie?id=903。供其他小伙伴参考。 第一个问题,如何在各节点之间分配任务?我认为首先要清楚各节点的能力,比如cpu性能、核数,内存,磁盘存储,显存;第二步是要识别这个任务的特点,比如我能想到的有A.任务的紧迫性。这个可以通过维护一系列优先队列来管理。B.任务的并发性。这个任务是否可以分成很多个任务同时去执行,可以分到多细去执行。但不太清楚这个可以如何去很好的识别。C.任务的工作量。即完成这个工作所需耗费的资源,这个可以通过数据量和分解到的子任务去判断;第三步,就是根据任务的特点和工作节点的能力去尽可能好的匹配。 第二个问题,如何知道什么时候应该扩展节点,什么时候应该关闭节点? 这个可以通过观察节点的资源利用率,如果现有运行节点的资源利用率很高,而排队的任务又很多,那么就可以扩展节点,相反,如果节点的资源利用率不高,也没有太多的排队任务,那么就可以适当关闭节点。展开共 1 条评论7
- Geek_8197bf2021-05-14请问老师,工业界推荐算法的实现都是Java和C++吗?Python流行吗?我只会Python,在犹豫要不要做推荐
作者回复: python是离线部分的主流,但线上服务一般会用C++或java实现
共 2 条评论4 - sljoai2020-10-24老师您好,本文中提供的服务降级方案是从业务功能上来说的,降低服务能力,那系统是如何感知到系统压力,同时反馈到实际服务能力的选择上的呢?另外,像Istio、SpringCloud、Dubbo这种服务框架中也包含服务降级的方案,与您文中提到服务降级方案相比较,有什么异同呢?这一块比较疑惑,希望老师能解答一下,谢谢!
作者回复: 现在开源的监控工具,包括成熟的监控SaaS解决方案都很多,比如cAdvisor,datadog等等。总的来说成熟的公司都会建立一套成熟的监控体系,包括服务器的延迟、cpu、内存的占有率等等,一旦发现异常会立即通过预警或警告的方式反馈服务器,然后服务器根据警告作出相应的服务降级操作,或其他操作。 你说的Istio,SpringCloud等是一些微服务的管理和实现框架,更多是从架构层面上考虑,而不是从推荐服务内部逻辑的层面考虑。 二者并不矛盾,可以并存。
4 - 笑笑是个好孩子2021-06-23这里的缓存和把召回到的结果保存到abase之类的k-v存储中 是一样的吗
作者回复: 一般来说服务器各节点内部还有in memory缓存,k-v store一般会去存储公用的模型和数据
3 - MutouMan2021-04-30按能力来平均分配是比较方便的操作,如果想进一步优化,是不是可以根据请求的类别来设计不同核载的节点然后进行分配?比如冷启动相关的推荐就可以专门有一个轻量的节点处理。节点的扩展和关闭可以设计一个阈值来控制吧,总请求数超过时就扩展,反之关闭。
作者回复: 基本的思路没有问题,基本是按照分流、弹性扩展的思路来设计。
1 - Geek68472022-04-28我们有工业级的推荐系统,前端的接入层也可以承接千万级并发,但是资源经常还是出现CPU、内存之类的跑到100%。想问下你们的体量下,如何保障线上推荐系统的稳定性?以及你们怎么把控后台服务的成本的?
- 吃数据的小毛虫2021-09-04王老师,您好。有一个小疑问需要向您请教一下,在本节的MovieService示例代码中, //获得请求中的id参数,转换为movie id String movieId = request.getParameter("id"); 获取的id实际就是movieid,因此将变量命名为了movieid,所以是不是将代码注释中的“转换”一词换为“命名为”更为合适呢?我个人理解“转换”一词暗示着有一个从A到B的过程或者操作,这里其实并没有,本质上id就是movieid,只是叫的名字变了。不知道我的理解对不对,请指正。谢谢~展开
作者回复: 无伤大雅,你自己理解意思就好
- คิดถึง2021-08-24老师好,我想修改项目的访问地址,比如把http://localhost:6010/改为http://localhost:6010/sparrow/,该怎么办呢?
- 行行行2020-10-23老师你好,线上服务如何做到模型实时更新的呢
作者回复: 模型实时更新要用到模型serving的服务,后续会讲解模型服务的内容,我们到时候继续讨论。
- kenan2020-10-23王老师,您好,请教一下,离线推荐和在线推荐的请求方式是什么?还有粗排和精排有那些方案?最好,关于这两方面内容,您有什么资料推荐一下?
作者回复: 不要着急,我们后面继续学习,会有召回层,排序模型的介绍,如果到时还不清楚的话,我们继续讨论。
共 3 条评论