最近看了几篇关于网关和PD分离的论文,分享下个人想法

11 月 10 日
阅读 2 分钟
279
PD分离的效果很大程度上受限于kvcache的传输的代价(kvcache是以GB为单位的,跑RDMA也需要100毫秒级的时间)。而kvcache主要是P产生的。

在 OpenResty 里实现异步的流式代理

10 月 27 日
阅读 3 分钟
389
七层代理经常会有需要承接流式业务的需求,比如通过 SSE 来代理推理服务返回的结果。有些时候,我们还需要在流式处理过程中进行异步操作,比如访问其他服务来丰富原来的输入输出。

浅谈 istio 配置下发(下篇,istio 处理来自 k8s 的配置)

10 月 27 日
阅读 7 分钟
174
istio 不仅支持从 k8s 中获取配置,还支持通过 MCP over XDS 从实现了 MCP 协议的服务器中获取配置,抑或从文件中直接获取数据。在实践中,没听说过有哪些项目通过文件的方式来提供 istio 配置,所以这里不谈。MCP 实际上就只是把 istio 资源装进 MCP 这个箱子里,然后通过全量 XDS 协议下发配置给 istio。Higress 应该...

浅谈 istio 配置下发(上篇,istio 和 Envoy 交互部分)

9 月 7 日
阅读 4 分钟
1.1k
在定下本文的标题之前,我推敲了几遍。最终决定以“浅谈”开头,是因为本文将专注于 istio 下发配置给 Envoy 的功能,尤其是关注 Ingress 场景的配置下发(NodeType 为 Router),不祈求涉及 ztunnel、grpc 等边边角角。

pingora 能做什么和不能做什么

8 月 31 日
阅读 4 分钟
1.8k
最近把 pingora 的代码略略过了下,稍微弄懂了 pingora 这个项目的大致情况。Pingora 作为 Cloudflare 内部开发来替代 OpenResty 的项目,可以看到不少 Nginx 的影子。比如 Pingora 的插件叫 Module,对应插件顺序叫 module_index,和 Nginx 一模一样。有趣的是还有彩蛋藏在测试代码里:

真实世界里的 go work 体验

8 月 17 日
阅读 2 分钟
1.5k
早在 1.18 版本,Go 就引入了 workspace 功能来改善多 module 开发的体验。网上关于 workspace 功能的介绍大多局限于玩具项目内的开发,并无多少实际的案例。正巧 mosn/htnn 这个项目就深度依赖 workspace 功能,而且它也足够复杂,可以拿来说明真实世界里面的 go work 体验。

在 Envoy 中规避 LDS drain 的奇技淫巧

7 月 7 日
阅读 5 分钟
501
本文是“Envoy 哪里做得不够好”系列的第三篇。前文提要:为何 Envoy 会经常全量推送路由变更,以及如何改善(上)为何 Envoy 会经常全量推送路由变更,以及如何改善(下)Envoy 支持通过 Listener 资源动态调整监听配置和设置四层策略。但和直觉不同,对 Listener 资源的修改并非无损的。对 Listener 的修改都会触发 LDS ...

为什么选择 HTNN 这款网络产品?

6 月 18 日
阅读 2 分钟
1.2k
推广一个开源项目其实就是推广一种理念。几年前 APISIX 在推广时,主打的是更好的性能。HTNN 主打的也是“快”,但不仅仅是数据面执行性能之快,更主要的是研发效率之快。无论是什么时候,又快又好地推出新功能都是研发人员的刚需。HTNN 的各项功能,都围绕着提升开发效率来设计。

为何 Envoy 会经常全量推送路由变更,以及如何改善(下)

6 月 16 日
阅读 4 分钟
646
上篇文章的结尾,我提到了 “Envoy 社区并非对此毫无察觉。针对这个问题,不少解法被提了出来”。其中一个解法是 VHDS(Virtual Host Discovery Service)。

为何 Envoy 会经常全量推送路由变更,以及如何改善(上)

5 月 26 日
阅读 12 分钟
1.1k
之前和读者聊到,“现在envoy用来做七层网关,要想达到好用,就差几个关键技术点没解决”:[链接]。于是我决定开一个系列,不定期更新,写写 Envoy 目前还做得不够好的地方。

预测未来一两年内七层代理的发展趋势

5 月 4 日
阅读 3 分钟
1.3k
预测未来最安全的做法是不要给预言加个限期。只要不停鼓吹“会有一个光明的明天”,“明日复明日,明日何其多”,到底哪一天才是光明的明天,那就要等那一天到来之际的事后诸葛亮了。所谓说,“不走的钟一天也会准两次”,为了表明我不是撞大运的不走钟,我决定给这篇文章中的预言加个限期 - 就聊未来一两年内的趋势。

狸猫换太子:聊聊那些藏在 Go interface 方法调用里的坑

4 月 14 日
阅读 5 分钟
834
对 interface 的使用想必是一件简单到自然的事。定义一组方法描述特定的行为,然后在某个类上实现这组方法。如此一来,这个类就能作为某些函数的输入或输出参数,而外界无从知晓用作参数的实际的类到底是怎么实现的。interface 带来的“隐藏性”,可以让它的使用者和实现者之间解耦,无需暴露不必要的细节。但是在某些特殊...

为什么 Tetrate 逐渐成为 Envoy Gateway 的主心骨?

2 月 6 日
阅读 4 分钟
826
Envoy Gateway 的发起 是 2022 年网络领域的一件大事。扛着 Envoy 这面大旗,Envoy Gateway 奉天子以令不臣,任何基于 Envoy 的网关都不得不回答一个问题:“你和 Envoy Gateway 是什么关系”。比如:

你的Go应用真的用了正确的 CPU 核数吗?

2023-06-24
阅读 2 分钟
4k
Go 的调度模型是 GMP,其中 G 是 goroutine,M 是线程,P 是可用的 CPU 核数。多个 G 会共用一个 M。M 作为操作系统层面上的调度单位,在执行时需要绑定到 P。如果操作系统认为的某个 Go 进程可用的 CPU 数,和该进程认为的可用的 CPU 数不一致,那么即使把 M 绑定到某个 P 上,操作系统也不一定会执行这个线程。所以能...

ebpf 月报 - 2023 年 2 月

2023-02-27
阅读 6 分钟
2.4k
本刊物旨在为中文用户提供及时、深入、有态度的 ebpf 资讯。如果你吃了鸡蛋觉得好吃,还想认识下蛋的母鸡,欢迎关注:笔者的 twitter:[链接]bpftrace 发布 0.17.0 版本[链接]时隔数月,bpftrace 发布了新版本 0.17.0。这个版本,允许直接比较整数数组,还新增了对以下几个架构的支持:龙芯:[链接]ARM32:[链接]此外,...

漫谈负载均衡算法

2023-02-12
阅读 5 分钟
2.5k
负载均衡是个大话题,我们可以谈谈:slow start 给新加入的节点分配较低权重,避免过载priority 不同的可用区(AZ)有不同的优先级,非当前可用区的节点只有在当前可用区节点不可用时才作为备份加入subset 分组负载均衡,会先通过负载均衡算法选择一个组,再通过负载均衡算法在组里选择具体的节点retry 当负载均衡碰上重...

化虹为桥 - Nginx 如何代理 UDP “连接”

2023-01-29
阅读 7 分钟
5.4k
众所周知,UDP 并不像 TCP 那样是基于连接的。但有些时候,我们需要往一个固定的地址发送多个 UDP 来完成一个 UDP 请求。为了保证服务端能够知道这几个 UDP 包构成同一个会话,我们需要在发送 UDP 包时绑定某个端口,这样当网络栈通过五元组(协议、客户端IP、客户端端口、服务端IP、服务端端口)进行区分时,那几个 UDP...

ebpf 月报 - 2023 年 1 月

2023-01-26
阅读 3 分钟
4.6k
Merbridge 是一个旨在通过 ebpf 代替 iptables,给 service mesh 加速的项目。作为成立刚满一周年的新项目,Merbridge 已经应用到 kuma 的官方版本当中。最近 Merbridge 又达到了另外一个里程碑 —— Merbridge 正式成为 CNCF sandbox 项目。

如何开发一个开源网关?

2022-12-10
阅读 3 分钟
4k
编写本文并非打算总结开发开源网关的最佳实践,仅仅是谈谈自己的一些观点。基石如果有人问我,开发开源网关最重要的是什么,我会毫不犹豫地提到两点:要有一套一致的设计语言。要有持续的人力投入设计语言由于现在开源项目内卷化,要想推出一个新的开源网关,已经必须要有整套的控制面(CP) + Dashboard + 数据面(DP)...

把 Go 放到 Nginx C module 之中

2022-11-27
阅读 3 分钟
4.6k
最近一段时间,我在做一件有趣的事情,让一个 Nginx C module 通过 Go 代码来访问 gRPC 服务。不得不感慨 Go 真的很流行,让人无法拒绝。之前我做 wasm-nginx-module 时就试图把 tinygo 跑在 Nginx 里面,这次则是把正宗的 Go 跑在 Nginx 里面。这就是无法回避的命运吗?!

CVE-2020-11724:OpenResty HTTP request smuggling 漏洞

2020-07-25
阅读 4 分钟
18.3k
OpenResty 最近发布的正式版本 1.17.8.2 修复了安全漏洞 CVE-2020-11724。这个漏洞是一个 HTTP request smuggling 漏洞,可以实现某种程度上的安全防护绕过。

为何 filebeat 采集日志不是实时的?

2020-03-20
阅读 4 分钟
8.2k
filebeat 采集的日志的时间戳,和日志管理平台实际收到的日志时的时间戳,通常都会有几秒的延迟,有些情况下甚至能达到十几秒。其中固然有 filebeat 到日志管理平台之间的网络带来的影响,但最大的延迟还是出现在日志的产生到 filebeat 上报这个时间段。为何 filebeat 采集日志不是实时的?

丢失的$remote_port

2020-01-29
阅读 2 分钟
6.7k
最近做日志采集的时候发现,部分 Nginx access log 里面的 $remote_port 字段为空。$remote_port 字段提供的是客户端发起连接时使用的端口地址。理论上,如果请求是通过 unix socket 来的,没有端口自然不足为奇。不过我们的请求都是走 TCP 过来的,没有端口便是一件奇事。

Go: Commit失败后是否需要Rollback

2020-01-27
阅读 3 分钟
10.4k
如果 tx.Commit() 失败了,那么 Rollback 的 mock assertion 不会被触发。但跟踪代码时我看到 tx.Rollback() 路径确实会被执行到的。

用docker拓展压测工具artillery的能力

2020-01-07
阅读 2 分钟
2.9k
最近在用 artillery 做压测时遇到一个问题。我需要压测某一个通过域名访问的服务,而这个域名背后的机器地址需要随着压测用例变化的。通常这就是DNS要做的事情 - 把不变的域名和变化的地址关联起来 - 但我又没权限控制这个域名的解析地址。

谈谈go.sum

2019-12-27
阅读 4 分钟
10.6k
众所周知,Go 在做依赖管理时会创建两个文件,go.mod 和 go.sum。相比于 go.mod,关于 go.sum 的资料明显少得多。自然,go.mod 的重要性不言而喻,这个文件几乎提供了依赖版本的全部信息。而 go.sum 看上去就是 go module 构建出来的天书,而不是什么人类可读的数据。

systemtap 探秘(五)- 编译和运行

2019-10-06
阅读 3 分钟
4.4k
编译阶段没有什么要说的,唯一要说明的是 stap 生成的内核模块编译起来很耗时。一般来说,整个编译阶段会花上十几二十秒。所以在生成火焰图时,我通常会让 stap 空跑一遍,让它把内核模块编译出来,完成编译阶段后 Ctrl+C 中断掉它。等到正式压测时,再跑一遍。第二次跑的时候,由于可以用上第一次编译出来的内核,花在...

systemtap 探秘(四)- 函数调用

2019-09-22
阅读 5 分钟
4.1k
上一篇文章,我们介绍了 stp 的类型、变量等基本构成元素。本文将讲解 stp 如何把某些语句编译成对应的 C 代码。stp 在编译 if / for 这样的控制语句时,基本上就是原样翻译成 C 代码(除了一点:break 和 continue 语句是用 goto 实现的)。因此这里只着重谈谈 stp 函数调用是如何被编译成 C 代码的。

systemtap 探秘(三)- 类型、变量和数组

2019-09-13
阅读 6 分钟
8.3k
上一篇文章,我们展示了几个常见的 probe 生成的 C 代码是怎么样的。本文则讨论 stp 的几种类型,两种变量,以及关联数组。 基本类型 stp 有三种基本类型: long string stats long 类型虽然叫做 long,但其实是 int64_t 的别名。所以即使在 32 位系统上,它还是 64 位整数。 string 类型的变量会被编译成 string_t。而 ...

在 OpenResty 里实现进程间通讯

2019-08-03
阅读 4 分钟
12.3k
一种简单粗暴但却被普遍使用的方案,就是每个进程划分属于自己的 list 类型的 shdict key,每隔一段时间查看是否有新消息。这种方式优点在于实现简单,缺点在于难以保证实时性。当然对于绝大多数需要进程间通讯的场景,每 0.1 起一个 timer 来处理新增消息已经足够了。毕竟 0.1 秒的延迟不算长,每秒起 10 个 timer 开销...