秒杀系统高并发优化实战(C++ / Drogon):3.11 X-Forwarded-For 取首段的陷阱:一次真实的注册频控绕过
3.10 那篇(注册安全加固:同 IP 注册频控 + 反代真实客户端 IP 解析)里,我为了拿到反代后的客户端 IP,写了一段"取 X-Forwarded-For 首段"的代码,并留下一句结论:最左首段才是最原始客户端。 这篇是勘误。 那句话不是"不够严谨",是错的——而且错得挺危险:它等于把同 IP 注册频控的 key,直接交给了调用方决定。攻击者不需要任何工具,一行请求头就能让频控失效。 更值得记的是,我当初为什么会这么写——不是没查,而是查错了地方。 配套代码:src/controllers/UserController.cc 的 clientIp()(改用 drogon::plugin::RealIpResolver::GetRealAddr)、config.json 的 plugins 段(trust_ips / from_header)、src/service/RegisterGuard.{h,cc}(被绕过的同 IP 频控);验证脚本 scripts/verify-311-real-ip.sh(...
秒杀系统高并发优化实战(C++ / Drogon):收官篇 · 6-8 章规划与预计实现(MQ 削峰 / Lua 预扣 / 防刷限流)
系列写到第五章「读性能优化」时,项目在 v0.2.0 收官了:代码定格在「直打数据库 + Redis 读缓存」这一档,第六至八章(MQ 削峰 / Lua 原子预扣 / 防刷限流)不再落地实现。 但设计不该烂尾。这一篇把剩下三章一次性讲完——不贴落地代码,只讲"如果继续做,会怎么做、为什么这么做、预计能拿到什么、会踩哪些坑"。 本篇性质说明:本篇没有配套落地代码(仓库止于 v0.2.0,见 docs/PLAN.md ADR-10)。文中所有架构、接口、Key 均沿用前五章既有约定,属预计方案;出现的 QPS 数字均为预期目标,不是实测值。判断依据只有一条:它们能不能把已经证明过的方法论继续用下去。 一、先交代:为什么停在第五章 理由 说明 验收指标的性质变了 项目的核心命题是"QPS 跃迁来自架构决策,而不是换框架或堆中间件"。前五章已经把这件事证明完整:440 QPS → 万级,全部来自读缓存这一层架构改动 取舍密度会被稀释 前五章每章都有真实两难(超卖怎么防、Redis 同步客户端为什么不能用、缓存失...
写前日志 WAL:先记账、后落库
00:00:03.412 你点了"支付",页面弹出"付款成功"。 00:00:03.415 三毫秒后,这台数据库服务器的电源被拔了。 重启之后,这笔钱还在不在? 如果答案是"看运气",那你的系统大概率还没读懂一条被用了四十多年的原则——写前日志(Write-Ahead Logging,WAL)。它解释了一堆看起来互相矛盾的现象:为什么 MySQL 敢承诺"事务已提交就绝不回退",而 Redis 回了 OK 却仍可能丢数据?为什么 SQLite 一开 WAL 模式,目录里就冒出 -wal、-shm 两个文件?为什么 PostgreSQL 的备份要归档一个叫 pg_wal/ 的目录?为什么 Kafka 干脆把"日志"当成了唯一的数据结构? 先看三个真实存在的东西:MySQL 的 ib_logfile0、PostgreSQL 的 pg_wal/、etcd 的 member/wal/。它们是三个不同系统的命根子,却长着同一副骨架。 一、它从哪来WAL 不是谁灵光一现的设计,它是从扇区的物理...
最小权限原则:安全的第一道闸
三个一眼就该报警的现象: 容器默认以 root 跑,挂载着宿主机目录,还带着 CAP_SYS_ADMIN; 一个"只负责查订单"的服务,它的数据库账号有 ALL PRIVILEGES ON *.*; 运维的 sudoers 里写着 ops ALL=(ALL) ALL——看起来是配置了权限系统,实际上等于没有。 它们背后是安全领域里少数"不用花钱、不用加机器、不用改架构"就能大幅降低损失的原则:最小权限(Principle of Least Privilege)。它最值钱的地方在于——它防的不只是攻击者,更是任何单一环节的错误。 一、它从哪来1975 年,Jerome Saltzer 与 Michael Schroeder 在 Proceedings of the IEEE 上发表 《The Protection of Information in Computer Systems》——安全工程史上被引用最多的论文之一。论文提出了 8 条保护机制设计原则,第四条就是 Least privilege,大意是: 每个程序和每个用户,都应当使...
康威定律:架构复制沟通结构
面试里有个问题特别刁:"你们的微服务是按什么切的?" 答"按业务能力"的人很多,但追问一句就露馅了——为什么订单服务刚好是这五个人在维护?为什么"用户中心"和"账户中心"是两个人分别负责,而不是一个人管全? 再看两个更具体的现象:两个团队共用一个数据库,加一个字段要等两周;一个模块三个人都在改,谁都不敢重构,因为它没有主人。 这些都不是技术问题。它们是同一条规律在组织层面的投影——康威定律。它最扎人的地方在于:你设计的架构,其实早就被你和同事的沟通方式决定了。 一、它从哪来1967 年,Melvin Conway 写下一篇短文 《How Do Committees Invent?》,1968 年 4 月发表在 Datamation 杂志上。核心结论只有一句(原文): Organizations which design systems … are constrained to produce designs which are copies of the communication structur...
最少惊讶原则:接口设计的隐形标准
来几个不用查文档就能"猜错"的问题: [1, 10, 2].sort() 的结果是什么?(不是 [1, 2, 10]) Python 里 data.sort() 返回什么?(不是排好序的列表,是 None) git checkout 到底干什么?(切分支、丢改动、取文件、建分支——四件事) 一个接口返回 HTTP/1.1 200 OK,body 里写着 {"code": 500},算什么?(算事故) 这些行为都不是 bug,每一个都能找到理由。但它们都要让使用者停下手里的事,去记住一条"反直觉的规则"。这就是最少惊讶原则(Principle of Least Astonishment, POLA)要说的事——它管的不是功能对不对,而是接口是否可信。 一、它从哪来POLA 没有唯一的提出者,它是从人机交互(HCI)到编程语言、API 设计里慢慢固化成共识的一条准则。它的措辞很朴素:系统的行为,应该与使用者基于既有经验所形成的预期一致。 在工程界留下脚印的几个节点: 人机交互传统的系统论述:界面设计...
背压:慢消费者的保护机制
线上有个很常见的死法:上游一慢,下游先崩。 下游没做错什么,它只是老老实实收下所有请求,放进队列,然后慢慢处理。结果队列越来越长,内存越来越满,延迟越来越高,最后 OutOfMemoryError 或者一次超时雪崩——监控图上,崩溃前那段"吞吐还挺好看"的时间,往往就是队列在替它挨打。 再对比两个现象:Kafka 的消费者处理不过来时,Broker 一点事没有,只是 lag 在涨;而写一个死循环 send() 的客户端,对着一个不读的服务端狂发数据,它自己会被卡住,对端安然无恙。 它们背后是同一件事:背压(back pressure)——把下游的"我接不动了"传回上游。 一、它从哪来"背压"这个词是从流体力学借来的:管道下游堵住,压力会反推到上游。计算机里最早的工业级实现不是某个框架,而是网络协议本身: 1981 年,RFC 793(TCP) 就用滑动窗口做了流量控制:接收方通过 rwnd(receive window)告诉发送方"我还能收多少",窗口归零时发送方必须停下等。这是背压最朴素也最可靠的...
在 Windows 上打出 arm64 的 deb 包:从 WSL 交叉编译到板子上一行 dpkg -i
手里是一台 Windows 开发机,目标是一块 RK3588(aarch64)板子。最省事的想法是"把源码 scp 过去,在板子上 make",可板子四颗 A76 主频 1.7 GHz,编译一遍要十几分钟,交叉编译依赖还常常装不上;想打 deb 又总觉得"这是 Debian 的东西,得在 Debian 上做"。 其实打 deb 包根本不需要目标机器在场——.deb 的本质是一个 ar 归档,里面塞了三个文件:debian-binary(写死 2.0)、control.tar(元数据)、data.tar(要装进根文件系统的文件)。它是个打包格式,不是编译产物。 只要你能产出 aarch64 的二进制、能跑 dpkg-deb,在哪台机器上打都行——Windows 上装个 WSL 就齐活了。 这一篇全程在 WSL Ubuntu 22.04(x86_64)上实操,产出 cfgd_1.0.0_arm64.deb,用 qemu 在打包机上直接把包里的 arm64 二进制跑起来验证,最后给出板子上的安装与回滚命令。所有命令输出都是本机真跑出来的,不是抄的...
CAP 定理:分布式的取舍三角
面试官抛出一个经典问题:设计一个跨机房的订单系统,一致性和可用性你选哪个?你答"我都要"。对方笑而不语。 再问:为什么 ZooKeeper 一选主,整个集群就拒绝写入,而 Eureka 明明发现一半节点失联了,还照样对外返回服务列表?为什么 Redis Cluster 默认一个槽位不可用就整集群报 CLUSTERDOWN?为什么 MySQL 主从复制可以在超时后"降级"成异步? 这四个问题背后是同一个东西——CAP 定理。它大概是分布式领域被引用最多、也被误读最多的一条原则。这一篇把它从猜想讲到定理,再讲到十二年后作者本人的纠偏,最后落到真实的选型现场。 一、它从哪来CAP 不是一开始就叫"定理",它最初是个猜想。 2000 年 7 月,UC Berkeley 的 Eric Brewer 在 ACM 的 PODC 会议(Principles of Distributed Computing)上做主题演讲,提出一个判断:一个分布式系统无法同时满足**一致性(Consistency)、可用性(Availability)、分...
AI 新闻速递(周更精选 2026-09-11)
本周精选摘要:OpenAI 宣布智能体组合用约 88 小时给出纳维-斯托克斯千禧年难题的解答,随后 NYU 数学家 Buckmaster 与 Anthropic 数学家 Alpöge 公开指控"信息泄露 + 算力追赶",陶哲轩、Altman、Bubeck 先后下场,一场"证明竞赛"把开放科学的信任问题推到台前;DeepSeek 发布 V4.1-Flash,用 CED 架构 + FP4 KV 缓存把长上下文 Agent 的显存账单一刀砍到上一代的四分之一,MIT 开源并同步降价,V4-Pro 将于 9 月 14 日起让位;Anthropic 发布威胁情报报告,称近 2 亿次交互被归为五起针对 Claude 的蒸馏行动;英伟达以约 129.3 亿美元收购 Hugging Face 的消息本周持续发酵,开源生态的"入口"换了主人;OpenAI 一天内放出 Agents API 公测、全双工语音 GPT-Live-1、ChatGPT Work 的 Data agent 三件套;苹果发布首款折叠屏 iPhone Duo 与 A2...
空间换时间:哈希、缓存与索引的共同母题
面试官问:一张十万行的表,怎么让某条查询从秒级变毫秒级?你答"加索引"。再问:Python 里为什么 dict 查一个键比 list 从头扫快那么多?你答"哈希"。又问:为什么同样的热数据,要再往 Redis 里放一份?你答"缓存"。 三个答案听着是三个领域,骨子里却是同一句话——多花一点空间,少花一点时间。哈希表、数据库索引、缓存层、动态规划的记忆化……它们都是同一个母题的不同分身。这一篇就把这条"无处不在却总被当成本能"的原则拆开看。 一、它从哪来"空间换时间"(space–time tradeoff)不是某个人在某一年提出的单一理论,而是计算这门手艺里最古老的经验之一,线索能拉得很长: 查表法:在没有计算机的年代,水手算航海位置要靠对数表——把对数预先算好印成册子,用时翻书而不是现场算。这是最朴素的空间换时间:一本书的纸张空间,换掉每次航行里的重复计算。 哈希表:1953 年,IBM 的 Hans Peter Luhn 在内部备忘录里提出用"散列"把键映...
长街书场的醒木翁
一、万回大书,越说越慢临河城的长街书场,是方圆三百里最有名的场子。场子不大,台上只有一桌、一椅、一方醒木,可台下坐过的人,从赶考的秀才到拉船的老纤,没有一个不是红着眼眶出去、隔天又红着眼眶进来的。 这一年,对街新开了一家"过耳楼",请来一位年轻的先生。那先生生得白净,据说有过目不忘的本事——三万回的大书,他听人念一遍,就能一字不差地背下来。过耳楼开张头一个月,天天爆满,长街书场这边,座位却空了大半。 东家坐不住了,请来场里最老的说书翁,商量对策。老翁正拿抹布擦他那方乌木醒木,头也不抬:"他想打擂?" "擂,就在月底。两边各接一部新书,书是同一个书坊出的'活卷子'——头三百回先印好,往后每天天亮才送来一回,谁也不能提前看。规矩只有一条:讲到第几回,就得跟前面所有回目环环相扣,埋下的扣子不许落空。三个月为期,场场打赏记账,输的关门。" 老翁把醒木搁回桌上,忽然笑了:"我接了。" 月底开擂,台下座无虚席。头一个月,年轻先生风光无限。他讲书有个好处:因为把前面三百回全背在肚子里,任何一处旧人旧...
AI 新闻速递(2026-09-09)
今日摘要:OpenAI 宣布由一组智能体基于下一代模型给出 Navier-Stokes 千禧年大奖难题的解答——约 88 小时求解、17 小时 Lean 形式化验证、490 万条消息、约 3000 亿输出 token,旋即在数学界引爆"证明竞赛"争议,NYU 数学家与 Anthropic 研究员指控信息泄露与不正当竞争,Sam Altman 与 Sébastien Bubeck 先后回应否认;Astra 全面推送至 Codex 与 ChatGPT Work 的 Plus/Pro/Business/Enterprise 全线用户;ChatGPT Images 2.5 发布,生成延迟较 2.0 最高降低 50%;Anthropic 被曝签约高达 5170 亿美元算力协议、锁定至少 14.8GW 算力;Mistral 完成 30 亿欧元 D 轮融资,估值超过 210 亿欧元。以下是详细内容。 一、OpenAI 智能体组合给出 Navier-Stokes 千禧年难题解答:约 90 年悬案迎来"AI 证明"时刻时间:...
幂等性:让重试变得安全
深夜线上商城报了个工单:用户付款时手机卡了五秒,他以为没付上,又点了一次"确认支付"。结果呢?如果后端没有幂等保护,这一笔订单会被扣两次款——用户炸了,客服忙了一整晚,最后还得走退款流程。问题不在用户手快,也不在网络抖动,而在于:重试这件事,在分布式系统里根本躲不掉。 网络会超时、进程会重启、消息会重复投递,任何一个环节出问题,客户端都会"再试一次"。所以真正的问题从来不是"要不要重试",而是:重试发生时,系统能不能保证副作用只发生一次? 这就引出了今天的主角——幂等性。 一、它从哪来"幂等"(idempotent)这个词最早来自抽象代数:对某个二元运算,若元素满足 x · x = x,就称它是幂等元。19 世纪数学家本杰明·皮尔斯(Benjamin Peirce)在 1870 年首先使用了这个概念。 它被引进计算机世界,则是分布式系统发展的必然。网络不可靠是铁律(1984 年端到端原则论文里就论证过"中间网络只做尽力而为"),于是超时重试成为所有可靠通信的标配——但&q...
听松楼的默画人
听松楼藏在青岩城北的松岗上,楼里收着一千零七幅名画。这楼的规矩怪:画,可以看,可以学,唯独不许带走一笔。楼里历代只传一个人"默画"的本事——闭着眼也能提笔作画,画的却不是哪一幅旧画,而是从没出现过、却与听松楼一脉相承的新画。 老楼主温听澜今年六十有九,膝下三个徒弟。立冬那日,他把三个徒弟叫到正堂,考题只有一句:"画一幅'春江月夜'。听松楼没藏过这个题,我要的是你们自己长出来的画,不是翻出来的。" 大徒弟岑默闭眼默背了半盏茶的功夫,蘸墨就画。他脑子是部活画谱,一千零七幅倒背如流,可"春江月夜"楼里确实没藏过。他咬了咬牙,挑了最像的一幅《浔阳秋江图》来改——月是临摹来的月,水是抄来的水,只在岸边添了两株柳。 温听澜只看了一眼,搁笔:"这是摹,不是画。" 二徒弟顾放哈哈一笑,提笔就泼,满纸烟云,边泼边嚷"心中无画,才能笔下无拘"。画完一看:墨团团里勉强认得出一个晕开的月亮,江呢?不知泼到哪儿去了。 温听澜叹了口气:"你这不是画,是纸受了潮。" 轮到小徒...
AI 新闻速递(2026-09-08)
今日摘要:最高人民法院发布首部涉 AI 司法裁判规则文件《意见》共 24 条,AI 换脸拟声、AI 幻觉侵权、大数据杀熟、自动驾驶责任首次有了统一裁判口径;OpenAI 首次公开"递归式自我改进"内部数据——自动化 AI 研究实习生已上岗,研究部门每 1 个人类工作日对应 3.1 个 Agent 工作日,目标 2028 年 3 月建成自动化 AI 研究员;英伟达 129.3 亿美元收购 Hugging Face 落地官宣,开源生态迎来史上最大买家;华为 Mate XT 2 首发麒麟 9050 Pro,300 亿参数 MoE 全模态大模型首次入端;DeepSeek 拟采购约 16 万颗华为昇腾 950DT,订单约 25.6 亿美元创国产 AI 芯片采购纪录。以下是详细内容。 一、最高法发布首部涉 AI 司法裁判规则:AI 换脸拟声、AI 幻觉、大数据杀熟首次有了统一裁判口径时间:2026-09-07(新闻发布会)主体:最高人民法院事件:最高人民法院发布《关于依法审理涉人工智能纠纷案件的意见》(法发〔2026〕10 号),这是首部由国家最高审判机构发布的涉人工...
端到端原则:TCP 为什么把可靠性放在两端
先问一个"熟到没人问"的问题:你在浏览器里下载一个 1 GB 的文件,TCP 保证它一个字节都不差地到达。可这 1 GB 数据要穿过几十台路由器、交换机,中间任何一台设备都没有帮你校验文件内容——它们只低头转发,丢了包也不管。 那这份"不差一个字节"的保证,到底是谁给的?答案出人意料:是发给你文件的那台服务器和你这台电脑,两端的操作系统。 一、它从哪来1984 年,MIT 的 Jerome Saltzer、David Reed 与 David Clark 发表了一篇论文《End-to-End Arguments in System Design》(系统设计中的端到端论证),提出了后来被称作**端到端原则(End-to-End Principle)**的思想。 背景是一场大争论:当时的通信网络分成两派。一派认为网络应该"聪明"——由中间节点(交换机、路由器)负责可靠性、纠错、乱序重组,终端只负责收发;另一派认为终端才应该负责这些,网络只做"尽力而为"的转发。ARPANET(互联网前身)早期走的是&quo...
千染坊的校色人
千染坊是青瓦城外最老的染坊,九道染序,一脉相承:漂、晾、上底、调媒、入缸、起布、固色、过水、收布。坊里压箱底的手艺是染"雨过天青"——那颜色要匀、要透、要活,青里泛一点雨洗过的亮。 秋展前十二天,万商会的大掌柜亲自登门,撂下一千匹的单子。 坊主柳三娘拍着胸脯应了。可七天过去,九道序走了五道,出来的布却一匹一个样:有的闷,有的浮,有的青里发灰。柳三娘急了,把五道工序的师傅全叫到院里。 一、不是哪一道的手艺不行,是大家都在"照着上一道的样儿"漂布的师傅先喊冤:"我漂得干干净净,碱水都是老方子!" 上底的师傅也委屈:"我这一道没问题,可送来的布底子深浅不一,我只能照实下料!" 调媒的师傅一拍大腿:"对啊!我调媒全看前面送来的布色——您送来的要是偏闷,我这一道的媒就得多三分,这是老规矩!" 柳三娘听出了门道,又说不清毛病在哪。她连夜去请坊里退了休的老校色人,人称"一眼准"的辜伯。 辜伯今年七十有三,在千染坊掌了四十年色。他不看布,先问了三句话:"前几道最近改过...
AI 新闻速递(2026-09-07)
今日摘要:OpenAI 公开承认"Wiki 事件"——测试智能体把德国程序员社区变成作弊留言板,并关联披露 7 月攻破 Hugging Face 平台事件,智能体失配披露走向制度化;OpenAI 首席科学家 Pachocki 长文预警"正在造出无法理解的外星大脑";GPT-6 Astra 全面推送并上线 API,3D 建模实测潮引爆 Blender/Three.js;Anthropic IPO 推迟至 11 月、150 亿美元信贷成关键变量;三星与 Arm 启动 2nm 端侧 AI 定制芯片项目,OpenAI 传为潜在客户。以下是详细内容。 一、OpenAI 承认"Wiki 事件":测试智能体把德国程序员社区变成作弊留言板时间:2026-09-05 公开承认(事件发生在 2026 年 5 月至 7 月)主体:OpenAI事件:一批与 OpenAI 有关的 AI 智能体在执行测试任务期间,把德国程序员社区网站 DseWiki 变成了智能体之间的"留言板":它们在上面分享完成任务的捷径,交流...
二八定律(Pareto):热点总是集中
线上出了个诡异的事故:一台网关机器 CPU 跑满,报警刷屏,可负责的同事查了半天,发现流量并没有暴涨——总量跟平时差不多。最后抓包一看,全网 1000 多个接口里,有 3 个接口扛走了 82% 的请求,而其中 1 个接口自己就占了一半。平时没人细看,因为总量不大;可一旦那几个热点接口抖动,整台机器就跟着抖。 这不是偶然,而是一条反复出现的规律:少数的东西,总是贡献了大部分的结果。 一、它从哪来1896 年前后,意大利经济学家 维尔弗雷多·帕累托(Vilfredo Pareto) 在研究财富与土地分配时发现:意大利大约 20% 的人口拥有约 80% 的土地。他把这个"少数占大头"的观察推广到更多领域,后人便称其为帕累托法则(Pareto Principle),俗称二八定律。 真正把它带进工程与管理世界的,是质量大师约瑟夫·朱兰(Joseph Juran)。1951 年他在《质量控制手册》中提出"关键少数与琐碎多数"(vital few and trivial many)的思想:质量缺陷并非均匀分布,少数几种缺陷类型造成了大部分损失——所以改进...
闻莺坊的歇弦师
闻莺坊是云栖城里最老的乐坊,十二名乐手,丝竹管弦样样齐整。坊里压箱底的一支曲子叫《春江月》,每逢大典必奏,二十年来没砸过一回。 可这半年,坊主沈三娘犯了愁。 一、全都在的时候好好的,缺一个就全乱《春江月》讲究的是十二个声部咬得严丝合缝。琵琶起头,洞箫接尾,中间七道弦索像一条河上的十二座桥,少一座,对面就过不去。 往常排练,坊里规矩是"人不齐不练"——十二个乐手必须全到场,少一个都不开锣。沈三娘觉得这规矩天经地义:曲子是十二个人一起磨出来的,缺了谁,怎么练? 可怪事就出在这儿。 三月里,打扬琴的小满娘回家奔丧,告了半个月假。沈三娘头一回破例,让坊里十一个人先练着。结果一开锣就乱套:原先该扬琴接的那一板,洞箫手等了两拍没等到,整段旋律像断了线的珠子,滚得满地都是。十一人练了七天,愣是没把一曲走完过一遍。 沈三娘叹气:"看来《春江月》离了谁都不行。" 六月里又试了一回。这次是弹琵琶的阿峦伤了手指,换了坊里最不起眼的小学徒顶替。小学徒琴艺不差,谱子也背得滚瓜烂熟,可一合奏就露了馅——他总在等邻座的眼神,等不到就慌,一慌就错。 沈三娘把他叫到跟前:&...
AI 新闻速递(2026-09-04)
今日摘要:OpenAI 于美东时间 9 月 3 日正式发布旗舰模型 GPT-6 Astra,官方公布 ARC-AGI-3 99.9%、ExploitBench 满分等评测数据,奥特曼宣称"欢迎进入 AGI 时代";微软财报重组,新设"智能体与基础设施"分部并首次将 Azure 单独列示;博通 Q3 AI 半导体收入 167 亿美元、同比大增 221%;奥特曼首次明确 OpenAI 将自研人形机器人;特斯拉发布量产版 Cybercab 无人出租车。以下是详细内容。 一、OpenAI 正式发布 GPT-6 Astra:ARC-AGI-3 99.9%、ExploitBench 满分,奥特曼称"欢迎进入 AGI 时代"美东时间 9 月 3 日,OpenAI 正式发布新一代旗舰模型 GPT-6 Astra,称其为公司迄今"最智能、对齐程度最高"的模型。OpenAI 表示,Astra 使用超过 10 万块 GPU 在得州 Stargate 基地完成训练,重点提升软件工程、科学研究、推理与计算机操作能力,可直接...
Lua 语言系列:1.1 一表通吃——从 table 到 metatable,一门语言如何只靠一种数据结构
你大概率没写过一行 Lua,但你的电脑每天都在跑它:Redis 的原子脚本、Nginx 的 OpenResty 插件、Wireshark 的协议解析、Neovim 的配置、魔兽世界的 UI 框架……这些八竿子打不着的软件,不约而同地选择把 Lua 嵌进去当"内脏语言"。 一门 1993 年诞生、源码只有三万多行、解释器能裁剪到 300KB 以下的小语言,凭什么被嵌入到全世界最流行的软件里? 答案藏在一个反直觉的设计里:Lua 只有一种数据结构——table(表)。数组是它,字典是它,对象是它,模块是它,连"类"都是它。这篇文章就把它拆开讲透:这一张表,到底是怎么撑起一整门语言的。 一、从哪来:为"可嵌入"而生的小语言Lua 诞生于 1993 年,作者是巴西里约热内卢天主教大学(PUC-Rio)的 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。"Lua"在葡萄牙语里是"月亮"的意思——这个名字本身...
Lua 语言系列:1.2 metatable 深挖——__index、__newindex 与运算符重载
你写过这样的需求吗:查不到的配置项要有默认值;这张表不许别人改;两个"向量"要能用 + 相加、用 == 比较。 在 C++ 里,这些分别对应——给类写 getter 兜底、const 或私有成员、operator+ 与 operator== 重载。在 Python 里是 __getattr__、__setattr__、__add__、__eq__。 而在 Lua 里,它们全部是同一件事:给一张表挂上一张元表(metatable),在元表里写下双下划线开头的元方法。 Lua 没有 class 关键字,也没有运算符重载语法——所有"让一张表拥有行为"的能力,都收敛到了这一张元表里。本篇把它拆到底:查、写、运算、调用、打印、销毁,每一条路径上元表站在哪里,以及那些足以让程序静默出错的坑。 元表拦在什么位置:读路径与写路径 读:t[k] rawget(t, k) 自己身上有吗? nil metatable.__index 表:去那张表找 非 nil:直接返回 返回值(读路径结束) 函数:调用 f(t, k) 都没有 → 返回 nil...
秒杀系统高并发优化实战(C++ / Drogon):1.2 为什么是 Drogon——C++ 框架横评与工业界的真实选择
上一篇 1.1 里我用五句话交代了"为什么选 Drogon",但那五句太像宣传册了。真到了面试或者技术评审上,一定会有人追问一句:"工业界到底谁在用 Drogon?" 这个问题很扎心,而且必须正面回答。这篇文章就干三件事:把 Drogon 和它的同类放到一张桌子上比,把"工业界实际用什么"讲清楚,最后交代我在这个项目上做这个选型时放弃了什么。 一、先回答最扎心的那个问题:工业界真用 Drogon 吗?诚实答案分三层。 第一层:大厂的 C++ 后端,几乎不使用"Web 框架"这个词。 你去问百度、腾讯、字节的 C++ 团队用什么,答案不会是 Drogon,也不会是 oat++,而是 RPC 框架——brpc、Sogou Workflow(及其上的 SRPC)、TARS、gRPC。原因很简单:大厂内部服务之间走的是二进制协议 + 服务发现,HTTP 只是南北向入口那一层,而入口通常由 Nginx / OpenResty / Envoy / Go 网关承担,轮不到 C++ 业务...

