自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(901)
  • 资源 (1)
  • 收藏
  • 关注

原创 Go 中如何处理错误

error就可以创建带有额外功能的自定义 Error Type。前面“检查特定错误类型”中已经看到一个例子。os.Open这个 Error 是一个 Struct。Error()Unwrap()Timeout()PathOpErr用于保存详细错误信息。Op stringErr error// Timeout 报告这个错误是否表示一次超时。你也可以按照类似方式创建自己的 Error Type。唯一必须Error()Unwrap()就能够解开你定义的 Error。

2026-09-03 11:13:02 194

原创 Go Map 详解:键值对实际上是如何存储的

作者:本文是对victoriametrics的整理与翻译发布日期:2024 年 8 月 16 日阅读时间:17 分钟如果你刚开始接触 Go,可能会觉得 Go 中的 Map 用起来有些令人困惑。即使已经积累了更多 Go 开发经验,想真正搞清楚 Map 底层究竟是怎么工作的,也并不是一件容易的事情。比如下面这个例子。你有没有在创建 Map 时设置过一个hint或者,你可能已经注意到:使用for-range遍历一个 Map 时,得到的顺序并不等于键值对插入 Map 的顺序。

2026-09-02 01:10:10 351

原创 NAT 穿透是如何工作的

因为我们的 Peer 最终必须想办法穿过的就是它。

2026-09-02 00:27:43 341

原创 我们如何通过优化 1.1.1.1 的 DNS 缓存节省 100 TB 内存

本文是对Cloudflare的整理与翻译是以及 Cloudflare 其他多项 DNS 服务背后的平台。在任意时刻,它都会存储超过。在这样的规模下,每条记录哪怕只浪费 1 个字节,放大到整个服务器集群,也意味着超过的内存浪费。通过连续五次调整缓存条目在内存中的存储方式,我们将单条缓存记录的内存占用减少了。这些改动在整个服务器集群中释放了大约,相当于我们所配备的 RAM 总量。缓存的速度也变得更快。由于减少了内存分配次数,并改善了内存局部性,缓存插入吞吐量提升了,查找延迟降低了。

2026-09-01 23:30:15 339

原创 程序员每天能省 1 小时的 50 个 macOS/终端/Git/浏览器技巧

复制过的 IP、命令、URL、代码片段都不用重新找。GitHub 登录态、Google 账号、插件、Cookies 完全隔离。reset、rebase、误删 branch 后,大多数情况下 commit 其实还在那里。PDF、图片、视频、Markdown、代码、Office 文件很多都不用真正打开应用。页面跳转、OAuth 重定向、登录失败时,如果不开它,上一页请求记录可能瞬间没了。一个文件改了 bug、重构、debug 日志三件事,也能拆成干净 commit。对于经常查文档的人,这是非常大的提效点。

2026-08-13 14:51:30 334

原创 一些提效小技能

【代码】一些提效小技能。

2026-08-13 14:44:45 215

原创 Go设计取舍之六: sync.Mutex正常模式与饥饿模式

2023 年 6 月 3 日,在询问了sync.Mutex源码注释中的 waiter 和饥饿模式。Ian Lance Taylor 参与回复,共有 6 封邮件。。

2026-08-01 11:08:50 209

原创 Go设计取舍之五: 一行代码为什么打印7-11-11

2026 年 7 月 17 日,上有人贴出一段代码:多数人以为会打印10 11 11,Go 1.26 的实际结果却是7 11 11。线程共有 7 封邮件,Ian Lance Taylor 参与解释。。

2026-08-01 11:00:21 150

原创 Go设计取舍之四: map不变时能否并发修改不同value

2026 年 7 月 28 日,上出现了一个很典型的问题:map 已经提前填好,之后不再增删 key,多条 goroutine 分别更新不同 key 对应的 value,是否安全?线程共有 10 封邮件,Ian Lance Taylor 参与回复。。

2026-08-01 10:57:52 300

原创 Go设计取舍之三: 0.3ns每次的错误Benchmark

2023 年 11 月 27 日,分享了一组 Go 1.21 与 Go 1.22 的 benchmark,想确认string和[]byte转换是否获得了新的零分配优化。共有 9 封邮件。。

2026-08-01 10:52:03 345

原创 Go设计取舍之二: maps.Keys和Values为什么返回迭代器

2024 年 12 月 24 日,笔者在提出了一个问题:为什么实验包exp里的maps.Keys返回切片,而标准库里的同名函数却返回迭代器?这场讨论持续到 12 月 31 日,共有 18 封邮件。。maps.Keys。

2026-08-01 10:35:12 344

原创 Go设计取舍之一: goroutine 为什么保持匿名、无状态

这句话很容易被理解成“Go 团队只是没做 goroutine ID”,但它实际指向一种更深的编程约束。

2026-08-01 10:07:25 213

原创 陶哲轩与莱利·陶:将人工智能的海量输出转化为可用的科学成果

但是,如果课程过分重视标准化考试,教学完全围绕考试展开,那么学生最终只会学到一些专门应付某项考试的技巧,例如专门应付SAT的技巧,而牺牲其他类型的学习。根据您的描述,我理解这种合作的大致形式是:人工智能可以寻找问题,也可以寻找文献中其他人已经完成的工作,然后把这些内容提供给人类,为人类带来灵感。我掌握的编程知识足以让我调试它生成的程序,并且确保程序准确输出我需要的结果。这可能并不是我本人会参与的研究项目,但我认为,人工智能的发展必须同时探索许多不同方向,而不能只是不断增强大语言模型的能力。

2026-07-30 22:40:25 237

原创 菲尔兹奖与希尔伯特第六问题

本篇内容是根据2026年7月底 SAIR访谈内容的整理与翻译大家好,欢迎回到SAIR的节目。今天和我们一起参加访谈的是邓煜教授。首先,祝贺您在本周的国际数学家大会颁奖典礼上获得菲尔兹奖。对您来说,这一周过得怎么样?另外,能否请您简单介绍一下自己的研究工作?这一周真的非常忙。我记得在开幕式当天,整个上午的时间几乎都被完全占满了。等我终于回到酒店时,我才发现自己已经有将近一百封未读邮件。所以,那确实是一种非常美妙的感觉。不过,当时也真的非常疲惫。尤其是,我感觉自己现在突然在中国互联网上变得非常有名了。

2026-07-30 19:45:15 167

原创 不用再反复 stash:用 Git Worktree 同时开发多个分支

Git Worktree 解决的问题并不复杂:它允许同一个 Git 仓库同时在多个目录中检出不同分支。每个任务都有自己的目录、分支、暂存区和未提交修改。正在运行的开发服务器、IDE 窗口以及测试环境也可以继续保持,不需要因为切换分支而反复重启。同时维护多个 PR;开发新功能时紧急修复 Bug;审查其他人的代码;对比多个版本;同时运行多个测试环境;让多个自动化工具或 AI Agent 并行工作。

2026-07-19 23:21:44 444

原创 Go 1.25 新增 `reflect.TypeAssert`:更直接、更高效地从 `reflect.Value` 取出类型值

但省去了显式调用的步骤,并且在许多场景中可以避免中间接口带来的内存分配。它执行的是类型断言,不是类型转换。目标类型可以是具体类型,也可以是接口。类型不同不代表一定失败,具体类型可能实现目标接口。值为 nil 的接口断言仍然遵守 Go 语言规则。无效 Value 或不可导出的字段可能导致 panic。它可以减少分配,但不保证所有场景都零分配。它从 Go 1.25 开始提供。尤其是在序列化、反序列化或反射密集型的性能路径中,那么值得重点关注。

2026-07-15 15:23:03 428

原创 Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置

可以把想象成一段数据和一个读取游标。当前读取位置b.Peek(5)Hello当前位置仍然不变则会读取"Hello, "新的读取位置b.Peek(7)Gophers所表达的含义:消费掉"Hello, ",将读取位置向后移动 7 个字节。是 Go 1.26 中一个不大但很实用的标准库改进。查看接下来的数据,但不移动读取位置。与ReadPeek:只看,不消费,不移动读取位置。Read:读取并消费,同时移动读取位置。它不仅减少了手动调用Bytes()和边界检查的样板代码,更重要的是让能够满足需要。

2026-07-15 15:19:52 358

原创 一款跨设备的重复文件清理器

Duplicate File Checker 的解决思路是:先分别扫描不同硬盘或目录,把文件索引保存在本地数据库里;该工具主要解决一个我自己经常遇到的问题:手里有多块移动硬盘,有多台电脑,多个备份目录,时间一久,这些设备和存储中会有大量重复的视频、图片、备份文件。使用 Rust+egui+SQLite 写了一个客户端工具:Duplicate File Checker ,一款跨设备的重复文件清理器。在存储价格因为 AI 热潮而飞涨的今天,出于节约考量,有了这个工具。找出不同电脑之间重复保存的大文件。

2026-07-11 18:58:08 165

原创 Uber 如何为 PB 级数据湖构建 I/O 可观测性:从 HDFS/GCS 客户端埋点到 HiCam 高基数聚合

Uber 这篇文章讲的是 PB 级数据湖 I/O 可观测性,但它的核心经验并不局限于数据湖。它说明了一个很重要的工程原则:在大规模平台里,可观测性不能只靠各个系统自己打日志,而要找到一个既足够底层、又足够通用、还能表达业务语义的观测层级。对于 Uber 来说,这个层级就是 Hadoop-compatible file system client。通过拦截和,Uber 可以在不修改作业代码的前提下,覆盖 Spark、Presto 和自定义作业,记录每个应用、每个数据集、每个分区的读写行为。Uber。

2026-07-10 15:30:51 364

原创 Uber 如何用 Ceilometer 做自适应性能基准测试:从机器选型到变更验证的基础设施平台化实践

Ceilometer 是 Uber 为了解决大规模基础设施性能验证问题而构建的自适应 benchmark 平台。它把过去手工、零散、不可复现的 benchmark 流程,改造成了统一、自动化、可比较、可分析的平台能力。这套平台解决的问题包括:测试配置不一致、测试系统碎片化、流程复杂难以规模化、结果缺少上下文、测试环境缺少可移植性,以及很多技术栈没有成熟 benchmark 工具。

2026-07-10 14:59:14 324

原创 Uber 如何让 MySQL Group Replication 在大规模生产环境中可用:自动化、故障转移与一致性保障

Uber 这次 MySQL 高可用改造,本质上是从“外部系统检测故障,然后人工或自动化脚本救火”,转向“数据库集群内部通过共识协议自我恢复”。第一篇文章讲的是为什么要引入 MGR,以及 MGR 在故障切换和一致性方面带来的架构收益;第二篇文章则补上了真正落地所需的运维能力:自动接入、自动退出、自动再平衡、节点删除处理、节点替换处理、Primary 选举、一致性参数选择以及 MGR 内存监控。

2026-07-10 00:04:04 396

原创 Uber 如何把 MySQL 主库故障时间从 2 分钟压到 10 秒:基于 Group Replication 的高可用改造

Uber 这篇文章讲述了他们如何通过 MySQL Group Replication 改造 MySQL 集群高可用架构。Uber 大规模使用 MySQL,支撑需要 ACID 事务、关系模型和 SQL 接口的业务场景。原有 MySQL 集群采用单 primary、多 replicas 的架构,primary 负责写请求,read replicas 负责读请求,复制默认是异步的。这个架构能支撑读扩展,但 primary 是写路径单点。

2026-07-09 23:20:53 255

原创 从软件到硅片:Uber、OCI 与 Ampere 如何联合优化 AmpereOne M A4 计算实例

Uber 这篇文章讲述了 Uber、Oracle Cloud Infrastructure 和 Ampere 如何共同优化 OCI AmpereOne M A4 Compute。背景是 Uber 从 2023 年 2 月开始从本地数据中心迁移到云上,使用 OCI 和 Google Cloud Platform,同时将 Arm-powered compute instances 引入原本以 x86 为主的环境。

2026-07-09 20:55:46 364

原创 Uber 如何用 Pull-Based Ingestion 在 OpenSearch 中索引流式数据

Uber 这篇文章讲述了他们如何在 OpenSearch 中实现 pull-based ingestion,用于索引大规模流式数据。Uber 的搜索平台支撑叫车、餐厅搜索、配送跟踪、司机和配送员实时位置等关键体验,因此必须满足高吞吐、低延迟、数据新鲜度、可扩展性和多区域高可用要求。为此,Uber 的搜索架构建立在两个基础原则上:pull-based ingestion model 和 active-active deployment。

2026-07-09 20:43:01 405

原创 Uber 开源 uForwarder:用 Consumer Proxy 把 Kafka 消费改造成异步消息队列

Uber 这篇文章介绍了 uForwarder,也就是他们开源的 Kafka Consumer Proxy,用于支持 Kafka async queuing 场景。Uber 每天处理数万亿条 Kafka 消息和多个 PB 数据。三年前,Uber 构建了一个基于 push 的 Consumer Proxy,用于解决 Kafka 在 pub-sub 和异步队列场景中的几个问题,包括 partition scalability、Head-of-Line Blocking,以及多语言 consumer 支持问题。

2026-07-09 17:09:27 695

原创 Uber 如何完成超大规模 JUnit 迁移:从 JUnit 4 到 JUnit 5 的自动化工程实践

因为 Bazel 默认测试规则不能直接满足 Uber 的需求,Uber 构建了一个自定义 test runner,作为 Bazel test rule 和 JUnit Platform 之间的集成层。Uber 特定的 test discovery额外测试初始化和环境设置再委托给 JUnit Platform 执行也就是说,Uber 不只是要“能跑 JUnit 5”,还要让 JUnit 5 进入原有测试生态。

2026-07-08 20:47:42 432

原创 从监控到可观测性:Uber 企业网络的云原生平台改造之路

Uber 这篇文章讲述了他们如何把企业网络监控系统,从传统单体监控升级为云原生可观测性平台。这套平台关注的是 Uber Corporate Network,也就是连接办公室、数据中心、云环境和内部服务的企业网络基础设施。它不属于 Uber 生产业务服务的 telemetry platform,而是专门用于观察交换机、路由器、PDU、IoT 传感器、网络连通性、延迟、设备健康和企业网络操作数据流。数据质量可扩展性可行动数据Telegraf:采集 SNMP、API、MQTT 等多来源指标。

2026-07-07 14:42:10 365

原创 Uber 的全局限流系统:从零散 Redis 限流到服务网格里的自动化流量保护

Uber 的限流系统经历了一个典型的大规模基础设施演进过程。最初,Uber 内部服务各自实现限流。有的写在业务逻辑里,有的用 middleware,有的用 Redis-based counter。随着微服务规模增长,这种模式暴露出配置不一致、运维成本高、修改慢、排障难、覆盖不均匀、可观测性差等问题。Redis 中心计数器方案在普通系统里可行,但无法支撑 Uber 的规模。Uber 有数十万 hosts、每秒数亿 RPC、跨多个 region。

2026-07-07 14:28:49 402

原创 Uber 如何构建高吞吐支付账户处理系统:用 250ms 实时批处理解决“热账户”难题

Uber 这套 User Account Batch Processing 系统解决的是一个典型但很棘手的问题:单个金融账户在极端业务场景下出现高频更新,传统逐条处理无法满足吞吐要求,而简单扩容、Kafka 批处理、账户分片、地理共址都无法同时满足实时性、一致性和审计要求。最终方案的核心是 250ms 实时批处理。

2026-07-07 14:20:53 401

原创 Uber 如何让 CPU 从“专用独占”走向“可靠共享”:Odin 的混合核心分配实践

Uber 这篇文章讲的不是一个简单的 CPU 参数调优,而是有状态容器平台资源管理的一次体系化升级。最开始,Uber 为了避免 CPU quota 带来的 throttling,引入 cpusets,让 workload 绑定到专用 CPU core 上。这带来了更稳定的尾延迟,但也让资源分配变得更“硬”:专用 core 必须完整分配,burst 能力变弱,面对突发型 CPU workload 时容易过度预留。Hybrid core allocation 的出现,就是为了补上这块短板。

2026-07-07 14:04:41 324

原创 Uber 全球办公网络自动化实践:Ansible 如何把 5000 台设备拉回“期望状态”

Ansible 最早由 Michael DeHaan 在 2012 年创建。它起初是为了解决同时管理多台 Web 服务器的痛点。后来 Ansible 快速发展,成为一个非常活跃的开源项目,并逐渐被 Red Hat 主导。随着后续版本演进,Ansible 从一个相对单体的项目拆分出 Ansible Collections,让不同厂商和社区可以围绕各自领域开发模块并通过包管理方式分发。Ansible 和 Puppet、Chef 这样的工具相比,一个很大的特点是简单。

2026-07-06 21:26:01 88

原创 Go 并发的七种数据竞争陷阱:Uber 从 1100 个 Race 修复中总结出的经验

Go 的并发能力是它最吸引人的地方之一。go关键字、goroutine、channel、sync包,让并发代码写起来非常直接。但并发写起来容易,不代表并发写对也容易。Uber 的经验提醒我们:很多 data race 并不是因为开发者完全不知道要同步,而是因为 Go 的某些语义太“顺手”了,让人误以为代码是安全的。闭包看起来只是引用了一个变量,但它可能跨 goroutine 并发访问;slice 看起来是引用类型,但传参时会复制 header;map 看起来像数组按 key 访问,但内部不是独立元素;

2026-07-06 21:21:01 145

原创 Uber 如何规模化数字身份验证:从 Apple Wallet 证件到跨场景 Identity Verification Platform

Uber 是一个跨区域、跨产品、跨角色的平台。它不只是一个打车 App,也包括 Uber Eats、Postmates、司机端、配送端、租车、商家、支付、年龄限制商品、合规审查等大量场景。这些场景背后有一个共同问题:这个人到底是谁?他是否满足当前业务要求?身份验证对 Uber 至少有三类价值。第一,支持市场扩张。不同国家、州、市有不同监管要求。要进入更多市场,就必须满足当地对用户、司机、配送员、年龄限制商品、身份真实性等方面的规则。第二,满足合规要求。

2026-07-06 20:45:04 140

原创 从静态限流到智能负载管理:Uber 如何治理大规模数据库过载

原文最后给出了 Lessons Learned,非常值得单独整理。Uber 这篇文章讲述了他们从静态限流走向智能负载管理的完整过程。最初,Uber 尝试在无状态 Query Engine 层做 quota-based rate limiting。每个请求根据处理字节数计算 capacity cost,租户超过 quota 就返回 429,quota 使用量存到 Redis。每个请求都要访问 Redis,增加故障点和网络开销无状态查询层很难实时掌握数千 partition 的健康状态。

2026-07-06 20:41:22 334

原创 Uber 如何用原生 gRPC 加速 OpenSearch:从 REST/JSON 瓶颈到搜索与写入性能优化

原文对性能收益做了总结。大请求体大 RPS 下的高吞吐二进制文档格式Uber 这篇文章讲的是他们如何在 OpenSearch 中引入原生 gRPC endpoints,从而加速搜索和写入工作负载。问题背景是:Uber 内部大量基础设施使用 gRPC 和 Protobuf,而 OpenSearch 历史上主要暴露 REST/JSON API。为了连接这两个世界,Uber 过去需要在 Search Gateway 中维护 Proto ↔ JSON 的适配层。这层转换增加了延迟、CPU 开销和系统复杂度。

2026-07-06 14:38:53 336

原创 Go 栈扩容也能省 CPU:Uber 如何通过“固定栈大小”省下 10% 资源

Uber 这篇文章讲了一个很典型、也很深入的 Go 性能优化案例。Go goroutine 默认从 2KB 小栈开始。这让 goroutine 非常轻量,适合高并发。但当某些服务的调用链需要更大栈时,runtime 会触发栈增长,分配新栈并复制旧栈内容。如果这种扩容发生得很频繁,就可能成为明显 CPU 热点。Uber 在一个核心服务中看到,接近 10% CPU 花在 stack growth 上。同时这个服务内存很宽裕,容器有 16GB,栈内存使用却很低。

2026-07-06 14:24:43 268

原创 给链接器做性能画像:Rust 构建慢,到底是不是链接器的锅?

Profiling linkers》这篇文章很短,但信息密度很高。它从一个问题开始:为什么换了mold或lld,Rust 构建时间没有明显变快?然后给出了一个非常工程化的回答:不是靠猜,而是 profile。作者先用 GNU ld 建立 baseline,发现普通 release hot build 大约 7 秒。然后用moldwrapper 加上-perf,配置clang作为 linker driver,构建时间降到大约 5.1 秒,mold自报链接时间约 392ms。再用。

2026-07-06 10:29:30 370

原创 把自家 CMS 开源:一个 Rust 网站系统从“私人玩具”到公开项目的五年

Open sourcing the home CMS》讲的是作者把自己用了五年的网站 CMShome开源的过程。这个系统最初不是为了成为公共产品,而是作者出于对现有工具的不满和自己的需求做出来的。它经历了多个名字,从futiletoldsnug,最终变成home。开源的不只是home:多年收集的 tree-sitter grammar 集合:把.drawio转成.svg的工具:提供 Homebrew 安装入口timelord:在 CI 中恢复时间戳,减少 Cargo rebuild。

2026-07-06 10:03:45 379

原创 彩虹表里到底装了什么:从密码哈希到“以空间换时间”的破解技术

真实情况更常见的是:目标哈希可能在链的中间,不在最后一列。我们要找的是H1。P0 和 H3它不存H1。那怎么办?思路是:假设目标哈希在某一列,然后把它“向右推进”到最后一列。例如假设目标哈希在倒数第二个哈希列。那我们对它应用对应列的 reduction function,再应用 hash,得到可能的终点哈希。↓ R_i↓ H然后拿这个去表里查终点。如果匹配到某条链,就说明目标哈希可能在这条链里。然后我们再从这条链的起始明文开始往右重新计算,验证是否真的能遇到目标哈希。

2026-07-06 00:54:30 320

原创 面向独立创作者的 Face Cam 完整指南:从麦克风、相机、灯光到剪辑工作流

作者早期用过 OBS,因为直播出身。后来因为 Elgato 采集工具的某些优点离开 OBS,又因为掉帧、同步、文件组织等问题回到 OBS。OBS 对他的价值在于:可以稳定采集 Blackmagic 卡的 2160p25 输入;可以把音频延迟补偿提前配置好;可以直接录出音画同步的文件;可以设置单声道麦克风,不浪费音轨;可以看到 dropped frames 健康状态;可以使用硬件编码,比如 NVENC 的 H.264/H.265,较新显卡还可以 AV1;

2026-07-05 21:11:44 262

MyServlet.war

用于测试,放在tomcat的webapps目录下,请求http://localhost:8080/MyServlet/,页面显示hello,servlet!

2019-06-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除