Qmsheng Blog

「你是一个出色的程序员」要比「你是一个开发总监」要有意义的多

ESC连接数暴涨原因分析

以请求的视角窥探 猛犸 网络连接的变化

背景 我负责的某个项目,一到晚上流量大的时间段,客户反映超时严重上涨 问题排查: 1.进入其中一个项目节点,查看代码是否有报错 2.去阿里云后台查看 CPU/内存 是否满了 3.查看阿里云其他指标维度是否异常 问题确认: 对比阿里云后台查看,超时的时间段ECS连接数暴涨 问题解决思路: 1.代码层面: a.首先想到的是,是不是nginx长链接设置的有问题 b.排查上下游...

Kong 插件加载机制源码解析

以请求的视角窥探 Kong 的数据走向

前言 我曾经在前面的文章中系统性的描述了下 Kong 的插件加载机制,这篇我将通过源码解析的方式呈现其数据走向。剔除掉第三方依赖,Kong 的核心代码结构如下: kong/ ├── api/ ├── cluster_events/ ├── cmd/ ├── core/ ├── dao/ ├── plugins/ ├── templates/ ├── tools/ ├── vendor/ ...

Kong 插件加载机制概述

以请求的视角回顾自己的一生

概述 插件可以认为是 Kong 管理 API 的核心,其模块化和可扩张性做得很好,尤其是其灵活的加载机制使得 Kong 能够针对不同 API 启用、组合任意插件。Kong 默认自带的插件集,按照功能的不同大致可以分为六大类:Authentication 认证、Security 安全、Traffic Control 流量控制、Analytics & Monitoring 分析监控、T...

浅谈 KONG key-auth 插件 token 的生成

CSPRNG or 真随机?

最近我在 KONG 的 Blog 上看了一篇文章:That’s So Random: (Pseudo)Random Data Generation in Kong API Gateway,文章中介绍了 KONG 是怎么处理随机数问题的,读后受益良多,在此做一个分享。 seed 的生成 在 OpenResty 中如果使用 ngx.now() 设置种子的话,将会导致各个 worker 的种子...

谈谈 KONG rate-limiting 插件中的缺陷

Redis 高频卡控中的 Race Conditions 问题

知名 API 网关 KONG 有个 rate-limiting 的插件,可以利用它来实现限流的需求。例如:根据特定时间窗口来限制 API 的调用次数。其关键代码是这么实现的: red:init_pipeline() for i = 1, idx do red:incrby(keys[i], value) if expirations[i] then red:expire(k...

pairs 的遍历顺序

其实本质上还是按照顺序遍历的

在 Lua 中,我们经常使用 pairs 来遍历一个 “hashmap”,但是你有没有想过,pairs 遍历的顺序到底依据的是啥? 为了搞清楚这个问题,这里先来做个测试: 注:以下测试结果均基于 Lua 5.1.4 case 1 local st = { lguafYWz = "1 ", BNwGryzZ = "2 ", FuKaDkdd = "3 "...

Lua string hash 算法

JSHash

我在前一篇文章介绍过下面这 3 个字符串拥有相同的 hash,会导致 Hash Dos 问题: "0000000000000000000000000000000000" "f0l0l0w0m0e0n0t0w0i0t0t0e0r0?0:0)0" "x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0" 但是 Lua 并没有将自己的 string hash 算法暴露出来,那...

Lua string 哈希碰撞

Hash Collisions

Lua 中 40 字节以下的字符串会被内部化到一张表中(Lua 5.3),这张表挂在 global state 结构下。对于短字符串,相同的串在同一虚拟机上只会存在一份,这被称为字符串的内部化。 其实字符串在 Lua VM 中是以两种内部形式保存的:短字符串及长字符串。其界限默认设置为40(字节) 对于比较长的字符串(32字节以上),为了加快哈希过程,计算字符串哈希值是跳跃进行的...

NGINX resolver 配置中的 "坑"

不要着急去当第一个吃螃蟹的人

最近我把自己的 OpenResty 升级到了最新的 openresty/1.13.6.1 版本,却发现 dns 解析不能正常工作了: ... resolver 127.0.0.1; server { listen 8888; server_name _; location / { content_by_lua_block { ...

TIME_WAIT 的 Timer

我们知道 TCP 在关闭连接的时候,主动断开的一方将处于 TIME_WAIT 状态,并将持续两倍的 MSL。这个 MSL 在 RFC 793 中的建议是 1 分钟,但是很多系统实现都是 30 秒,所以 TIME_WAIT 的时长也就是 1 分钟。 而且这个数值是硬编码在内核中的,也就是说除非你重新编译内核,否则没法修改它。我们可以通过 ss 来查看 TIME_WAIT 的剩余存活时长(...