vlambda博客
学习文章列表

超越Nginx?云原生时代的流量发动机pipy

应用流量管理是数字化时代的重点、要点和难题

2019 年 5 月,F5 公司以 6.7 亿美金对价完成对 Nginx 的收购,成为业界红极一时的话题。熟悉 Web 构建的读者都知道,Nginx 作为一个发展了近 20 年的 Web 服务器,被收购时其核心模块代码长度 198430 行(包括空格、注释),所以一行代码约为 2.2 万 rmb,也因此被网友热评为“一字万金”。由于其高效、轻便、易用的特点,其 Web 服务、反向代理、负载均衡等核心功能广受用户喜爱,是 HTTP 服务端当仁不让的“一哥”,是互联网上最受开发者欢迎的流量管理软件之一。

应用流量管理,这个词对于非技术人员来说可能很陌生。但其实,在互联网已经包罗万象的今天,流量管理无处不在。这一普遍需求,催生了很多流量管理软件。除了 Nginx 外,具有代表性的既有 Apache httpd、Tomcat、undertow、Lighttpd、Microsoft IIS、IBM WebSphere、Oracle Weblogic 等老牌 Web 和应用服务器,也有 OpenResty,Envoy 等专注于流量管理的新力量。随着内网微服务等大型分布式系统的发展,技术栈也从传统的“内容编程”向“流量编程”演化。这些流量管理软件都有自身擅长的领域,在互联网发展、终端形态不断变化的过程中发挥着重要的作用。

时过境迁,互联网的发展,尤其是云计算的高速发展,离不开底层基础设施的改进。在云原生时代,随着以容器和 K8s 为代表的高密度计算技术不断成熟,云原生的特征趋势愈发凸显,形成了计算资源的颗粒度越来越小、计算单元的生命周期越来越短的现状,以及随之而来的内网流量爆炸式增长。云原生应用在此过程中不断迭代,客户对流量管理的需求也已不再是基础的管理分配,而是类似以下全方位的需求特征:

  • 轻量级甚至“羽量级”的 proxy 程序,以满足快速启动、快速调度需求

  • 尽可能低的资源占用 -- 高密度部署会指数级的放大资源占用问题

  • 性能优异(高吞吐、低延迟、高稳定)

  • 良好的扩展性

  • 更加适配多租户的环境

新需求的涌现推动技术创新,流量管理快速的从互联网领域进入云上和企业领域,“内 (网) 外 (网) 结合、(云) 上 (云) 下结合、东西 (向流量) 南北 (向流量) 结合”的流量管理能力成为云时代的新热点。已有的流量管理软件在不同以往的需求面前开始有些力不从心,而后来者的努力正在让以往的产品快速迭代,满足需求的同时,以技术创新推动着社会进步。

1内网流量管理 -- Nginx 的短板

小编还记得当年第一次下载并打开 Nginx 的场景,其不到 5M 的压缩包,以及简便的配置和启用方式,却能高效地解决 Web 领域核心的流量管理需求,这些都给小编留下来深刻的印象。

对于其显著的高效率优势,Nginx 的核心原理并不复杂 -- 采用:多进程 + 异步非阻塞方式(IO 多路复用 epoll/kqueue)处理流量。但这在 Nginx 普及之前并没有被大规模采用,也就是说,在 2003 年这是一个十分典型的创新。

如今,Nginx 依旧是 Web/HTTP 流量管理领域当之无愧的“头牌”。也由于它的存在,市面上大量的流量管理软件可被简单分三类,分别是 Nginx 及 Nginx 衍生品,基于高性能 Java 和 Go 的堆栈(如 Netty),以及近几年刚发展起来的 Envoy。Nginx 拥有良好的生态,其核心价值在于专注处理内外网之间的边界流量,也就是主要处理 HTTP 流量,具有资源占用少,高效、易用、灵活等特点。

然而,企业内网应用流量要复杂得多。企业内部除了 HTTP 流量外,还有大量的非 HTTP 流量,包括各种 RPC 类、中间件类、以及私有协议等,因此需要一个框架以及完整的堆栈来处理相关流量。擅长 HTTP 的 Nginx 此时难于满足新的需求;新的流量管理需求,需要兼顾多协议、灵活度,扩展性和资源占用等更多方面。

Envoy 在看到 Nginx 这方面的不足后,快速发展起来,实际使用者反馈,Envoy 一方面具有较高的认知度,但另一方面其扩展开发难度大、接口复杂、资源占用较高 (基本场景使用时就需占用高达数百兆内存),也为用户带来了困惑。

因此,一个擅长处理企业内网流量、资源占用低、高性能、易扩展的流量管理工具成为当下云原生时代强烈的需求。

近期,我们采访了易衡科技 CEO 蔡书,就其开源的 pipy 流量管理软件进行了深度交流沟通,现结合精彩内容为大家分享 pipy 的设计理念,产品架构以及未来愿景。

2新一代的流量管理工具 -- pipy

2018 年,有用户找到蔡书,提出需要定制企业内网流量管理软件。其中的一个需求很简单,在一个 TCP 报文中用 6 个字节表示长度,6 个字节之后是报文内容。蔡书的团队一开始计划用 Nginx 做基础,扩展开发相应组件解决满足需求。但发现 Nginx 非 HTTP 协议的扩展并不是很成熟,缺乏框架级的能力,灵活度难于满足需求,当客户需要增减报文长度和处理更加结构化的报文时,Nginx 在 4 层面向字节流的编程模式,复杂且代码难于重用。

与此同时,团队也考察了用 Envoy 解决问题的思路,也遇到很大的挑战。“Envoy 提供的编程接口和使用接口都比较复杂,不够直接,易用性难于满足需求,且会带来更高的运维复杂度和成本;同时 Envoy 在资源 (如内存) 管理、长时间高负载下稳定程度也遇到了问题,如突然变大的延迟”。

最后蔡书及其团队调研了市面上典型的同类软件,综合评估易用性、可维护性、资源占用率、性能以及扩展性后,发现处理企业内网流量的场景下,目前还没有工具能很好的满足需求。于是萌发了重新开发流量管理工具的念头;因为这个程序采用了流水线 pipeline 的处理模型,故将其取名为 pipy。

无心插柳柳成荫,创新的背后是对趋势的深刻思考

“从我们自己的角度而言,做这样一个工具首先是基于大量调研,然后,我们开发迭代大概两年之后发现我们自己迭代出来的模型除了灵活外,还有其他的优势,尤其在资源占用和性能方面是领先的。”聊到开发 pipy 的初衷,蔡书认为他们的想法只是萌生于一个简单的瞬间,回头去看,有些无心插柳柳成荫的意味。

但其实,在轻描淡写背后,有着对技术趋势的深刻思考和把握。蔡书认为,在云原生时代,内网流量“编程级的管理能力”需求正变得越来越旺盛,且分布于各种规模的组织中,从互联网到企业,都有需求。这些需求呈现复杂多变的特征,并且很多都是“急活”-- 如用户在短期内需要将具有某些特征的流量做特定的处理。“想要驾驭复杂多变的需求和环境,就需要从长期稳定不变的事物入手,以静制动。过去 20 年,变化最少的就是网络协议,那就从协议入手解决问题”,蔡书说。其核心思路就是协议可扩展、流量可编程。

蔡书团队开发的 pipy 在 4 层字节流和 7 层协议中间抽象出了“对象流”的概念,可以快速的实现各种 7 层协议。事实上,pipy 中借鉴和采用了很多编译领域的思路和处理方法。这种抽象,不仅可以快速做协议层扩展,同时也实现了很高的性能和很低的资源占用。

比如在“对象流”的模型上用 pipy 开发一个基本的 HTTP 静态内容服务器,和 Nginx 做静态内容 Web 服务相比,pipy 在使用更少内存情况下,性能比 Nginx 还要好。除了注重协议层扩展能力外,pipy 还引入了 JavaScript 引擎,使用 JavaScript 语法可以快速定制 7 层的逻辑,比如基于协议某个特定字段做特定逻辑的处理。pipy 的第一个开源版本使用了 QuickJS 作为 JS 引擎;在最近的更新中,pipy 团队进一步开发了“羽量级”的 JS 处理框架 PJS(pipy-javascript),使得 pipy 更快、更小、更易用。

简单、高效、实用,一个极客的极致追求

简单、高效、实用是 pipy 最典型的三个特征。如今,pipy 的诞生已经接近三年,产品形态日趋稳定。从其架构图来看,整个技术栈共分 10 层(包含终端用户产品层),基本设计理念是通过分层将复杂问题抽象出来,化整为零再进行处理。

其中,pipy Proxy 分了三层,#2 层实现字节流处理,而 #3 层是对象流,#4 层是消息流,用来支持 7 层协议。从下至上每一层的扩展性、性能、稳定性都决定了上一层的扩展性、性能、稳定性。

最上面分别是 Operator(#5、#6、#7)和用户接口(#9、#10、#11 号)层,他们共同构成控制平面,控制平面开发以 Go 为主。用户接口和应用接口,统一通过 REST API 交互;这些 REST API 也用于和 DevOps 等工具集成。

3云原生时代的流量管理发动机

“我们认为这个工具很有价值,想让它更快更好地成长并服务于更广泛的群体,于是我们把核心部分剥离出来,做成了一个开源项目”

(https://github.com/flomesh-io/pipy)。

聊到未来的规划时,蔡书兴高采烈的介绍了他们开源的初衷,接着提到即将到来的版本改进,在新版本 pipy 中,我们定义了一些关键性的能力扩展计划。

扩展计划主要涉及安全能力以及分析能力两个板块。安全能力提供了基础的过滤、识别、加解密、加验签等基础功能,用户可以基于此快速实现定制化的安全功能,这部分将很快内测。分析能力包括流量抓取、数据采集功能,通过流量管理引擎抓取数据,将其结构化之后对外输出,用于第三方分析,如大数据、安全自动化等。

优秀的软件来自深思熟虑、精湛技艺和长期的打磨。如今的 pipy 还处于新生儿时期,但其团队的技术能力和长远目标都十分优异,同时还具有很强的洞察趋势,把握趋势的能力,对未来拥有清晰的开发计划,十分值得期待。

聊到未来愿景时,蔡书提到,我工作了 20 年以后开始研发 pipy,我对于 pipy 的目标是希望它最后能做成流量管理的“发动机”,在此之上能生长出繁荣的生态。就好像研发出一个优秀的发动机,有了它可以扩展出轿车、越野车、卡车,甚至可以装在帆船上。最终成为支撑数字时代和云原生时代的坚实的基础软件设施。



点个在看少个 bug 👇