【活动回顾】2022 年 6 月 Online Scala Meetup
第七期 Scala Meetup 于上周六顺利结束,三位 Scala 资深使用者与 1400+ 在线用户分享了三大话题:
- Tubi 内容推荐系统之架构与实践
- 计算的本质——一个野生中年程序员的胡说八道
- 反应式流在大规模场景下的实战
同时,应粉丝提问,大家也对“最喜欢 Scala 3 的特性是什么? ”等备受关注的问题进行了分享与探讨。欢迎你滑至文末下载讲稿,也欢迎你添加微信 yunxixiaoyou,申请加入 Scala 开发交流群!
观众收获
以下内容来自悟空
个人了解 Scala 语言虽有四五年了,前两年可能单纯凭借兴趣了解到 Scala 的,对它的语法表达能力印象深刻,也看过一两本基础的 Scala 语法书籍。但是工作中没有应用场景,也就不了了之。最近两年转型做了大数据相关工作,也有了些应用场景,算是多少又捡起来一些。对于 Scala 来说,我也只能算是一个初级的使用者。
关注了“比图科技”的公众号,也是因为 Scala 的缘故,国内这方面的社区不多,比图应该是因为内部对 Scala 使用的比较重,同时也积极的对外输出与分享了很多 Scala 相关的知识。让我这种小白有个地方可以更好的入门 Scala 相关知识。(此处强烈鼓励你,星标关注“比图科技“)
Online Meetup
通过公众号的推送,留意到了这次周末的 Scala Online Meetup,一共三个主题,感觉干货满满,时间上也比较友好,就订阅参加了。参加之后的感受也是很值得,扩展了领域知识。
一共三个主题,后面两个对我来说基本就是空白的领域知识,作为一个小白,算是增加了些奇怪的知识。第一个更多是架构设计以及工程实现,这块比较贴近个人工作事项,值得借鉴。
这篇文章分享的初衷是,开始入群之后,Tubi 的同学在招纳 Meetup 后的分享心得志愿者,发现分享可以有礼品拿😜,就一冲动报了名,本着稍微负责的态度😂,昨晚又看了一遍录播,所以才最后有了这篇分享的文章。
这里简单分享给大家相关内容,感兴趣的话,推荐点击 Scala Meetup,关注“比图科技”,里面有录播视频,详细了解下。
Tubi 内容推荐系统之架构与实践
这里主要分享了 Tubi 的内容推荐系统相关的架构以及实践,内容很干,我基于 PPT 简单跟大家分享下,对做推荐系统架构选型的同学可以参考下,同时后面也有关于机器学习训练流批模式统一的处理方式,这个我个人认为这块工程量是比较大的,同时也对开发人员能力有不小的要求和挑战。(以下 PPT 均来自于官方分享,大家可以在文末“阅读原文”获取 PPT)
架构大图
这张图描述了整体推荐系统,整体的服务组件,以及一次 client 请求过来,推荐系统背后经过了哪些服务处理。我们看下其中的各个组件以及所负责的事项:
- Client 顾名思义就是客户端,请求过来之后先访问 Tensor 服务,这个Tensor 是 Tubi 的业务网关,负责组装,展示首页
- Tubi 把内容库存储在 Mongodb 中,这里 Tensor 会先查找内容库
- 然后再请求 TUS 服务,TUS 服务是关于用户画像信息
- 这里 Tensor 把必要的信息都拿到之后,会去请求 Ranking Service 推荐系统网关
- Ranking Service 会请求 Popper Engine 实验平台,这个实验平台重点关注,后面会单独介绍
- 得到实验配置,组装推荐流水线,涉及的是需要哪些模型服务以及流程
- 根据得到的实验配置去请求模型服务,进行计算
- 请求在线特征库,拿去对应特征
- 返回模型运算结果,比如特征打分结果
- 后面的流程基本上就是依次返回给各个服务结果,一直到最后用户展示。
推荐服务网关
实验平台
这个实验平台应该是 Tubi 推荐系统中比较依赖的一项服务,我们看到实验平台设计有三个部分,分别为命名空间,实验,实验组。依次是一对多的关系,****命名空间我没有太好的理解,视频里提的是同时会有上百个实验方便区分,根据我的个人理解,这个命名空间更多的是一种分组的概念,将一类实验聚合在一起,不知道理解的是否正确。****实验组,比较好理解,一个实验需要多个对照组,来对比实验效果。
* 主讲人 Junjun 补充解释:命名空间是是为了切分流量,每个空间有 100% 的用户流量, 一个空间内的所有实验共享 100% 流量,总和不能超过 100%。
推荐之流水线 & JSON 动态描述流水线
两张图放在一起讲,一个推荐过程大家简单理解可以是由多阶段 stage 组成,同时各个阶段需要使用不同的策略(召回,填充等),这里 Tubi 开发出基于 JSON 这种描述语言的多阶段流水线,方便算法同学基于 JSON 配置就可以配置出一个实验,这里开发具体的算子交给工程来实现,大大简化了实验的复杂度,是值得推荐的。
这种 DSL 领域语言去描述一个过程,在很多领域都有应用,方便快捷,基于个人风控领域经验,后续可以再进一步,将目前 DSL 语言封装,对外只暴露页面组件,来操作。这样不仅简化了配置复杂度,同时方便管理、历史回溯、审计,抑制这些算子的知识传递成本。
模型服务 & 推断/预估设计
通过第一张图 可以看到 Tubi 的整体推荐系统是基于 aws 云做的解决方案架构,其实也不难理解,因为本身 Tubi 是美国的公司,同时服务群体也不在本土。
抛开这个不谈,大家有兴趣也可以多了解下 aws 云相关服务组件,企业上云大趋势下,一名合格的工程师也要拓展自己的领域边界,我最近也在看 aws sap 相关知识,有问题也可以交流一下。
回到最后几张分享里,个人最感兴趣的是,Tubi 将模型的推断与预估操作,进行抽象开发出一套流批一体的自定义“编程语言”,无论机器学习还是大数据处理,看来大家都在走流批一体路线。
Tubi 的解决方案思路,基于自身业务场景,自定义好上层的统一表达行为,下面基于算子树,在批流不通模式下,采用不同组件来实现。
这么做的好处很明显,一套代码管所有,同时自研可维护性大,也方便基于自身场景灵活定制开发。但是这对底层开发工程师来说,要求自身有一定能力,才能驾驭底层架构,同时依赖的开源版本升级迭代, Tubi 如果想享用最新的升级功能,也需要投入更多人力资源来开发升级。对使用方来说,也需要找到平衡点,因为学习一套内部的“开发语言”,如果不了解底层逻辑,也是比较受困于代码层面的。
所以说,架构上没有唯一一套解决方案,主要还是能适合公司当前业务场景,可以投入人力开发一套流批一体的上层开发语言,确实是一个不小挑战,个人还是很佩服的。
本次 Meetup 一共分享了三个主题,后面两个都是技术大佬分享的干货,奈何后面个人了解的不多,感兴趣的朋友,可以点击 计算的本质 反应式流在大规模场景下的实战 观看视频。
观众收获
以下内容来自 Greyplane
非常有幸能在 6 月 25 日下午参加了本届 Scala Meetup 活动,本次邀请的三位嘉宾为我们分享他们在各自领域内对于 Scala、以及更广泛意义上的解决具体问题的经验及思考。听完后获益良多也有很多感悟,这篇文字既是对活动的内容做一个概要,希望能让没有参加活动的朋友对分享的内容有个大概的了解;也是分享一些自己听完后的感想,借以抛砖引玉。
个人背景:Haskell、函数式编程、类型系统、范畴论爱好者。有幸在日常工作中可以小规模的使用 Scala 和 Akka,大概已经有一年经验了。
## 邓骏骏老师的 Tubi 内容推荐系统
开篇的题目是 Tubi 内容推荐系统架构,骏骏老师从各个层次详细的介绍了整个系统的架构,其中和 Scala 关系最密切的部分是 Tubi 用 Scala 实现了一套类似于 Spark SQL 的 API ,可以简单的方式组合出一套算子的流水线,同时兼顾了易用性和类型安全并且还可以序列化成 JSON 持久化存储。
受限于我自己在机器学习及其工程化方面贫瘠的知识,只能捡分享中自己比较理解的部分说一下,对于完整的架构尤其是算子流水线的细节感兴趣的朋友推荐点击这里 Scala Meetup 观看录像。
而整场听完最大的感悟是在现代的软件工程中,如果从一个完整的系统/功能的层面看,任何语言或者框架都只是一个组成部分。例如在一个完整的推荐系统架构中,机器学习的部分高度依赖 python 及其生态、大数据存储又几乎都是 apache 以及 java 的生态、Spark 计算和中间的流水线调度等等又是 Scala,所以如果作为一个需要从全局、架构层面考虑和做出决策的角色,那么确实不能拘泥于一城一池的得失,需要以一个更开放的心态来看待编程范式、语言、框架、生态之间的争端。
## 高宇翔老师的计算的本质
高老师开篇便引用了一句维特根斯坦的名言,大意为“语言的边界就是思想的边界”,点出了本次分享的题眼——我们描述、理解计算本身的方式决定了我们所能实现的计算。
而后推荐了一本很有趣的书,中文译名叫《 GEB,集异壁之大成》由商务印书馆出版,翻译有原作者参与,质量非常高。其内容横跨文学、计算机科学、数学、艺术等多个领域,并且通过“自我指涉(引用)”或者说递归这一概念将不同篇章串联,让我们看到在一个抽象层次之上,即使是表面南辕北辙的领域也可以有如此紧密、神奇的联系。虽然这本书在不同话题上无法和真正专业的书籍、论文相比,但是作为一本科普读物不仅内容深刻,而且形式工整甚至有一点“元游戏”的感觉,非常推荐。因为这本书我曾在高中时有幸读过,所以看到高老师推荐的时候颇为激动,所以在这里多说两句。
再然后介绍了一些范畴论的基本知识,例如范畴、对象、态射等概念的定义,和它们与计算机语言中的概念的关联。
而我自己作为一个 Haskell 的爱好者,也浅尝辄止的玩过一些 proof assistant ,了解过一点类型论和范畴论的知识。更多的觉得作为程序员来说,了解范畴论的意义在于让你以一个更有趣的视角理解“函数式编程”和类型系统中的各种概念,但是这种理解并不是使用它们的必要前提。
举例来说大名鼎鼎的 lens 就经常被人说是“数学指导编程的典范”,三种不同形式的 lens 实现可以被证明是同构的,要理解这个证明和 lens 的美妙之处还是需要对范畴论有一定的学习的(至少米田引理什么的要能懂)。但是对于大部分人来说实际使用的时候就是一个 mklens 然后当作 Scala 的点操作符,这也是 lens 被人吐槽是 Haskell 没有点而发明出来的解决方案的原因。
而且范畴论是数学,大部分范畴论的工作处理的都是数学中的对象,即便是有 curry-howard-lambek 同构,类型即命题的意义更多的也是在你做定理证明时才有所体现,对于日常编程的指导非常有限,更多的是让你更深刻的理解诸如 ADT 中的 A(algebraic) 到底意味着什么这样的问题。
但是,这种理解或者说发现本身就像是一个 eureka ,让人兴奋而且是一件很美妙的事情。更不用说也许在一些问题上还能给你不同寻常的“灵感”,就如 Paxos 的创造者 leslie lamport 在采访中所言,他的灵感来源于相对论,一个看似完全无关的领域的知识。
最后高老师推荐了 ZIO 这个新兴的 Scala 框架, ZIO 立志成为 Scala FP 界的 Spring,其设计思路和实现确有独到之处,确实推荐大家了解、学习一下。
因为高老师的分享比较的抽象和晦涩,再加上我水平有限,理解时难免有所偏差,望请大家见谅和斧正。
## 何品老师的关于反应式流的分享
何品老师先是介绍了十几种 JVM 上的异步(或者说线程)模型,并比较了其异同。然后介绍了他们在阿里直播的反应式改造时所遇到的挑战,以及在改造初期使用 reactor、rxjava 的踩坑经验还有最终换成 akka streaming 之后所达到的成就( 1500W 客户端同时在线,减少 40% 的机器使用等等)。
整场听下来最重要的想法就是不要用 reactor 和 rxjava,如何品老师在分享中指出的,这两个框架一方面设计的思路存在缺陷(过于注重流操作符的数量和所谓易用性、为了避免维护的复杂度牺牲性能等等),另一方面具体的代码实现也非常糟糕,大量 synchronized 代码带来的性能损失、难以理解的 BUG 等等。如果有这类需求完全可以跳过其他框架直接选择 akka streaming 。
其次就是不论是学习还是做技术决策时,不要被各种“时髦”的名词所误导,譬如当下流行的“协作式并发编程”、“结构化并发编程”,甚至对于所谓“函数式编程”也是,要脚踏实地的考量自己的需求甚至是团队、公司层面的维护成本是否能承受这些技术所带来的复杂度,抛开名词本身这些技术的实质,它们想解决的问题和带来的收益又是否符合真实的需求等等。
最后就是何品老师的谈吐风趣幽默又接地气,分享中除了非常专业的技术意见还有很多犀利的职场洞见,在这里不一而足。强烈推荐大家观看原片反应式流在大规模场景下的实战,感受一下何品老师的魅力。
## 圆桌讨论
在主题分享结束后的圆桌讨论环节,先是骏骏老师分享了自己关于 Scala 语言在工业界使用情况和社区建设方面存在的问题的观点,其中一针见血的指出比起 Java、Python 之类的语言, Scala 本身的发展更多地取决于 EPFL 、甚至是 Martin 本人的意愿而非业界巨头们,这导致它们对其缺乏掌控力,不敢大规模投入使用,进而导致了诸如 Flink、Linkedin 的 Kafka 之类的 Scala 项目在规模扩大之后转向 Java 甚至大规模的用 Java 重写已有的 Scala 代码的情况。
再者针对现场观众提出的对于 Scala 书写风格的疑问,具体说来就是在 Scala 标准库之外的“函数式编程”库例如 cats、cats-effect 是否有必要作为评判代码够不够 Scala 的标准之一。骏骏老师和何品老师都倾向于,按我的理解来说就是,对于现实世界的工程实践来说,具体的编码风格、编程范式等等永远都是让步于工程的需求本身的(团队的平均水平、项目的维护周期和招人成本等等)。
而我个人也认同,尤其是对于 Scala 这样一个特性丰富、可以容纳许多范式的语言来说,能够因地制宜远远比以一种“原教旨主义者”的心态盲目的追求某一种特定范式要重要的多。而何品老师也进一步指出 Akka 项目本身的风格就可以作为一个非常好的参考,适合大部分的团队、项目推广、使用 Scala 时借鉴。
观众收获
以下内容来自王保华
今天非常开心参加了 Tubi 组织的 Scala Meetup。Tubi 组织了很多关于 Scala 的分享,这里也有很多这方面的专家,解决了我很多的疑惑。
我本人是从事自然语言处理相关的程序员,对编程语言、形式化语言也有一些关注。之前在比较短的时间内接触过 Haskell,最近的项目开始使用 Scala,所以也开始关注国内的一些 Scala 讨论区。
第一个分享是来自 Junjun 老师的「 Tubi 内容推荐系统之架构与实践」。作为推荐系统方面的小白,在这个分享中收获颇丰。Junjun 非常详细地介绍了 Tubi 推荐系统的端到端的架构与设计,从推荐系统的整体框架、到实验平台、推荐流水线等部分细节。从浅到深,由简到繁,让我对推荐系统有了更进一步的认识和理解。
第二个分享是来自高宇翔老师的「计算的本质」。在这场分享中,高老师从更高的维度和视角介绍了计算,范畴论和算法的关系。最后介绍了 Scala 和他们的关系,让我对算法和 Scala 有了新的认识。
第三个分享是来自何品老师的关于反应式流的分享。何老师风趣幽默,语言诙谐,虽然本人对这方面的知识完全没有了解,也在这场分享中学到了很多新的知识。
最后非常感谢各位老师的分享,以及 Tubi 对活动的组织。希望这个系列的活动可以办得更好!
Scala 在 Tubi 的应用案例
使用 Scala 和 Akka-Stream 打造一个完全响应式广告服务系统
Scala Meetup 往期回顾
点击投简历,加入 Tubi ,一起 Scala!
点击观看视频回放,一睹三位主讲者的风采!
点击这里,下载讲稿,感谢每一位分享者的贡献 !
本文使用 文章同步助手 同步
热门话题 · · · · · · ( 去话题广场 )
- 有一种旅行叫假装生活在当地 3.3万次浏览
- 发疯有用且很爽 7.7万次浏览
- 发现父母老去的那个瞬间 119.1万次浏览
- 你镜头里的月亮 90.1万次浏览
- 中国古桥梁 14.6万次浏览
- 我用胶片记录生活 354.6万次浏览