Envoy异步HTTP过滤器:lua-resty-ffi与Golang过滤器的比较

Envoy异步HTTP过滤器:lua-resty-ffi与Golang过滤器的比较

💡 原文约2200字/词,阅读约需8分钟。
📝

内容提要

本文比较了Envoy中的lua-resty-ffi和Golang过滤器的性能。虽然两者都支持异步业务逻辑开发,但lua-resty-ffi在内存复制和消息传递上有额外开销,导致性能略逊于Golang过滤器。lua-resty-ffi支持多种编程语言,适合扩展Envoy功能,且实现相对简单。选择哪种过滤器取决于具体需求和技术栈。

🔎

延伸解读

性能差距的根源:内存复制与IPC

文章指出,lua-resty-ffi在Envoy与Golang之间引入了Lua运行时和IPC通信,导致额外的内存复制和消息传递开销。在回显请求体的测试场景中,lua-resty-ffi需要8次内存分配和复制,而Golang过滤器仅需2次。这种开销随请求体大小增加而放大,在10MB大包时延迟差距约20%。

基准测试的局限性

作者强调,该基准测试模拟的是极端情况:将整个请求体在Envoy、Lua和Golang之间来回传递。实际应用中,多数场景只需按需处理部分数据,而非搬运完整body。因此,测试结果仅供参考,不能直接推断所有场景下lua-resty-ffi都慢20%。

选择依据:性能之外的权衡

尽管lua-resty-ffi性能略逊,但它支持多语言(Rust、Java、Python等)、可同时运行于Envoy和Nginx、支持热重载,且开发更简单。Golang过滤器则与C++接口耦合紧密,状态码处理易错,且不支持热重载。选择时需综合技术栈、扩展需求和运维便利性。

❓

Q&A

lua-resty-ffi和Golang过滤器的性能差异是什么?

lua-resty-ffi在内存复制和消息传递上有额外开销,导致性能略逊于Golang过滤器。

选择lua-resty-ffi还是Golang过滤器时应该考虑哪些因素?

选择过滤器时应根据具体需求和技术栈做出决定。

lua-resty-ffi支持哪些编程语言?

lua-resty-ffi支持多种编程语言,包括Rust、Golang、Java、Python和Nodejs。

lua-resty-ffi的实现复杂性如何?

lua-resty-ffi的实现相对简单,而Golang过滤器的实现更复杂,容易出错。

lua-resty-ffi是否支持热重载?

lua-resty-ffi支持热重载,而Golang过滤器则不支持,除非重新编译。

在处理请求时,lua-resty-ffi和Golang过滤器的工作机制有什么不同?

lua-resty-ffi使用协程处理逻辑,而Golang过滤器使用goroutine和回调机制。

🏷️

标签

➡️

继续阅读