2026年2月

引言

缓存是工程师优化分布式系统时首先采用的工具之一。我们会缓存已完成的响应(如数据库查询结果或 HTTP 响应体),以避免重复执行昂贵的任务。然而,传统缓存未能解决一个经常被忽视的低效源头,即重复的进行中请求(duplicate in-flight request)

当多个客户端几乎同时请求同一资源时,缓存未命中会触发相同的计算会并行开始执行。在单进程的 JavaScript 应用中,通常会通过在内存中存储进行中请求的Promise来缓解该问题,使后续调用者可以等待同一个结果。在其他语言和运行时中,可通过不同的并发原语实现类似效果,但底层假设是相同的,也就是共享内存和单一执行上下文。

在分布式、无服务器或边缘环境中,这一假设就难以成立了。每个实例都有自己的内存,任何形式的进行中请求去重都仅限于单个进程的生命周期和范围之内。

工程师通常会在缓存之外引入第二种机制,比如,锁、标记(marker)或协调记录(coordination record),以跟踪正在进行的工作。这些方法难以进行推理,并且经常退化为轮询或粗粒度的同步。

本文提出了一个不同的模型,那就是将已完成的响应和进行中的请求视为同一缓存条目的两种状态。借助 Cloudflare Workers 和 Durable Objects,我们可以为每个缓存键分配一个单一、权威的所有者。该所有者可以安全地持有正在进行工作的内存表示,允许并发调用者等待它,然后在工作完成后将条目转换为已缓存的响应。

该模式并没有引入单独的协调层,而是将缓存和进行中请求去重统一在单一抽象之后。尽管它依赖于并非普遍可用的运行时特性,但在支持按键单例执行的环境中提供了一种简洁且实用的方法。

深入分析该问题

从宏观层面来看,问题不在于缓存本身,而是在于缓存条目存在之前发生了什么。

考虑一项代价高昂的操作:数据库查询、外部 API 调用或 CPU 密集型计算。在分布式边缘环境中,多个客户端可能在非常短的时间窗口内请求同一资源。如果缓存尚未包含该键的值,每个请求都会独立触发相同的工作。

因为边缘运行时会有意地进行水平扩展,这些请求通常由不同的执行上下文处理。每个上下文都观察到相同的缓存未命中,并且会继续执行,就好像它是第一个请求者一样。结果就是冗余的工作激增,而缓存本应防止这种情况发生,但由于缓存只有在第一个请求完成后才能发挥作用,因此这种现象难以避免。

作为应对措施,很多系统引入了额外的机制来跟踪进行中的工作。一个缓存用于已完成的结果,而另一个结构(有时是内存映射,有时是分布式存储)用于标记请求为“进行中(in-flight)”。这种分离迅速增加了复杂性。请求的生命周期现在必须在两个独立系统之间协调,必须仔细处理竞争条件、失败和超时。

按照进程进行内存去重部分缓解了这个问题,但是这种方法仅限于单个运行时实例的范围内。在无服务器和边缘环境中,实例的生命周期很短,并且在设计上是隔离的。两个同时请求不同节点的请求即使它们在逻辑上是相同的,也无法共享彼此的进行中状态。随着流量增长或地理分布更广泛,这种优化的效果迅速降低。

它造成的结果就是,在单体或长期存活服务中表现良好的模式,但在水平扩展最激烈的环境中却崩溃了。

缓存结果的缺失和第一次计算完成之间的这个时间差恰好是传统缓存策略无能为力的地方,也是进行中请求去重在分布式运行时中变得既必要又特别困难的地方。

为何 Durable Objects 是合适的方案?

上一节所述的困难是现代无服务器和边缘平台设计的直接结果。隔离的执行上下文、短暂的进程和水平扩展都是它们的特性,而非缺陷。因此,任何针对进行中请求去重的解决方案都必须在这些约束下工作,而不是试图绕过它们。

Cloudflare Durable Objects提供了一套小但关键的保障措施,使得这一点成为可能。

首先,Durable Object 实例是一个按键存在的单例(per-key singleton)。对于给定的对象标识符,所有请求都路由到同一个逻辑实例,无论它们来自哪里。这立即消除了所有权的模糊性:对于给定的缓存键,只有一个地方可以存放进行中的状态。

其次,Durable Objects 提供了跨请求共享的可变内存。与传统 Worker 不同,Durable Object 可以在请求之间保留内存状态。这允许它持有正在进行的工作的表述,例如一个正在进行的计算,而无需外部协调。

第三,对 Durable Object 的请求是按顺序处理的。这种串行执行模型消除了在检查或更新进行中状态时需要显式锁定的需求。检查是否已经有计算正在进行中,如果没有的话,则创建它,并且它能够附加额外的等待者,这些都可以在单一执行上下文中确定性地进行。

综合这些特性,Durable Object 能够充当进行中和已完成缓存条目的权威所有者。调用者不再需要询问“这个请求是否已经在其他地方开始了?”,而是简单地将请求转发给负责该键的对象并等待结果即可。

重要的是,这种能力不是支持最终一致性的键值存储可以模拟的。KV 系统非常适合持久化已完成的结果,但它们无法在避免使用轮询或外部信号的情况下,表示执行中的过程或允许多个调用者等待同一块内存中的操作。相比之下,Durable Objects 对进行中工作的支持成为了首要的关注点。

这并不意味着 Durable Objects 在所有情况下都适用。本文描述的模式依赖于它们的单例和内存保证,因此只适用于提供类似语义的运行时。在这些保证能够达成的环境中,Durable Objects 提供了一个干净且最小的基础,可以统一缓存和进行中请求去重,而无需引入额外的协调层。

突破 Cloudflare 的适用性

尽管本文中的示例使用了Cloudflare Workers和 Durable Objects,但底层模式并不是特定于 Cloudflare 的。重要的不是平台本身,而是上述的运行时保证。

运行时至少要提供:

  • 按键单例执行:给定键的所有请求都路由到同一逻辑实例。

  • 该实例在请求间能够共享内存状态。

  • 串行请求处理,或等效的无需显式锁定的保证。

Cloudflare Durable Objects 明确满足这些要求,使它们成为一个方便且定义明确的示例。其他环境中也可以找到类似语义的功能,尽管通常以不同的名称或具有不同的权衡:

  • 基于 Actor 的系统,比如基于AkkaOrleans构建的系统,通过 Actor 身份和消息串行提供可类比的保证。在这些系统中,Actor 可以自然地拥有给定键的进行中工作和已缓存的结果。

  • 有状态无服务器平台和“持久执行”模型也开始出现,不过其 API 和功能保证差异显著。它们的共同点是,并非所有无服务器计算都必须是无状态的,有限且范围明确的状态可简化某些协调问题。

相比之下,那些仅提供无状态函数并结合最终一致性键值存储的平台无法整洁地实现这一模式。没有单一权威所有者和共享内存执行上下文,进行中去重不可避免地退化为轮询或分布式锁。

因此,本文所述模式应理解为依赖于运行时。它并不是传统缓存的通用替代方案,而是在执行模型支持的情况下才可行的针对性技术。

一个最小化的实现

在运行时保证确立后,实现本身就特别简单了。我们的目标不是构建一个通用的缓存,而是展示一个单一抽象如何同时处理进行中请求的去重和响应缓存。

以下示例展示了负责单个缓存键 Durable Object。该键的所有请求都路由到同一对象实例:

export class CacheObject{  private inflight?: Promise<Response>;  private cached?: Response;  async fetch(request: Request): Promise<Response> {    // Fast path: return cached response if it exists    if (this.cached) {      return this.cached.clone();    }    // If no computation is in-flight, start one    if (!this.inflight) {      this.inflight = this.compute().then((response) => {        // Store completed response        this.cached = response.clone();        // Clear in-flight state        this.inflight = undefined;        return response;      });    }    // Await the same in-flight computation    return (await this.inflight).clone();  }  private async compute(): Promise<Response> {    // Placeholder for an expensive operation    // e.g. database query or external API call    const data = await fetch("https://example.com/expensive").then(r => r.text());    return new Response(data, { status: 200 });  }}
复制代码

该对象维护两种状态:

  • inflight,表示正在进行的计算。

  • cached,存储可用的已完成响应。

当请求到达时,对象首先检查是否存在缓存的响应。如果没有,它会检查是否已经有计算正在进行中。如果有的话,调用者只需等待同一个 Promise。如果没有,对象就会启动计算,并将结果 Promise 存储在内存中。

由于 Durable Objects 按顺序处理请求,无需显式锁或原子操作。检查和创建进行中 Promise 的逻辑在单一执行上下文中能够确定性地执行。

从调用者的角度来看,这就像一个普通的缓存一样。不同之处在于,即使缓存最初是空的,并发调用者也不会触发重复的工作。一旦计算完成,所有等待的调用者都会收到相同的结果,后续请求直接从缓存响应中提供服务。

此示例有意省略了持久化、过期和错误处理。这些问题可以在不改变核心思想的情况下分层进行处理。比如,可选择将已完成的响应存储在键值存储中以实现持久性,但关键是,进行中的状态永远不会离开内存,从而保持了该模式的简洁性和正确性。

该方法的优势

该模式的主要优势是将两个相关的关注点合并为单一抽象。它不将进行中请求去重和响应缓存视为独立的问题,而是将其建模为同一缓存条目的不同状态。

这会带来多项实际的优势:

  • 首先,它消除了缓存无法发挥作用的情况下的重复工作。通过允许多个并发调用者等待同一个正在进行的计算,系统避免了在缓存未命中期间出现的冗余请求激增,这正是传统缓存最无能为力的场景。

  • 其次,该方法简化了系统设计。没有必要引入第二个协调层、分布式锁、与缓存数据分开存储的“进行中”标记。所有与请求合并、执行和结果重用相关的逻辑都集中在一个地方,由单一的运行时实体拥有。

  • 第三,它与 JavaScript 应用的编写方式自然对齐。等待共享 Promise 是惯用且易于理解的模式,Durable Objects 使此模型可扩展到单个进程之外,而不必改变思维模型。调用者与缓存的交互,就像在本地进行一样,尽管它的执行是分布式的。

  • 第四,该模式可水平扩展而不丧失正确性。随着流量增长或地理分布更广泛,请求仍路由到每个键的同一权威所有者。行为不会随着更多边缘节点的添加而退化,这与按进程优化的常见情况不同。

  • 最后,该模型可增量扩展。过期策略、已完成响应的持久化、指标和重试均可添加,而不改变核心控制流。基本思想就是,一个所有者、一个进行中请求的计算、一个缓存结果的思路保持不变。

这些特性使该模式适用于重复工作成本高且请求并发不可预测的工作负载,如边缘 API、聚合端点或昂贵的上游集成。

权衡与限制

尽管优雅,此模式并非普遍适用。其有效性在很大程度上取决于底层运行时的执行模型,并引入了需仔细考虑的权衡项。

  • 最显著的限制是运行时依赖。进行中请求的去重需要具有共享内存状态的单一权威所有者。如果没有按键单例执行,就无法整洁地实现该模式。如果试图使用最终一致性的键值存储来模拟它,必然会导致轮询、分布式锁或其他形式的协调,从而破坏原有的简洁性。

  • 实现本身可能是平平无奇的。虽然最小化示例很小,但生产就绪版本必须考虑错误传播、重试、超时、驱逐和内存限制。必须小心确保失败的计算不会使系统处于永久的“进行中”状态,并且缓存的响应能够正确失效。

另一个重要的考虑因素是相关性。在许多架构良好的系统中,重复的进行中请求已经很少见了。幂等的上游 API、自然地请求分散或粗粒度的缓存可能使进行中请求的去重变得无关紧要。在这些情况下,引入该模式可能会增加复杂性,而不会带来有价值的好处。

还有一个就是扩展方面的权衡。将给定键的所有请求路由到单一所有者引入了一个自然的序列化点。对于单个键非常热门的工作负载,这可能会成为瓶颈。在这些情况下,分片策略或替代缓存方法可能更合适。

最后,该模式并不替代传统的缓存策略。它是对它们的补充。已完成的响应可能仍需要持久化在键值存储或 HTTP 缓存中,以在进程驱逐或冷启动时生存下来。然而,关键在于,持久化应该只适用于已完成的结果,将进行中的状态移入外部存储会抵消该方法的好处。

因此,该模式应被视为一种针对性的优化,而非默认的架构选择。如果运行时支持它并且工作负载证明它是合理的,那么统一响应缓存和进行中请求去重可以显著减少冗余工作。当这些条件不满足时,更简单的设计通常会更明智。

结论

本文概述了一个在分布式 JavaScript 运行时中统一响应缓存和进行中请求去重的模式:通过依赖于按键单例执行和共享内存状态,可以将正在进行的计算及其最终结果视为同一缓存条目的两种状态,从而消除重复性的工作,而无需引入轮询或外部协调。

需要强调的是,这种模式主要是一种设计提案,而不是经过实战验证的方案。虽然底层原语(Durable Objects、Promise 和串行执行)是众所周知的,但这里描述的组合尚未在生产系统中得到广泛验证。关于运维行为、可观测性和长期性能特征的问题仍然存在,并且需要进一步探索。

尽管如此,该模式的价值可能在于它清晰地揭示了缓存与执行之间的关系。它表明,进行中请求去重的困难并非分布式系统所固有的,而是我们通常使用的执行模型所致。当运行时能够为每个键提供单一的权威所有者时,问题就大大简化了。

随着无服务器和边缘平台的不断发展,有状态执行模型变得越来越普遍。这样的模式表明,重新审视长期以来的假设,比如,缓存和协调之间的严格分离,可能会产生更简单、更具表现力的设计。无论这种特定方法是否证明了广泛的实用性,还是仅仅作为一种小众优化存在,它都凸显了未来运行时和应用架构的重要方向。

原文链接:

https://www.infoq.com/articles/durable-objects-handle-inflight-requests/

如果你曾经值过班,那么你肯定知道这么一种情况。凌晨两点,电话打来,你猛然惊醒,抓起笔记本电脑开始排查。你先是检查服务仪表板,接着是分析依赖关系图,然后是查看日志,最后再查看来自三个不同监控工具的指标。半小时后你发现,这不过是虚惊一场:阈值设置过严,金丝雀部署触发了可以自动恢复的告警,或是网络瞬态波动导致了短暂峰值。

 

但你不能就这样回去睡觉。你得等等,观察一下。你必须确保告警窗口干净利落地关闭了,而且没有任何其他告警被触发。等你确信问题已经真正解决时,你已经失去了一小时的睡眠时间,更大的问题是几乎睡意全无。

 

这种场景在各地运维团队中屡见不鲜。我们不断地调整告警阈值,试图找到一个完美的平衡点:过于敏感会被误报淹没,过于宽松则会错失真实事件。这种动态变化会导致告警疲劳——工程师被大量无需处理的告警淹没。随着时间推移,这会削弱人们对告警的信任度,并降低对真实问题的响应速度。关于告警疲劳的研究表明,这种响应迟滞现象普遍存在:安全监控领域的调查发现,超过半数的告警属于误报,而 IT 运维领域也呈现出类似的模式。这并非配置问题,而是监控复杂分布式系统时面临的一个根本性挑战。

 

为了优化告警规则,团队经常要花费无数个小时,他们应该这样做。但根本问题仍然存在:我们需要监控的范围超出了我们手动维护和解释的能力。

 

我们不愿谈论的监控悖论

 

对于现代系统,一个现实是它们会一直不停地增长。每增加一个新功能都会有更多的日志需要解析,更多的指标需要跟踪,更多的仪表板需要维护。最初简洁明了的架构与直观的监控,逐渐演变成了一个需要持续投入精力的庞大的生态系统。

 

随着系统的增长,维护负担也在增加。仅仅是保持可观测性基础设施的更新就需要花费团队大量的时间。新服务需要配置监控工具,仪表盘需要持续更新,流量模式变化时需要调整告警阈值。依赖关系不断变化,监控方案也必须随之调整。虽然这些工作都是例行公事,却也不可或缺,它们消耗了本可用于开发功能或提升可靠性的宝贵时间。

 

一个典型的微服务架构会产生巨量的遥测数据:来自数十个服务的日志,来自数百个容器的指标,跨多个系统的跟踪信息。当事件发生时,工程师会面临一个相关性问题:哪些信号至关重要?它们如何关联?近期发生的哪些变化可能解释这种行为?

 

AI 队友加入

 

初次接触可观测性 AI 代理的概念时,我是持怀疑态度的。这听起来像是供应商炒作与流行词汇的结合体。但随着技术的日趋成熟,早期应用方案的陆续出现,其潜力正变得越来越清晰。

 

关键转变在于将这些系统视为队友而非替代者。具体而言,这些队友擅长处理事件响应中人类厌烦的那些环节:在海量数据集中进行模式匹配,记住以往的每一个事件,并在周二凌晨两点保持警觉。

 

智能可观测性意味着你的监控系统不仅仅是收集指标和触发告警,还要能理解它所看到的信息。它能够:

 

  • 留意不符合常规模式的现象:不仅仅是超出阈值,还有行为中那些微妙的变化,在情况变得严重之前发现事情不对劲。

  • 串联技术栈中的各个点,将数据库延迟峰值与那些认证错误和六小时前的部署关联起来。

  • 生成有实际用处的错误信息摘要。想象一下,提供这样的错误信息,“在下午 2:15 部署后,认证服务延迟增加了 200%;与新的 Redis 连接池配置相关”,而不仅仅是“错误率超过阈值”。

  • 记住制度性知识。每一个事件都能教会可观测性代理一些东西。关于缓存的那个奇怪问题?代理会记住你是如何修复的,并在下次出现类似的问题时提供建议。

  • 在规定的范围内采取行动。在适当的监督下,智能可观测性可以执行你基于定义好的策略预先批准的安全补救步骤。

 

传统监控与这种方法的区别在于:一个只发出告警,而另一个会分析告警的含义。传统监控告诉你有东西越过了阈值。代理辅助的可观测性会帮助解释发生了什么变化,可能与什么相关,以及接下来应该查看什么。

 

生产环境中究竟发生了什么

 

向智能可观测性的转变改变了工程工作开展的方式。在每次处理事件时,工程师不用首先花二十分钟手动在仪表板上关联日志和指标,而是可以审查 AI 生成的事件摘要,其中链接了部署时间、错误模式和基础设施变化。事件工单自动填充了上下文信息。根因分析现在从一个清晰的假设开始,而不像以前那样需要先进行广泛的调查。工程师仍然需要做出决定,但他们是基于分析数据而不是原始信号。

 

这节省了时间,减少了认知负荷,让你最好的工程师们可以把更多的时间投入到功能建设上,而不是用在救火上。

 

实际路径

 

如果你正在考虑采用智能可观测性,下面是一个分阶段采用的步骤。

 

第一阶段:只读学习

 

首先,将现有的遥测数据(日志、追踪信息、指标等)输入到一个处于观察模式的智能代理中,它会分析实时和历史数据,学习模式并标记异常,但不触发告警或执行操作。

 

这个阶段的目标是建立信任。团队看到智能代理提供了合理的建议。你捕捉到了本来可能会错过的异常。工程师们开始在深入分析日志之前查看智能代理生成的摘要信息。

 

第二阶段:启用上下文感知分析

 

这个阶段关乎让智能代理理解你特有的环境,并利用这些知识进行智能调查。它有两个协同运作的关键组件。

 

添加操作上下文

 

向智能代理提供专有知识:运行手册、服务所有权文档、架构图、依赖关系图和过往事件报告。这些信息将智能代理从一个通用的模式匹配器转变为一个理解特定系统的工具。

 

现在,当它检测到异常时,它有一个上下文。它不再简单地显示“检测到高错误率”,而是能具体说明:“(通信团队负责的)通知服务出现高错误率。该服务依赖于邮件网关和消息队列。最近部署记录:v1.8.2 版本于 3 小时前部署”。

 

启用智能关联

 

有了这个上下文,智能代理现在可以关联日志、指标和追踪信息中的相关信号。它将模式与过去的事件做匹配,并根据系统的实际拓扑和历史信息提出调查路径。

 

下面这个例子是一个成熟的智能代理生成的分析结果:

智能代理不做决定。相反,它正在做工程师手工操作通常需要 20 分钟才能完成的仪表板跳转、日志搜索及其他相关工作。它提供了一个连贯的叙事和可操作的调查步骤。

 

第三阶段:根据运营经验定义自动化

 

在观察和咨询模式下运行智能代理几周后,你会发现某些规律。有些事件会重复发生。特定的诊断步骤会反复出现。有些补救措施简单直接且风险低。这时,你就可以定义哪些工作流程在什么条件下可以自动化。

 

关键是从实际的操作经验出发,而不是理论。查看事件历史并问这样的问题:我们反复采取了哪些行动?哪些是安全且可预测的?哪些可以在低风险时段自动运行?

 

常见的自动化选项包括:

 

  • 重启不健康的 Pod 或容器,它们未能通过健康检查

  • 运行标准诊断脚本,收集分析数据

  • 流量高峰时段,在预设的边界内扩展资源

  • 在发生异常时触发日志收集或性能分析

 

但自动化需要有所限制。在启用任何自动化操作之前都应定义清晰的策略:

 

  • 何时可以自动运行?也许只在非高峰时段,或者最初只针对非关键服务,或者从不在部署窗口或主版本发布期间运行。

  • 什么需要升级?高严重性事件、面向客户的服务或代理的置信度低于某个阈值时,必须始终由人工介入处理。

  • 什么需要审计?每个自动化操作都应该记录其背后的逻辑依据、触发操作的上下文和操作结果。这有助于建立责任机制,并随着时间推移不断完善自动化规则。

  • 谁可以控制或暂停自动化?需要有一个简单的方法,让工程师可以在需要时(如维护、测试或敏感时期)禁用自动化。

 

从一两个低风险的自动化开始,观察它们在一周或两周内的表现。随着信心的建立和规则的完善,逐渐增加更多的自动化操作。我们的目标不是无人操作,而是要消除重复的劳动,使团队可以专注于需要人类判断的复杂问题。

 

集成的真实情形

 

你可能不需要替换任何东西。大多数智能可观测性平台都集成了现有的监控和可观测性工具。无论是使用开源解决方案还是商业平台,智能代理通常都可以与你当前的技术栈协同工作。

 

可以将其视为是在现有基础设施之上增加一个智能层,而不是推倒重来。

 

当它正常工作时

 

在管理平台可靠性和观察团队如何应对监控挑战时,你会发现某些特定的模式。随着组织尝试使用智能可观测性系统,往往会出现类似下面这样的改进:

 

  • 事件解决速度更快(例如,“我们的事件解决时间从平均 45 分钟减少到 18 分钟,而这仅用了三个月”)。

  • 提升值班生活质量(例如,“我现在可以一觉睡到天亮。智能代理处理日常事务,只有在遇到需要人类判断的事情时才会叫醒我”)。

  • 提升学习便利性(例如,“每个事件都会增加制度性知识。团队的新成员可以要求智能代理:‘告诉我过去的五次数据库事件是什么以及如何解决的’”)。

  • 提高主动捕获能力(例如,“在问题变成事件之前就发现并修复了它们。这种转变可能令人感到陌生,因为团队正从被动地响应事件转向主动地预防。”)。

  • 工程时间从调试转移到分析(例如,“工程师花在浏览日志上的时间减少了,花在分析模式和验证修复上的时间增加了。这切实提升了运维效率。团队从救火模式转变为真正地改善系统”)。

 

缺点

 

以下是实践中通常会遇到的几个挑战:

 

  • AI 不会在第一天就神奇地理解了你的整个系统。智能代理需要时间来学习正常的模式应该是什么样子,所以早期的建议可能会偏离目标。它可能会做出不相关的关联,或提供明显没用的建议。经过数周的学习之后,洞察力才会真正变得有价值。

  • 设置上下文比你想象的更耗时。听起来,向智能代理提供运行手册、架构文档和专有知识很简单,但从中可以看出有多少关键信息只存在于人们的头脑中或过时的文档里。预计要实实在在花些时间来组织和上传这些上下文。

  • 真实存在的学习曲线。团队需要了解如何配置、信任和验证智能代理的行为,并为此预留时间。

  • 文化阻碍。会有一些工程师不信任 AI,也会有一些人担心工作保障。直面这个问题,明确说明增强团队能力与人员替代之间的区别。

  • 调试调试器比调试系统本身更难。当智能代理判断错误时,问题可能出在信号、上下文和学习模式的组合方式上,而不是任何单一的指标或日志文件中。这会降低透明度,因此可解释性很重要。

 

一种用于评估智能可观测性的简单检查方法

 

如果不确定智能可观测性是否适合你,那么可以问下你的团队下面这些问题:

 

  • 在事件处理期间,我们是否反复运行相同的诊断命令?

  • 我们是否花费了大量的时间来关联多个工具之间的信号?

  • 误报是否导致我们错过了真正的问题?

  • 如果我们的初级工程师能够即时访问高级工程师积累的事件知识,他们是否能更快地响应事件,降低风险并减少混乱?

  • 我们是否花费了更多的时间灭火而不是预防?

 

如果有两个或更多问题的答案是“是”,你将从中获益。

 

未来展望

 

系统变得越来越复杂,数据量在不断增加,停机成本变得越来越高,而人脑并没有变得更大或更快。

 

智能可观测性的目标不是要取代工程师,而是为他们赋能:大规模地识别模式,保留以往事件的知识,并在毫秒(而非分钟)内对信息作出反应。

 

从小处开始,逐步建立信任。让系统自己证明自己。可靠性的未来不是人类也不是 AI,而是拥有 AI 的人类,使他们在工作中的表现更好。

 

也许,只是也许,我们都可以多睡一会。

 

免责声明:本文所表达的观点和意见仅代表作者个人立场,不代表其雇主机构的观点、政策或实践。所有示例和建议均基于行业普遍做法及个人经验。

 

原文链接:

https://www.infoq.com/articles/agent-assisted-intelligent-observability/

GitHub 的工程师近期排查发现,用户反馈意外出现了“请求过多(Too Many Requests)”错误,其根源在于部分滥用防护规则在触发其生效的安全事件结束后,仍被意外长期启用。

 

据GitHub说明,受影响的用户并非产生了高流量请求,只是“发起了少量常规请求”,却依然触发了防护机制。经调查,这些早期为应对安全事件制定的规则,其依据的流量特征在当时与滥用行为高度相关,但后续却开始匹配部分未登录用户的合法请求。GitHub 表示,这类检测机制结合了行业标准的指纹识别技术与平台专属的业务逻辑,而“多维度信号组合偶尔会产生误判”。

 

GitHub 还量化了这套多层级检测信号的实际运行表现。在匹配到可疑指纹的请求中,仅有一小部分会被拦截,只有同时触发业务逻辑规则的请求才会被阻断,这类请求约占指纹匹配请求的 0.5%~0.9%;而误判请求在总请求量中的占比则极低,约为每 10 万次请求仅出现数次。尽管如此,GitHub 在博文里强调,该问题对用户造成的影响仍不可接受,并以此次事件揭示了一个更普遍的运维问题:应急防护规则在安全事件发生时通常能正常发挥作用,但随着威胁模式的演变以及合法工具和使用场景的变化,这些规则会逐渐 “失效脱节”。

 

GitHub 此次复盘的核心结论之一就是,多层级防护体系会增加定位故障根本原因的难度。工程师需要跨多层基础设施追踪请求链路,才能确定拦截行为发生在哪个环节,而实际排查的难点在于,每一层基础设施都具备合理的限流、拦截权限,要定位具体是哪一层做出的拦截决策,就必须对多个采用不同数据格式的系统日志进行关联分析。

图片来源:GitHub

 

为了解决当下的问题,GitHub 对所有防护规则开展了全面复核,对比每条规则当前的拦截范围与最初设计的防护目标,移除了已经没有实际防护意义的规则,同时保留了针对现存威胁的防护措施。从长期来看,GitHub 表示正投入资源完善防护规则的生命周期管理体系,打造更完善的跨层级可观测的能力,实现限流与拦截行为的源头追踪;将应急防护规则默认设为临时生效;新增事件后复盘机制,推动应急防护规则向可持续、精准化的解决方案演进。

 

尽管 GitHub 的博文聚焦于规则生命周期管理与跨层级可观测性,但这种采用“纵深防御”架构的请求处理流水线,在其他处理互联网流量的大型平台中也十分常见。例如,Vercel公开的请求处理生命周期中提到,请求会经过其防火墙的多个防护阶段,覆盖网络层(L3)、传输层(L4)和应用层(L7),后续还会针对项目级策略增加 Web 应用防火墙(WAF)防护环节。Vercel 还指出,各防护层级间存在反馈机制,若某条 WAF 规则触发了持续性拦截动作,上游防护层会提前拦截后续的同类请求。

 

这种分层防护的设计并非仅存在于边缘流量管理领域:Kubernetes的API服务器安全模型也采用了明确的阶段式设计,准入控制器会在身份认证、授权校验完成后,数据持久化之前拦截请求,形成一套结构化的校验链路,后续可在此基础上不断叠加新的策略与安全检查规则。

 

这些案例共同揭示了大型系统中一种普遍的设计权衡:多层级防护机制能提升系统的抗风险能力与灵活性,但也会增加防护规则“脱离其设计背景,依然失效存在”的风险。GitHub 的此次经历也印证了,纵深防御体系的长期有效性,不仅取决于防护规则的部署层级,更在于随着系统与使用模式的演变,能否清晰把控每条规则的设计初衷、实际影响与生效周期。

 

原文链接:

GitHub Reworks Layered Defenses After Legacy Protections Block Legitimate Traffic

LinkedIn重新设计了其静态应用安全测试(static application security testing,SAST)流水线,以便在基于 GitHub 的多仓库开发环境中提供统一、可强制执行的代码扫描能力。该举措源于公司的安全左移(shift-left)战略,也就是通过在 Pull Request 中直接提供快速、可靠且可落地的安全反馈,增强 LinkedIn 代码与基础设施的安全性,帮助保护用户与客户。

 

从宏观层面来看,SAST指的就是通过分析源代码,在开发生命周期早期识别潜在的漏洞。在 LinkedIn 的规模下,传统方案依赖多个相互独立的扫描器与定制化集成,导致覆盖度不均、流水线健康状况可见性有限,并给开发者带来额外的负担。此次重新设计旨在标准化扫描能力、简化接入流程,并将安全更深度地嵌入开发者工作流,同时避免引入性能瓶颈。

 

在设计初期,LinkedIn 工程师确立了核心指导原则,那就是优先以开发者为中心的安全设计,最小化对工作流的干扰;具备可扩展性,允许其他团队添加规则或集成;具备高韧性,避免故障影响开发者;具备可观测性,能够在大规模场景下监控覆盖范围与性能表现。

 

新架构基于GitHub Actions进行编排,并整合了两款核心扫描引擎CodeQLSemgrep,选择它们是因为二者覆盖范围互补且易于扩展。LinkedIn 工程师实现了自定义工作流,用于管理规则执行、编排扫描流程并处理扫描结果。所有漏洞发现结果均基于SARIF标准进行规范化,并补充元数据,为开发者与安全团队提供清晰的修复指引与可落地的上下文信息。

使用 CodeQL 的 GitHub Actions 工作流的宏观概览 (图片来源:LinkedIn博客文章)

 

LinkedIn 工程师最初希望使用 GitHub Required Workflows 来强制执行安全流水线,并在数万个仓库中实现定时扫描,但该功能不支持定时任务与自动部署。因此,工作流文件必须被推送到每个仓库才能可靠地传播变更,这在大规模场景下会带来一定的挑战。

 

为了解决该问题,LinkedIn 在每个仓库中部署了轻量级的桩工作流(stub workflow),将实际执行委托给集中维护的中心工作流。这种设计使得扫描逻辑、强制策略与可观测性埋点的更新能够即时生效,无需修改单个仓库。同时,还有一套漂移管理系统(Drift Management System) 持续校验桩工作流的存在与否与配置情况,新仓库也会自动预置该文件。这套组合方案确保了 LinkedIn 多仓库环境下的统一覆盖与强制执行,在大规模场景下保持可靠性与开发者工作流效率。

 

强制机制通过GitHub仓库规则集(repository rulesets)来实现,也就是阻塞 Pull Request 合并,直到静态分析完成且漏洞处于可接受的风险阈值内。为避免扫描器故障或基础设施异常中断开发者流程,LinkedIn 构建了多重安全机制,包括紧急停止开关(kill switches)与自动降级策略。在故障场景下,系统会注入空 SARIF 报告以解除阻塞的合并请求,同时仍会采集遥测数据用于事后分析。

 

阻塞模型的流程(图片来源:LinkedIn博客文章)

 

正如 LinkedIn 的工程师所强调的:

我们从碎片化的生态系统,转向了一套统一、原生基于 GitHub 的安全流水线,在不拖慢开发者速度的前提下,提供一致的覆盖度与可落地的安全反馈。

 

该 SAST 流水线会收集详细的执行指标、故障报告与接入统计数据,使安全团队能够监控覆盖范围、可靠性与组织级影响。LinkedIn 指出,SAST 只是整体应用安全战略的一部分,该战略还包括依赖项扫描与密钥检测,共同构成一套覆盖代码与基础设施的一体化安全防护体系。

 

原文链接:

LinkedIn Leverages GitHub Actions, CodeQL, and Semgrep for Code Scanning

小区门口的理发店,下午提前和理发师通过微信沟通预约,告知所有项目加 10 元,我表示 OK 。
晚上理发完,告诉我不能用会员卡余额扣费,要现场再支付一遍,理由是财务放假了,系统关闭了。
我当场表示不合理,你个夫妻店,哪来的财务?之前理发完我亲看到就是男理发师(应该也是老板)直接扣费的。
办卡的时候不说,下午预约的时候不说,等我理完了告诉我不能用会员卡余额。这不是把顾客当猴耍吗?
由于昨晚女朋友也在现场,争吵了一番我还是付了钱走了,但过完年我还会过去理论并且要求退卡退余额。

我是天蝎+INFJ,我感觉星座和性格都挺不靠谱的。

虽然很多总结的内容观点部分感觉挺符合,但是人的思想和性格是过往经历和自身思考构成的,单纯的根据出生日期或者回答几道题目就能确认某人性格的特征感觉不靠谱。

个人感觉这类内容就是不想深入了解人,只进行贴标签分类,用简单的方式分组,快速找到合群的人,期待用简单的方式理解他人。不知道大家是什么观点?

最近,Anthropic 推出的命令行工具 Claude Code 简直火得一塌糊涂。很多程序员朋友都说,那种在终端里直接指挥 AI 改代码、跑测试的感觉,确实比网页端反复“复制粘贴”要爽得多。

但用久了,大家普遍发现一个痛点:“看不见”

你不知道 Claude 现在到底处理了多少 Token,不知道它背地里偷偷读了多少文件,更不知道它那个“大脑”任务列表进行到哪一步了。

这种感觉就像开夜车没仪表盘,心里总有点没底。

直到我发现了 Claude HUD(作者:Jarrod Watts)。它给 Claude Code 穿上了一层“外骨架”,让它从一个简单的黑框对话框,瞬间变成了科幻感十足的开发者工作站

今天,咱们就聊聊这个让无数极客直呼“真香”的神器。

claude-hud-preview-5-2.png


一、 什么是 Claude HUD?

HUD 原意是“平视显示器”,通常出现在战斗机飞行员的头盔或高端汽车的挡风玻璃上。

Claude HUD 干的也是这件事。它是一个专门为 Claude Code 设计的插件,会在你的终端底部常驻一个状态栏

有了它,你不再需要通过翻看长长的聊天记录去确认进度。它把 Claude 的运行状态、Token 消耗、正在使用的工具、甚至当前的 Git 分支,全都浓缩在屏幕最下方。

一句话总结:它让 Claude 从一个“黑盒”,变成了一个“透明盒”。


二、 为什么它比原版好用?

如果你还在犹豫要不要装,看这三个功能就够了:

  1. Context 进度条(防“宕机”神器)
    Claude 虽然强,但上下文(Context Window)是有上限的。很多时候聊着聊着,AI 开始胡言乱语,往往是因为 Token 满了。
    HUD 直接在底部给你一个电量条一样的视觉反馈。看到变红了?赶紧重启会话或者清理上下文,再也不用盲目猜测。
  2. 实时“动作监控”
    当 Claude 在执行复杂任务(比如重构整个文件夹)时,它会频繁调用 read_filegrepedit_file 等工具。
    在 HUD 里,你可以看到这些动作像流水灯一样闪过。它在读哪行代码?改了哪个文件?你一眼就能掌握全局,这种掌控感对开发者来说太重要了。
  3. 任务进度(Todo List)可视化
    给 Claude 下达一个大任务时,它会自动拆解成好几个步骤。HUD 会把这些步骤实时显示出来:
    ▸ Fix auth bug (2/5)
    这就好比进度条,让你知道它现在是卡住了,还是正在稳步推进。

三、 手把手安装教程(三步搞定)

安装过程非常顺滑,前提是你已经安装了 claude-code

第一步:添加插件市场

在你的 Claude 会话中输入:

# 这一步可能需要FQ
/plugin marketplace add jarrodwatts/claude-hud

第二步:安装插件

接着输入:

/plugin install claude-hud

(Linux 用户如果遇到报错,记得先设置一下临时目录权限,官方文档里有贴心提示)

#⚠️ 在 Linux 系统中,/tmp通常会使用单独的文件系统 (tmpfs),这会导致插件安装失败,并出现以下错误:
#EXDEV: cross-device link not permitted
#解决方法:安装前设置 TMPDIR:
mkdir -p ~/.cache/tmp && TMPDIR=~/.cache/tmp claude

第三步:初始化配置

运行设置命令:

/claude-hud:setup
# 执行后可以不进行额外配置(按ESC键取消),后续再配置

搞定!你会发现终端底部立刻亮起了一排整齐的状态栏,帅气程度瞬间提升几个档次。

image-20260211162341964.png


四、你的仪表盘,你说了算!

很多插件装完就那样了,但 Claude HUD 最骚的地方在于它的高度自定义。你只需要在 Claude 会话中输入一行神奇的命令:

/claude-hud:configure

输入这个命令后,你会进入一个“图形化”的配置菜单(就在终端里),完全不需要你去手改代码或 JSON 文件。

1. 选择喜欢的“装修风格”

  • Full(全能模式): 所有的信息全开,适合那种喜欢“掌控一切”的硬核玩家。
  • Essential(极简模式): 只保留最核心的活动状态和 Git 信息,清爽不打扰。
  • Minimal(迷你模式): 只有一个窄窄的 Model 名称和 Token 条,存在感极低。
# 默认值(2 行)
[Opus | Max] │ my-project git:(main*)
Context █████░░░░░ 45% │ Usage ██░░░░░░░░ 25% (1h 30m / 5h)
# 第 1 行— 模型、计划名称(或Bedrock)、项目路径、Git 分支
# 第 2 行— 上下文栏(绿色 → 黄色 → 红色)和使用速率限制

# 可选行(通过以下方式启用/claude-hud:configure)
◐ Edit: auth.ts | ✓ Read ×3 | ✓ Grep ×2        ← Tools activity
◐ explore [haiku]: Finding auth code (2m 15s)    ← Agent status
▸ Fix authentication bug (2/5)                   ← Todo progress

PixPin_2026-02-11_16-26-36.png

2. 细节控的福音

您也可以直接在以下位置编辑配置文件~/.claude/plugins/claude-hud/config.json

  • 想看 Git 变动? 开启 showFileStats,连改了几个文件、删了几行都能直接看到。
  • 嫌路径太长占地方? 调一下 pathLevels,只显示最后 1-2 级目录。
  • 想监控 Token 消耗? 开启 showUsage,实时盯着你的 Pro/Max 会员限额还剩多少。

配置完后,甚至不需要重启,仪表盘会根据你的选择实时变幻,这种丝滑感真的会上瘾。

PixPin_2026-02-11_16-12-24.png


五、 真实使用场景:它能帮你省多少事?

  • 场景 A:大规模重构代码
    当你让 AI 把一个旧项目的 CommonJS 全改成 ESM 时,你会看到 HUD 上的“工具活动”疯狂跳动。如果它读了不该读的 .env 或备份文件,你可以立刻中断,修正指令,避免浪费 Token 和时间。
  • 场景 B:深陷 Debug 泥潭
    当你和 Claude 缠斗了半小时还没修好 Bug 时,看一眼 HUD 的 Context Health。如果进度条已经 90% 了,说明对话太长,AI 已经变笨了。这时候果断 /clear,重新开始,往往能秒解。
  • 场景 C:多任务并行
    如果你同时在几个分支上反复横跳,HUD 的 Git Status 功能会提醒你当前在哪。配合它显示的 pathLevels,你绝不会在复杂的 Monorepo(大仓库)里迷路。

写在最后

在这个 AI 辅助开发的时代,工具的边界就是你能力的边界。

Claude HUD 并不是改变了 Claude 的智商,它改变的是你与 AI 协作的交互体验。从“被动等待结果”到“主动监控过程”,这种转变带来的不仅是效率的提升,更是心智负担的减轻。

如果你已经用上了 Claude Code,听我一句劝:这个 HUD 插件,必须安排上!

如果您觉得这篇文章有帮助,欢迎点赞、转发,让更多小伙伴告别“盲打”时代!)

去年 12 月底买了智谱的 Coding Plan ,今年 1 月初升级到了 Pro 版,升级原因是发现 Lite 版本不承诺会更新最新模型,Pro 、Max 版本的介绍是“订阅期内,享受最新旗舰模型更新”。
昨晚 GLM5 发布了,想上去试试,发现 Pro 版暂时也不支持 GLM5 模型。

各位 RTE 开发者社区的小伙伴们,这一年,我们聊 ASR、TTS、LLM,在 TEN Framework 的各种模块里反复跳跃。在代码世界里,我们习惯了将 ASR、TTS、LLM 像积木一样拼装成强大的 Voice Agent。

最近,社区偷偷搞了一件大事,我们把这些「模块」给实体化做成了新春周边盲盒大礼包(你就说这些够不够 Physical 吧?),这不只是一份新年礼包,更是一次 Voice Agent 社区内部的暗号对接。

快来猜猜里面都有些什么吧~只要你的脑洞够大或者直觉够准,这整套诚意满满的新春周边大礼包,我们就包邮送到家!

礼包贺卡写着一段开发者会秒懂的真诚祝愿。

🚨深度剧透:这盒子里到底装了啥?

看到这个充满科技感的「九宫格」了吗?每一个缩写方盒里,都藏着一件根据「技术梗」定制的实体物件。

在这里:

  • TTS 不负责合成,只负责让你入睡
  • VAD 不检测语音,只负责让你清静
  • S2S 依然是全场最贵,贵到我们只能送你一个~

为了让大家更好地发挥脑洞,我们先来打个样!

WebSocketWebSockets

盒内真身: 袜子(socks)

TTS ➡ Time to Sleep 语音合成再忙,也要准时入眠

盒内真身: 睡眠真丝眼罩

零丢包包 ➡ 不仅是致敬「沈阳站站」的趣味梗,更是对 Voice Agent 稳定交互的终极祝福

真身:镭射透明包

剩下的 7 个盒子,就看大家的「梗力值」了!

👇请听题,猜猜都是什么东西?(谜面在此):

  1. RTC: Roast the Coffee(会有什么好物?)
  2. TEN: Take a SIP(它是 TEN 的拓展能力,也是某种闲适状态?)
  3. VAD: Very Anti Dialogue(如果想屏蔽一切对话,你需要什么?)
  4. S2S: 某样「太贵了简直买不起」的神秘之物
  5. STT: Stick to Task(来自獭獭的职场叮嘱)
  6. TTD: Time to Drink(除了酒,还能是什么?)
  7. LLM: Long Last Mint(这个提示够明显了吧?)

🎁怎么玩?(奖品超厚!)

1-7 号分别都代表什么物品? 请在公众号【RTE开发者社区】本文下方评论区留下你的脑洞,我们将送出 9 套 价值不菲的新春周边盲盒大礼包!

  • 【神算奖 x 3】 猜得最准、最快的技术锦鲤。
  • 【脑洞奖 x 3】 虽然你猜错了,但我觉得你说的比我们做的更有趣!
  • 【阳光普照奖 x 3】 不想动脑子?只要留言送上纯粹的新年祝福,我们随机抽人「送福气」!

⏳活动须知

  • 活动时间: 即日起至春节假期结束。
  • 揭晓方式: 年后返工第一天(2 月 24 日)置顶评论区见!
  • 参与方式: 关注【RTE开发者社区】公众号,在本文下方评论区留言即可。

新的一年,愿大家的 Agent 永远不丢包。快去评论区开猜吧!👇

阅读更多 Voice Agent 学习笔记:了解最懂 AI 语音的头脑都在思考什么

一、 如何实现“0 月租”
很多新手最容易踩的坑就是在激活时选错了“套餐”。

激活入口: 扫你信封上的二维码或访问 giffgaff.com/activate

关键选择: 系统会疯狂暗示你选择每月 8 镑或 10 镑的“Monthly Rolling”或“Monthly plans”(即套餐)。

千万不要选这些! 请滑到页面最下方,寻找 "Pay as you go" 或者 "Top up your account with credit" 的选项。

最低充值: 目前最低起充金额通常为 10 英镑。这 10 镑会作为“余额( Credit )”存在你的账户里,只要你不产生扣费,它就永远在那里,没有月租。





二、 激活流程与注意事项
根据 2026 年初的最新反馈,流程如下:

准备工具: 一张 Visa 或 Mastercard 的外币信用卡(或者虚拟卡)。

eSIM 选项: 如果你的手机支持 eSIM (如美版 iPhone 或部分 Pixel ),现在可以直接在 giffgaff App 内操作,甚至不需要等那张邮寄半天的实体卡。







三、 每年必须做的“保号”任务
giffgaff 虽然没有月租,但要求你 每 180 天(约 6 个月) 必须有一次“余额变动”,否则号码会被注销。

最佳保号方案(成本最低):
每半年发一条短信。

操作: 用 giffgaff 卡给你的国内手机号(或其他号码)发一条短信。
格式: 发往中国需输入 0086 + 手机号。
成本: 按照最新资费,每条短信大约 0.3 镑(约 2.7 元人民币)。
提醒: 建议在手机日历里设置一个“每 150 天”循环的提醒,避免忘记。
小贴士: 接收短信是完全免费的,不论你在国内还是国外。




四、 避坑指南(防余额“偷跑”)
为了确保你的 10 镑余额能用几十年,一定要在插卡后立即做以下操作:

--> 彻底关闭移动数据: * giffgaff 在中国漫游的流量费非常贵 -> “移动数据”和“数据漫游”开关关掉。

--> 谨慎开启 iMessage/FaceTime: * iPhone 用户在插入新卡时,系统常会提示“是否激活 iMessage”。风险: 每次点“确认”,手机都会在后台偷偷发送一条国际短信到英国苹果服务器,这会直接扣掉你 0.3 镑。建议选“取消”。

--> 手动选择运营商: * 如果插卡没信号,去设置里把“自动选择运营商”关掉,手动选择 中国移动 (China Mobile)。移动的漫游信号通常比联通更稳,且更容易发出保号短信。

我太得劲儿啦,最后一天摸鱼找到 Decca 的 Ultimate 合集资源了。

The Decca Ultimate Box Set Series (170CD, FLAC)

Composer: Various
Performer: Various
Orchestra: Various
Conductor: Various
Audio CD (September 16, 2008)
Number of Discs: 170
Format : FLAC(Image, cue)
Label: Decca
ASIN: B001E2OJNW
DECCA《Ultimate》系列比较系统地介绍了世界著名古典音乐作品,比较适合初涉古典音乐的朋友收藏。该系列以每套 5 张 CD 为一个主题选集向人们呈现了古典大师们最有影响力、最为人所知的佳作,其中包括贝多芬、巴赫、肖邦、柴可夫斯基、莫扎特、门德尔松、德沃夏克、舒伯特等的选集。此外,还以类别来划分,包含了古典小提琴、大提琴、钢琴协奏曲、休闲古典、巴洛克、歌剧等专题选集。虽然这个系列中某些选曲的录音年份有些久远,但演绎者中不乏宗师级的人物,欣赏价值也是颇高的。全系列由环球公司下属的德国 EDC 压片生产,品质优良;而类似铜版画的封面设计,简约而不失典雅,每张 CD 均有独立的水晶塑料盒包装,是一个性价比很高的系列。

专辑系列
01. V.A. -《极致:拉赫玛尼诺夫选集》(Ultimate Rachmaninov)
02. V.A. -《极致:著名钢琴协奏曲选集》(Ultimate Piano Concertos)
03. V.A. -《极致:休闲古典名曲选集》(Ultimate Classical Relaxation)
04. V.A. -《极致:莫扎特选集》(Ultimate Mozart)
05. V.A. -《极致:小提琴古典名曲选集》(Ultimate Violin Classics)
06. V.A. -《极致:门德尔松选集》(Ultimate Mendelssohn)
07. V.A. -《极致:大提琴古典名曲选集》(Ultimate Cello Classics)
08. V.A. -《极致:肖邦选集》(Ultimate Chopin)
09. V.A. -《极致:巴洛克选集》(Ultimate Baroque)
10. V.A. -《极致:钢琴古典名曲选集》(Ultimate Classical Piano)
11. V.A. -《极致:巴赫选集》(Ultimate Bach)
12. V.A. -《极致:柴科夫斯基选集》(Ultimate Tchaikovsky)
13. V.A. -《极致:贝多芬选集》(Ultimate Beethoven)
14. V.A. -《极致:亨德尔选集》(Ultimate Handel)
15. V.A. -《极致:古典名曲选集》(Ultimate Classics)
16. V.A. -《极致:威尔第选集》(Ultimate Verdi)
17. V.A. -《极致:维瓦尔第选集》(Ultimate Vivaldi)
18. V.A. -《极致:瓦格纳选集》(Ultimate Wagner)
19. V.A. -《极致:芭蕾舞曲选集》(Ultimate Ballet)
20. V.A. -《极致:舒伯特选集》(Ultimate Schubert)
21. V.A. -《极致:轻松古乐选集》(Ultimate Classical Chill Out)
22. V.A. -《极致:德沃夏克选集》(Ultimate Dvoak)
23. V.A. -《极致:施特劳斯家族选集》(Ultimate Strauss Family)
24. V.A. -《极致:李斯特选集》(Ultimate Liszt)
25. V.A. -《极致:歌剧选集》(Ultimate Opera)
26. V.A. -《极致:古典吉他名曲选集》(Ultimate Classical Guitar)
27. V.A. -《极致:海顿选集》(Ultimate Haydn)
28. V.A. -《极致:辉煌古典音乐选集》(Ultimate Classical Spectacular)
29. V.A. -《极致:梦幻古典音乐选集》(Ultimate Classical Dreams)
30. V.A. -《极致:普契尼选集》(Ultimate Puccini)
31. V.A. -《极致:勃拉姆斯选集》(Ultimate Brahms)
32. V.A. -《极致:柏辽兹选集》(Ultimate Berlioz)
33. V.A. -《极致:俄国古典音乐选集》(Ultimate Russian Classics)
34. V.A. -《极致:法国古典名曲选集》(Ultimate French Classics)

你工作能力再强,能强的过主席吗?看看主席在面对同事之间分歧和矛盾的时候是怎么做的。

1929 年 6 月 22 日,中国共产党红四军第七次代表大会上,毛泽东和朱德就红军建设和领导权的问题,展开了激烈的思想交锋。

会议的前因后果我就不详细讲了,和题目无关,只说结论:朱毛二人都受到了批评,朱德予以书面警告,毛泽东予以严重警告。

下面是对毛泽东的批评内容之一:

固执己见,过分自信;不接受批评;对同志有成见,工作态度不好。

更让主席受到打击的是,同时他还落选了前委书记,这可是参会人员投票投出来的,说明啥?说明上面的那些批评是大多数人对主席当时的看法。

这让年轻的主席愤而辞职,以养病为由去了闽西革命根据地,一个叫苏家坡的小山村休养。

这个时候的他,可真是「不搞关系,不走人情,不跟领导来往,不讨好同事」到极致了。极致到啥地步呢,共产国际以为他因为身患疟疾去世了,给他发了讣告。

身处如此逆境,换个一般人早就躺平或者破罐子破摔了。

但是主席当然不是一般人。

他在苏家坡的一个山洞里,每天读书,每天思考,不停拷问自己:

为什么真理明明在自己手里,但是大部分人却并不认可你甚至要罢免你呢?

痛苦、愤怒、不甘,这些负面情绪如狂风暴雨一般压的主席喘不过起来。

忽然,一声惊雷落下,万丈光芒射出,如利箭刺破了茫茫的黑云:

想做成一件事业,一定要获得大家的支持;因此,团结大家,是必须要经历的步骤。

这 4 个月的时间,苏家坡之于主席,正如贵州龙场之于王阳明,都是经历了一番痛苦的思索,然后得出了一番超凡的智慧,最终实现了认知的升级。

回到红军后,毛泽东找到朱德、陈毅等人,承认自己过去在工作方法和态度上存在问题,对在讨论中把军、政搞成了对立承担责任。

朱老总也坦然承认了错误,对中央的指示表示接受。

就这样,一场本就只是主席和老总之间个人思维的交锋引起的,不该有的风波,最终还是平息下去了,也为未来二人携手开创出新的时代,奠定了坚实的基础。


其实这个问题,很像是我刚毕业的时候会提出的那种问题。

那时候的我也很孤傲,觉得自己什么问题都能解决,对工作中的任何人际关系都嗤之以鼻,牟足了劲想证明自己。 可实际上这种孤傲并没有帮助到我什么,反而让我在和其他部门协同的时候,碰了一鼻子灰。

他个刚毕业的小屁孩,他算老几?凭什么用这种态度给我说话?” 这是一位实在是受不了我的前辈,私下里对其他人说的话。

那份工作我也没做多久,就走人了,当然也没做出什么成果来。 后来了解到主席在苏家坡的那段经历之后,我才真正明白了,个人能力强如主席,也必须要学会怎么在工作中团结众人,把大家的心给聚在一起,因为这是一切事业的开端和基础。

麒麟桌面系统老v10和v10-sp1两个系统版本的连接有些不一样,下面分别对这两个系统进行说明

一、V10-SP1版本

  1. 打开“加入其他网络
    file
    或者从“开始” - “设置” - “无线局域网”进入也可以
    file
    file
  2. 在弹出的“查找并加入无线局域网络”窗口,配置好ssid和密钥,点击加入。(这两个必须输入,密码必须大于等于8位)
    file

二、老V10版本

  1. 鼠标点击桌面任务栏右下角网络连接图标,再点击“编辑连接”,进入网络连接页面。
    file
  2. 在网络连接页面,点击“增加”按钮。
    file
  3. 再选择连接类型,选择“Wi-Fi”,然后点击“新建”按钮。
    file
  4. 在正在编辑Wi-Fi连接1->Wi-Fi页面,在连接名称处和SSID处输入隐藏无线网络的名称,设备处选择对应的无线网卡硬件设备。
    例如:此处的无线网络名称为“ChinaNet-8312”,无线网卡硬件设备为“wlp6s0”。
    file
  5. 在正在编辑Wi-Fi连接1(此处是正在编辑ChinaNet-8312)->Wi-Fi安全性页面,在安全处选择“WPA及WPA2个人”选项,在密码处输入无线网络的密码,然后点击“保存”按钮,即可连接无线网络。
    file
  6. 如果点击“保存”按钮后,无法正常使用无线网络,则在桌面空白处鼠标右键,选择“在终端中打开”选项,打开终端,执行以下操作。

    1. 在终端输入nmcil connection show命令后回车查看所以网卡的连接信息。

    file
    从上图可知,刚才添加的无线网络“ChinNet-8312”没有连接激活。

    1. 再在终端输入nmcli connection up [无线网络名称],即此处是nmcli connection up ChinNet-8312命令后回车激活无线网络连接,会显示连接已成功激活。

    file

    1. 无线网络连接激活成功后,再输入nmcli connection show命令后回车查看所有网卡的连接信息。正常使用的网卡,连接信息显示为绿色。

    file

三、命令行连接隐藏wifi

  1. 打开终端:win + T
  2. 查看网卡,我这里是wlp2s0,后面连接需要用到

    nmcli  device

    file

  3. 查看可用的wifi设备

    nmcli device wifi list

    file

  4. 连接隐藏 Wi-Fi

    nmcli connection add \
     type wifi \
     con-name "kylintest" \
     ifname wlan0 \
     ssid "HiddenSSID" \
     wifi-sec.key-mgmt wpa-psk \
     wifi-sec.psk "YourPassword"

    上面命令的参数说明:

  5. con-name:连接名称(自定义,如 MyHiddenWiFi)。
  6. ifname:无线网卡接口(如 wlan0,可用 ip a 查看)。
  7. ssid:隐藏 Wi-Fi 的 SSID(必须正确)。
  8. wifi-sec.key-mgmt wpa-psk:使用 WPA-PSK 加密方式。
  9. wifi-sec.psk:Wi-Fi 密码。

四、查询系统之前连接过的WiFi密码

打开终端执行以下命令:

sudo  grep  -r  "psk="  /etc/NetworkManager/system-connections/

如下图所示:
file

本文由mdnice多平台发布

一、现象

麒麟V10桌面系统,开机重启之后,发现系统时间不对,与实际时间相差较大。而且单位里多台电脑出现了同样的情况,但是每一台电脑的时间都是不一样的。
file

二、处理方法

方法1:手动修改时间

sudo date -s "2025-05-30 10:20:32"

方法2:修改默认的可访问的NTP服务器

执行以下命令,修改NTP服务器为ntp2.aliyun.com,也可以根据需要修改成单位内部的NTP服务器的域名或者ip地址。

sudo  sed  -i  's|#*NTP=.*|NTP=ntp2.aliyun.com|g'   /etc/systemd/timesyncd.conf

重启一下时间同步服务systemd-timesyncd

systemctl  restart systemd-timesyncd.service

方法3:安装补丁包

(原理同方法2,修改默认的NTP服务器为阿里云服务器)

  1. 下载补丁包 [点击以下图片下载]
    <img src="https://gxxc.wiki/wp-content/uploads/2025/05/image-1748580746389.png" alt="描述文字">
    如果以上无法下载,可以访问这里下载https://gxxc.wiki/kd/6642.html
  2. 安装补丁包
    解压补丁包后,进入deb包所在目录,双击deb包安装,或者使用以下命令安装:

    sudo  dpkg  -i  fix-timesync_1.0.0_all.deb
  3. 安装完补丁包后,再查看一下时间
    file
  4. 建议将当前对的时间,同步到硬件RTC

    sudo  hwclock  -w

三、原因分析

日志显示无法连接到ntp服务器,读取硬件RTC时间
file
所以显示出不同的时间。而systemd-timesyncd 这个服务本身不会将当前系统时间时间写入硬件RTC,所以时间过去越久,硬件时间与实际时间相差越多,当系统无法从默认的ntp服务器获取到正确时间的时候,就会用硬件时间,从而时间有差异。

四、其他

systemd-timesyncd 这个服务本身不会将当前系统时间时间写入硬件RTC。所以,建议用户每过一段时间后手动将当前时间同步到硬件上,可以执行命令timedatectl查看当前硬件时间
file
如果硬件时间和当前系统时间相差较大,可以先将系统时间设置正确后,执行以下命令将当前时间同步到硬件RTC

sudo  hwclock  -w

本文由mdnice多平台发布

问题描述

将 U 盘插入电脑后,系统没有自动挂载,并且在文件管理器中看不到该 U 盘设备。经常在用ventoy做了系统启动盘的U盘上,常常遇到这个问题,请看以下解决方法。

解决办法

方法1

将U盘格式化成ext4格式后使用,注意格式化前备份U盘里的重要数据。

方法2

系统默认无法识别到exfat格式的硬盘,需要安装fuse-exfat这个软件包解决对exfat格式u盘的支持,安装命令如下:

yum  install  -y  fuse-exfat

如果服务器不联外网,可以下载安装包后,拷贝到系统上离线安装,下面是x86架构下的路径(arm的把x86_64修改成aarch64即可)

V10-SP1: https://update.cs2c.com.cn/NS/V10/V10SP1/os/adv/lic/base/x86_...
V10-SP2: https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/x86_...
V10-SP3: https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/x86_...

`有客户又说了,我的U盘都读不出来,下载后,怎么拷贝到服务器里?
这里咱们建议可以格式化U盘成其他格式拷贝,也可以通过刻录进CD盘再拷贝到服务器,或者也可以挂iso配置本地源进行安装`
 

方法3

执行 “lsblk” 命令查看是否能检测到 U 盘设备,
file
如果能检测到但未挂载,如上图所示,可以执行以下命令,将u盘挂载到/mnt目录下,用命令访问/mnt看看是否能够访问。

sudo  mount  /dev/sdb1  /mnt

这里假设 U 盘设备名为 sdb1,请根据实际情况修改;

如果以上方法还是检测不到,可能是 U 盘故障或者其他原因,可尝试更换其他 U 盘。

本文由mdnice多平台发布

麒麟桌面操作系统,如何通过命令查看笔记本电池使用情况,我们可以通过upower命令,默认安装有,如果没有该命令,可以通过以下命令安装

sudo  apt  install  upower

查看命令:

upower -i `upower -e | grep 'BAT'`

输出如下:

本文由mdnice多平台发布

秒杀活动时系统在干什么 PHP 高并发场景优化指南

秒杀活动是电商平台的关键战役,往往会带来流量和订单的剧烈飙升。秒杀期间,每一毫秒都很关键,后端需要同时扛住海量请求。对 PHP 应用来说,这尤其有挑战性,但只要优化到位,即使流量洪峰来了,用户体验也能稳住。

这篇文章会拆解 PHP 后端在秒杀期间需要做哪些事情:从数据库查询优化,到缓存管理,再到应用扩容。

用负载均衡应对高并发

秒杀期间,PHP 应用需要动态扩容来承接激增的流量。负载均衡是把请求分散到多台服务器的核心手段。

负载均衡 + 自动扩容

流量暴涨时,PHP 应用应该部署在负载均衡器(比如 AWS ELB 或 NGINX)后面,由负载均衡器把请求均匀分发到多台应用服务器。

工作原理:

  • PHP-FPM 工作进程:每台 PHP 服务器通过 PHP-FPM(FastCGI 进程管理器)处理请求。负载均衡器确保请求被分散到多台服务器,避免单台服务器被打垮。
  • 自动扩容:流量上来后,AWS EC2 Auto Scaling 或 Google Cloud Compute Engine 等云服务会自动拉起更多 PHP 实例来承接负载。

配置自动扩容:当 CPU 使用率或请求量超过阈值时触发扩容。

aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name php-flash-sale-group \
  --min-size 2 --max-size 50 --desired-capacity 10 \
  --vpc-zone-identifier subnet-xyz

负载均衡器配置:确保请求被高效地分发到所有 PHP 服务器。

upstream php_backend {
    server php-server-1;
    server php-server-2;
    server php-server-3;
}
server {
    location / {
        proxy_pass http://php_backend;
    }
}

通过负载均衡加自动扩容,PHP 后端可以平滑地应对秒杀期间的流量洪峰。

缓存策略:减轻数据库压力

秒杀期间最大的挑战之一,就是防止数据库因为大量读写操作变成瓶颈。最有效的手段是用缓存来分担数据库查询,同时提升响应速度。

缓存静态内容和数据库查询

CDN 缓存静态资源

图片、CSS、JavaScript 这类静态资源应该通过 CDN(比如 Cloudflare 或 AWS CloudFront)在边缘节点缓存,保证用户能快速加载。在 PHP 中设置合适的缓存控制头:

header("Cache-Control: public, max-age=3600");  // Cache static assets for 1 hour

内存缓存热点数据

用 Redis 或 Memcached 缓存频繁查询的数据,比如商品库存和价格,减少数据库压力。

秒杀期间,把商品库存状态存到 Redis 里,每次查库存就不用打数据库了:

$redis = new Redis();
$redis->connect('localhost', 6379);
// Check if product availability is cached
$productId = 123;
$productAvailability = $redis->get("product:{$productId}:availability");
if (!$productAvailability) {
    // Cache miss, fetch from database
    $productAvailability = fetchProductAvailabilityFromDb($productId);
    $redis->set("product:{$productId}:availability", $productAvailability, 3600);  // Cache for 1 hour
}

这样可以大幅减少秒杀期间的数据库查询次数,用户的响应速度也更快。

优化数据库性能

数据库性能往往是秒杀场景的瓶颈所在,特别是大量请求同时读写数据库的时候。优化查询、确保 PHP 应用高效处理数据库操作至关重要。

分库分表

分库分表是把数据库拆分成更小、更易管理的部分,每个部分只处理一部分数据,从而把查询分散到多个数据库实例上。

比如可以按用户地区分库(北美用户和欧洲用户各用一套数据库),以此均衡负载。

连接池

每次请求都开关数据库连接会带来很大的开销。通过连接池复用数据库连接,可以显著降低这部分消耗。在 PHP 中,可以配置持久连接:

$mysqli = new mysqli("p:localhost", "username", "password", "database");

读写分离

如果用了数据库主从复制(比如 MySQL Replication),可以配置 PHP 应用把读查询发到从库,写查询发到主库:

$readDb = new mysqli('read-replica-host', 'username', 'password', 'database');
$writeDb = new mysqli('primary-db-host', 'username', 'password', 'database');

查询优化

秒杀期间要确保数据库查询经过优化:对高频查询字段(比如商品 ID、分类等)建好索引。在 PHP 中使用预处理语句可以提升查询执行效率:

$stmt = $mysqli->prepare("SELECT * FROM products WHERE id = ?");
$stmt->bind_param("i", $productId);
$stmt->execute();
$result = $stmt->get_result();
$product = $result->fetch_assoc();

通过分库分表、连接池、读写分离和查询优化,可以防止数据库成为瓶颈,保证 PHP 应用在秒杀这种高并发场景下依然跑得动。

会话管理和用户认证

秒杀期间,用户能不能顺利加购、结账、登录,直接决定了转化率。会话管理必须针对高并发做优化。

用 Redis 做会话持久化

用 Redis 存储会话数据,这样即使请求被负载均衡器分发到不同的 PHP 服务器上,会话也不会丢失:

// Store session data in Redis
session_set_save_handler(new RedisSessionHandler($redis), true);
session_start();

用 JWT 做无状态认证

用户登录和认证环节,可以用 JWT(JSON Web Token)来减轻会话存储的压力,实现无状态认证:

// Example of generating JWT token
$payload = ['user_id' => $userId, 'exp' => time() + 3600];  // Expires in 1 hour
$jwt = JWT::encode($payload, $secretKey);

把会话数据交给 Redis,认证环节用 JWT,就能保证秒杀期间的登录和会话管理又快又稳。

实时库存管理

秒杀期间,库存必须随着商品售出实时更新。PHP 需要确保库存数据在多台服务器之间保持同步,一旦有人下单,库存立刻扣减。

事件驱动架构处理库存更新

通过 Apache Kafka 或 RabbitMQ 实现事件驱动架构,实时处理库存变更:

// Kafka Producer: Send product purchase events
$producer->produce('product-purchased-topic', 0, json_encode(['product_id' => 123, 'quantity' => 1]));

库存服务订阅这些事件,实时更新数据库中的商品库存。用户下单后,购买事件发送到 Kafka,库存服务收到事件后立即扣减库存,其他用户就不会再买到已经卖完的商品。

总结

秒杀期间保证 PHP 应用的性能,需要多管齐下:负载均衡、缓存、数据库优化、实时库存管理,缺一不可。通过自动扩容、Redis 内存缓存、高效的数据库查询和事件驱动架构,PHP 应用完全有能力扛住流量洪峰,给用户提供流畅的体验。

把这些手段用好,你的电商平台就能顶住秒杀的压力,不宕机、不卡顿,把转化率拉到最高。

秒杀活动时系统在干什么 PHP 高并发场景优化指南

推荐合作

绝地潜兵 2
开太空舰船到不同星球执行任务的设定很有氛围感, 在不同种族的星球执行任务时, 可以自由搭配不同的装备, 这种组合十分丰富.

双影奇境
通过科幻和奇幻两位作家不同风格的设定, 能更好的将差异化很大的有趣玩法缝合在一起, 在叙事上就不会非常割裂. 推荐给所有喜欢玩游戏的人.

无主之地 3
FPS 刷子游戏, 枪械词条和技能的组合.

夜族崛起
俯视角生存建造 ARPG, 吸血鬼题材设定, 吸食不同生物血型会获得对应特性. 头目和战斗设计十分出色. 可自建服务器加快游戏节奏.

木筏求生(Raft)
海上的生存建造探险游戏. 在海上的设定就是带着家在旅行, 规避了传统生存游戏安家选点多个家的问题.

护核纪元
俯视角像素游戏 (缝合了我的世界, 泰拉瑞亚, 饥荒, 星露谷的一些玩法). 引导一般, 还是需要看攻略.

泰拉瑞亚
2D 横板像素的生存, 探索, 建造. 引导一般, 还是需要看攻略.

超级马力欧兄弟 惊奇
可爱画风, 合作合家欢.

地痞街区
俯视角像素游戏, 通过不同角色技能和道具的组合, 完成随机生成的地图和任务. 美式黑色幽默很好.

GTA V
犯罪题材游戏, 高开放度. 故事模式人物刻画很好. 线上模式推荐和朋友一起完成各种任务.

双人成行
故事设定为一对夫妻闹离婚, 身体突然变成两个小玩偶, 以微缩小人的形态在家里探索变回原形的故事. 其实就是旅程上参杂各种合作小游戏.

Apex Legends
角色有各自技能的 FPS 大逃杀游戏, 无可替代的手感和碎甲反馈.

禁闭求生
小朋友缩小到蚂蚁大小, 在家中的后花园探险的生存建造游戏.

三位一体 4
横板卷轴解密, 利用不同角色能力解密闯关.

莫塔之子
俯视角像素合作 ARPG.

推荐单人

塞尔达旷野之息/王国之泪
惊艳的自由度, 舒适的画风及配乐.

超级马力欧 奥德赛
精致箱庭, 有趣的让人会心一笑.

圣剑传说 Visions of Mana
幼态童话风格, 类原神的游戏. 虽然没有平滑的转身设计, 攻击方向和移动方向锁定, 但瑕不掩瑜, 战斗很棒的 JRPG. 能感受到简化了很多同类游戏的一些游玩痛点, 流程上玩起来十分丝滑.

二之国 2 亡灵王国
吉卜力风格, 精致的 JRPG. 要是优化一下闪避就更好了.

歧路旅人
精品像素回合制战斗游戏. 绝对顶级的游戏配乐!

星露谷物语
精致的像素与配乐, 理想的农牧矿场生活.

奇异人生
女主大学生拥有了时间回溯能力, 时间线上不同的选择都会影响后续的发展, 优秀剧情与演出. 没有完美的选择, 不同时间线上的女主甚至会责怪女主, 明明没有做任何努力, 却在回溯时间后便能做出正确的选择, 你凭什么呢?

哈迪斯 2
俯视角 ARPG, 战斗手感非常不错.

极品飞车系列 21/22
及妙的摄像头运镜, 带来爽快的飙车竞速体验.

对马岛之魂
优秀的调色.

埃尔登法环
暗黑魂系. 主打一个打不过就绕道.

集合啦!动物森友会
可爱治愈.

灵魂摆渡人
泪目治愈.

上古卷轴 5:天际
不错的代入感.

格兰蒂亚秘闻
季节地图和时间谜题设计出色, 经典的像素 ARPG.

源: p2gg.com/game