Tubi x Scala:为什么

Scala Meetup 上有一个问题被反复提及“ Tubi 为什么选择使用 Scala?”

Tubi Senior Tech Lead - Alexandros Bantis 在 2019 Scylla Summit 上的分享,将就这一问题带来更深入的介绍。

Tubi 做什么

Tubi 是美国福克斯集团下独立运营、以广告获取收益的流媒体服务公司,为 51,000,000 月度活跃用户免费提供 45,000+ 部优质电影电视节目和 200+ 新闻直播频道。

美国、加拿大、墨西哥、澳大利亚和新西兰等全球用户可通过电视、网页、iOS、Andriod 等 29 种用户端,免费观看 Tubi 提供的定制化视频。

Tubi 与派拉蒙、米高梅、狮门、 Starz、万达影业等超过 400 个 Studio 有长期稳定合作。

机器学习算法帮助识别用户想观看的视频内容并为用户提供相应的推荐,Tubi 只需不到一秒的时间就可以从 4 万部视频内容中为每个用户选择、排序和显示相应的视频内容;而 Tubi 用户无需花很长时间就能找到自己喜欢的内容。

当然,这也意味着,在 Tubi,我们每天需要处理大量数据,并基于足够的数据得出正确的结论。为了利用所有这些数据,我们必须调整技术和解决方案,不仅要服务于数据处理的目的,还要尽可能确保最佳用户体验。

这就是 Tubi 引入 Scala 的地方——支持 Tubi 内部转型。

Tubi 的 Scala 之旅

Tubi 是一家敢于使用 Scala 扩大机器实验的公司。Tubi 后端 Scala 工程师 Alexandros Bantis 于 2019 Scylla Summit 上介绍了 Tubi 从 Node.js 系统到完全分布式的 Scala 引擎的全部历程。

在使用 Scala 之前

Alex 刚开始为 Tubi 工作时,Tubi 的基础架构是这样的:Home Service (渲染 Tubi 主页的服务)使用 Node.js 实现,而分析和实验服务使用 Apache Spark,同样基于 Apache Spark 的机器学习数据管道为 Redis 数据库后端提供数据。

尤其是在运行 A/B 实验时,这一架构就更加复杂了。为了使用 A/B 模型测试一些新想法,机器学习工程师必须编写 Apache Spark 模型,将数据写入 Redis,然后更新 Homepage Service 应用程序中的代码。这项工作必须与后端工程团队合作完成,这会耗费更多时间,有可能造成工程的延误;另外,工程师还必须更新单独的 Node.js 实验引擎上的配置、实施更改并重新启动,实验完成后,这些代码难以复用,新的实验还需要再从头开始。

挑战

在 Tubi ,需要实施或者讨论的 A/B 测试的数量相当多,这种合作方式,特别是在项目时间紧张的情况下,多次来回的时间周期对 A/B 测试的实施十分不利。

“协作问题“只是需要做出改变的原因之一;Tubi 一直在动态增长,该架构已经过时并且不再为 Tubi 提供良好的服务是更主要的原因。

而进行扩展,也确实给 Tubi 带来了一些挑战,比如对技术提出了新的要求:

  • 更低的延迟(消除或者缓解上文提到的“协作问题”)

  • 更好的容错性(包括更好的可观察性、更好的调试工具)

  • 更高的效率(吞吐量)

  • 可靠的速度和性能

  • 更好、更稳定和可维护的代码

  • 清除业务逻辑技术债

  • 更高级的技术支持

  • 更好的测试覆盖率

另一个挑战是要同时确保很棒的用户体验。当 Alex 接手该项目时,向用户提供个性化视频推荐页面所需的时间约为 300 毫秒。在用 Scylla 和 Scala 实施一轮更改后,这一时间被缩短到仅 10 毫秒。

“我的任务是创建一个后端应用程序,将机器学习算法在 Spark 中生成的智能推荐结果整合起来,并呈现在用户面前。” Alex 如是说。

Tubi x Scala:为什么_第1张图片

在使用 Scala 之后

据 Alex 介绍,Tubi 发现 Scala 最有用的领域之一是领域建模。Scala 是一种表达能力很强的语言,它支持许多其他编程语言不支持的结构。这允许 Scala 开发人员在保持简洁的同时更能精确地表达业务规则。

Scala 的编译器会检查这种高级表达能力的正确性。这意味着,当域模型发展或者开发人员引入更改时,编译器会帮助识别可能会由更改引入的不一致。这些问题将在开发的早期被发现,而不是当系统在生产中运行时才发现。这大大降低了为更好地支持业务需求而改进系统所需要付出的成本。

正如 Alex 所说,借助 Scala,Tubi 工程师实现了从“快速行动并打破常规”到“拥有稳定基础架构的同时实现快速行动”的转变。

Tubi 发现 Scala 非常有用的另一个领域是并发编程。众所周知,基于 JVM 构建的应用程序可以充分利用它们所运行的硬件的处理能力;多线程是 JVM 的基础,为开发人员普遍使用;然而并发编程并不容易。从不同线程访问和改变状态时必须非常小心,如果出错可能会导致竞争条件、死锁或简单的性能下降。Scala 富有表现力的高级类型系统在这里再次发挥作用,允许库设计者对这些复杂的操作提供适当的抽象。

Tubi 使用的库之一是 Akka,它将 Erlang 众所周知的 Actor 模型带入 Scala 世界;它将管理多线程代码的负担从程序员身上转移到库本身,将未来问题的数量减少到最低;同时允许应用程序充分利用多核处理器。

最后,Scala 是一种多范式语言,这意味着它同时支持面向对象和函数式编程。Tubi 同时使用这两种语言和 Actor 模型, 在构建系统上十分有效:面向对象提供了模块化,函数式编程用于构建防弹的业务模型和规则,所有这些都与 Akka 一同使用,Akka 提供无缝和简单的并发性。Tubi 利用这样的方式实现了目前这样一个高性能、高度可扩展、易于维护和易于扩展的系统。

原文链接:https://scalac.io/blog/tubi-x-scala-why-it-works/

内容来源:Alexandros Bantis, Tubi Senior Tech Lead

翻译校对:Yingyu Cheng, Tubi Senior Engineer


Tubi 持续招募 Scala 高级工程师,负责构建低延迟服务以服务于机器学习模型,研究用于广告投放节奏和预测的复杂算法,改进 Tubi 部署和运营服务的方式,甚至为开源项目做出贡献。

欢迎加入 Tubi Delphi/Rainmaker Team,一起发挥 Scala 魔力,创建真正好的服务。

欢迎加入 2023/1/14(周六) Scala Meetup,共同讨论、学习和彼此激励。

你可能感兴趣的:(Scala,Tubi技术分享,java,scala,spark,golang,后端)