▶ Cinematic fable · Watch on YouTube ▶ 影片版寓言 · 在 YouTube 观看

九曲坞在山坳里,只有一台水磨。

磨在渠尾。渠水从后山下来,绕九道弯,进磨坊的时候已经没什么脾气了。一块磨盘,一天碾六十袋谷子,不快不慢。

村里八十四户人家。秋收之后,每家背一袋来,排队,碾完,背回去。最长的一次,队伍排到村口的大槐树下,等了半个时辰。老穆磨了四十年,他有一杆秤,一袋谷子收一勺当磨钱。

老穆常跟孙子阿秤说一句话:磨的性子是死的,人的性子是活的。

七月初五那天早上,渠里卡了块石头。

石头不大,一只手掌那么大,是后山塌下来的一角。水过不去,磨盘转得慢了半拍。一个上午,只碾了二十袋。

排队的人就长了。队伍转过山弯,看不见头。

站在队尾的是陆家媳妇。她本来只背一袋,是这一季的口粮。她抬头看了看那条转过山弯的队伍,把手里的布袋往地上一放,转身朝家里喊:把西屋那两袋也背来。

她男人说:那两袋是留着过冬的。

她说:现在不碾,到了冬天还排得上吗?

她就背了三袋回来。

排在前头的王家老太太看见了,回头也让儿子回家去背。再前头姓周的看见了,也打发孙子回去。

到晌午,队伍一个人也没多,可队伍里的谷子变成了三倍。

每个人都只多背了两袋,每个人都觉得自己是唯一一个这么想的人。

— —

石头是当晚被人摸黑掏出来的。

第二天早上,渠水照旧,磨盘照旧,一天六十袋。

队伍还是三里长。

老穆站在磨坊门口看了半天,回屋把账翻出来。八十四户,一户没多。没有人搬进坞里,没有人租了新地,谷子还是那批谷子——变的只是每户背几袋。

到了秋天,这是他唯一看得见的事:队伍长,人心就慌;人心一慌,就多背;多背,队伍更长。这个圈子不需要外人来推,它自己会转。

老穆先试了一个最直觉的办法:再装一块磨盘。

第二块磨盘装上,一天碾一百二十袋。队伍两天就见了底。老穆松了口气。

到了第五天,队伍又长回了山弯。因为人心看见磨快了,就敢再多背两袋。饼大了,嘴跟着大。

他又试第二个办法:昼夜不停地磨。

磨了三天三夜。第四天,一袋谷子被他碾成了一半的粉——筛子过不去,人家背回来重碾。磨坊里堆起了等着重碾的袋子,那些袋子也排在队里,也占一份工。

他越磨,活越多。

到第七天,老穆坐在门槛上,跟阿秤说:石头早没了,水是够的,磨盘也是好的。这条队伍怎么就不死?

阿秤那几天一直在门口用炭在木板上画道道。他画了三条:每天来多少人,每人背几袋,队有多长。

三条线一起动的时候,他看见一件怪事:来的人数是一条平直的线,八十四,从头到尾没动过。可队的长短和背的袋数,像两条互相搀着走的腿——一条动,另一条就动,谁也停不下来。

他跟爷爷说:磨坊没有病。磨坊是站在一个坏地方。那个地方很稳,稳得能站一辈子。

老穆听懂了半句。他问:那怎么把它推出来?

阿秤说:不能靠磨。得靠袋子。

— —

第二天,老穆在磨坊门口立了一块新牌子,三行字。

一户一天一袋,多背的不收。

谁派人来队里打听自己的位置,那个人今天排到最后。

院子里堆的谷子超过一天的活,关门,明天再开。

村里骂了三天。

第四天,骂声小了。因为队伍从山弯退回了大槐树。

第七天,队伍退到了磨坊的墙根。

第九天,没有人排队了。磨盘还是那块旧磨盘,一天还是六十袋,渠里一滴水都没有多。

— —

后来村里人问阿秤:那块石头到底做了什么?

阿秤说:石头什么都没做。石头只是让那条队,在一个下午里长过了第三个弯。

第三个弯才是那件事真正的门槛。九曲坞的队平常也排,排过第一个弯,排过第二个弯,人心都是平的。可队一旦长过第三个弯,人就开始想冬天。想到冬天,就多背两袋。多背两袋,队就永远在第三个弯外面。

同一条路,同一个弯。往这边走是排队,往那边走是绝路。

所以真正要防的不是石头。石头年年都有,渠里总会有东西掉下来。要防的是那条队有没有机会长过第三个弯——长过去了,你把石头掏出来、加一块磨盘、熬三个通宵,都推不回来;没长过去,一颗石头就只是一颗石头。

老穆把那块木牌留在了磨坊门口,没拆。

有人问他:水好的年景,何必还守着一户一袋。

老穆说:规矩不是在难的时候立的,是在好的时候立的。难的时候,你立不住。

到这里你可能已经认出来了:这就是 Metastable Failure(亚稳态失效)。

这是什么

Metastable failure 是分布式系统里的一类失效:系统没有坏掉任何一个零件,却在一次很轻的触发之后,被自己产生的负载推进了另一个同样稳定的坏状态;而且触发消失之后,它回不来。

它需要三个部分同时成立,缺一不可:

  • 触发(trigger)。一个短暂、通常很小的扰动:一次慢查询、一次 leader 切换、一段网络抖动、一台机器重启。单独看,它无害。
  • 持续效应(sustained effect)。一个随负载增强的效应。负载越高,每个请求越慢、越容易超时、越容易失败。
  • 正反馈回路(amplification)。系统变慢之后,客户端和上游自己制造出更多工作:重试、超时重发、重复查询、刷新、批量补偿、缓存失效后的回源。这些额外工作又让系统更慢,回到第二步。

关键在回路增益大于 1。如果每次变慢只换来不到一份的额外工作,回路会衰减,触发过去系统就自己缓过来——那只是一次抖动。可一旦增益大于 1,系统就有了两个稳定点:健康态,和一个”慢到刚好能维持自己继续慢”的态。两个都稳定,中间有一段滞后(hysteresis):进得去,出不来。

真实事故里的放大器,来去就那么几种:

  • 重试风暴。客户端超时就重试,重试让服务更慢,更多请求超时。如果重试没有全局预算,一次故障的重试量可以是原始流量的好几倍。
  • 队列与超时的不动点。队列变长 → 等待变长 → 客户端超时并重发 → 队列更长。很多系统在这里有一个数学上的不动点:排队时间正好等于客户端超时时间。到了那个点,放多少容量进去都会被吞掉。
  • 控制面放大。数据面变慢,健康检查开始失败,路由被摘掉又加回;控制面的心跳、重连、列表刷新一起暴涨。
  • 冷缓存回源。缓存被压垮后大面积失效,所有请求回到源站。源站本来只需要承担百分之一的流量。
  • “检查”型请求。客户端反复询问”我这件事到哪一步了”。这些查询本身占用同一批资源,而且不解决任何问题。

所以它的处置逻辑和普通故障方向相反:

  • 不能只加容量。容量提升通常会被回路吃掉——系统在更大的规模上重新回到同一个坏状态。除非提升幅度足够大并且能持续,否则只是给回路添柴。
  • 必须降载。撤掉放大器(重试预算、请求去重、合并、把检查型查询挡在外面),然后主动丢弃一部分请求(load shedding、admission control),把系统推回健康态的吸引域。
  • 用比例而不是次数限制重试。retry budget:重试总量不超过原始请求量的一个小比例(比如 10%),全局生效,而不是每个客户端各自重试三次。
  • 在好的时候就立规矩。等系统已经进入坏状态再收紧策略,往往施不上力——那时候每一个降载动作本身都在引起客户端更多动作。

它和几个相近概念的区别值得说清:backpressure 是”把压力往回传”,是一个信号机制;circuit breaker 是”对某个依赖熔断”,是一个局部开关;而 metastable failure 描述的是整个系统作为一个动力学系统的第二个稳定点。症状是”每个零件都正常”,本质是”回路在维持自己”。

为什么重要

大规模系统的容量规划普遍假设:负载和用户数是同一件事。metastable failure 打破的正是这个假设——负载可以由系统自己的降级行为生成。

这解释了一批最让人困惑的线上事故:事故开始时有一个小触发;事故中所有组件的指标都在”正常范围内”;触发早已消失;系统几小时甚至几天回不到正常;加机器没有用。事后复盘时,人们翻遍每个组件的日志,因为每个组件都确实没坏。

它也改变了事故响应的顺序。常规反应是”查哪个组件坏了”。亚稳态里没有坏组件,继续找会一无所获;正确的第一反应是”现在哪一类工作在自我放大”,然后把它砍掉。这个顺序反过来,事故就会被拖长——因为每多查一分钟,放大器都在多转一分钟。

最后它解释了为什么恢复要靠降载,而不是靠等待。很多人以为”等触发过去就好了”,而亚稳态的定义就是触发过去也不会好。系统需要被推回去,而推的方向是减,不是加。

隐喻对应表

  • 九曲磨坊 → 系统;磨盘与渠水 → 正常的处理能力
  • 八十四户、一户一袋 → 稳定的基线需求
  • 渠里的石头 → 轻量触发(一次慢查询、一次切换、一次抖动)
  • 磨盘慢了半拍 → 触发造成的临时降级
  • 队伍转过第三个弯 → 越过临界点,进入正反馈的吸引域
  • 陆家媳妇多背两袋 → 客户端侧的工作放大(重试、批量补偿、重复请求)
  • 队伍长 → 人心慌 → 多背 → 队伍更长 → 正反馈回路,增益大于 1
  • 石头被掏出来、队伍仍三里长 → 触发消失而系统停在坏状态;这是亚稳态的定义性特征
  • 一块磨盘变两块 → 加容量;回路在更大规模上重建
  • 碾碎谷子、要重碾 → 过载下质量下降,制造额外返工,成为第二级放大器
  • 不许打听位置 → 抑制”检查型”请求的放大
  • 一户一天一袋 → admission control 与工作配额
  • 院子超过一天就关门 → load shedding,主动丢弃以跌回健康态
  • 不能靠磨,得靠袋子 → 恢复靠降负载,不靠加容量
  • 好年景也守着牌子 → 策略要在健康态建立;坏态下施不上力
  • 石头年年都有 → 触发不可避免;要防的是越过临界点

In the hollow of Nine Turns there was one water mill.

It sat at the tail of the channel. The water came down off the back hill, wound through nine bends, and arrived at the mill with most of its temper already spent. One stone, sixty sacks a day, no faster and no slower.

Eighty-four households lived in the hollow. After the autumn harvest, each brought one sack, queued, waited for the flour, and carried it home. The longest line anyone remembered reached the great locust tree at the village mouth and waited half a day. Old Mu had turned that stone for forty years. He kept a balance scale and took one scoop of grain per sack as the milling fee.

He used to tell his grandson, Ah Cheng: the mill’s temper is fixed. People’s tempers are not.

On the morning of the fifth of the seventh month, a stone caught in the channel.

It was not large, the size of a palm, a corner that had come down off the back hill. The water could not get through, the stone turned at half speed, and by noon only twenty sacks had been ground.

So the line grew. It turned the bend in the road, and you could not see the end of it.

At the tail of the line stood the Lu family’s wife. She had brought one sack, her grain for the season. She looked up at that line turning the bend, set her sack on the ground, and called back toward her house: bring the two from the west room as well.

Her husband said: those two are for winter.

She said: if we don’t grind now, will there still be a place in line by winter?

So she carried three sacks back.

The Wang family’s grandmother, ahead of her, saw three sacks and sent her son home for more. Old Zhou, ahead of her, sent his grandson.

By noon the line had not gained a single person, and the grain in it had tripled.

Everyone had added two sacks. Everyone believed they were the only one who had thought of it.

— —

That night someone groped in the dark and pulled the stone out.

The next morning the water ran as before, the stone turned as before, sixty sacks a day.

The line was still three li long.

Old Mu stood at the mill door a long while, then went in and opened the ledger. Eighty-four households, not one more. Nobody had moved into the hollow. Nobody had rented new ground. The grain was the same grain. What had changed was how many sacks each household carried.

By autumn it was the only thing he could see clearly: a long line frightens people, frightened people carry more, and more grain makes a longer line. The circle needed no one from outside to push it. It turned by itself.

His first instinct was to add a second millstone.

Two stones ground a hundred and twenty sacks a day. The line emptied in two days. Old Mu breathed out.

By the fifth day the line had grown back around the bend. Because now that people saw the mill running fast, they dared to add two more sacks. The cake had grown, and so had the appetite.

His second attempt was to grind day and night.

Three days and three nights. On the fourth day he ground a sack into half flour — too coarse for the sieve, carried back to be ground again. Sacks waiting to be reground piled up inside the mill, and those sacks stood in the line too, and took a share of the work.

The more he ground, the more there was to grind.

On the seventh day Old Mu sat on the threshold and said to Ah Cheng: the stone is long gone, the water is enough, the millstone is sound. Why won’t this line die?

Ah Cheng had spent those days at the door with charcoal on a board. He drew three lines: how many people came each day, how many sacks each carried, how long the line was.

When the three moved together he saw something strange. The count of people was a flat line, eighty-four, never once moving. But the length of the line and the sacks per household moved like two legs holding each other up — one stepped, the other stepped, and neither could stop.

He told his grandfather: the mill is not sick. The mill is standing in a bad place. That place is steady. Steady enough to stand in for a lifetime.

Old Mu understood half of it. He asked: then how do we push it out?

Ah Cheng said: not with the mill. With the sacks.

— —

The next day Old Mu raised a new board at the mill door, three lines on it.

One sack per household per day. More than that is not accepted.

Anyone who sends a runner to ask his place in the line goes to the back today.

If the yard holds more than one day’s work, the gate closes and opens again tomorrow.

The village cursed him for three days.

On the fourth day the cursing quieted, because the line had retreated from the bend to the great locust tree.

On the seventh day it had retreated to the mill wall.

On the ninth day no one was queuing at all. The same old stone, sixty sacks a day, not one drop more water in the channel.

— —

Later the village asked Ah Cheng what the stone had actually done.

Ah Cheng said: the stone did nothing. The stone only pushed the line, in a single afternoon, past the third bend.

The third bend was the real threshold. Nine Turns queued in ordinary times too. It queued past the first bend, past the second, and people’s hearts stayed level. But once the line passed the third bend, people began to think about winter. Thinking about winter, they added two sacks. Adding two sacks, the line stayed outside the third bend forever.

One road, one bend. Walk this side of it and you are queuing. Walk the other side and there is no way back.

So the thing to guard against was never the stone. There is a stone every year; something always comes down into the channel. The thing to guard against is whether the line gets a chance to pass the third bend. Once it has, you can pull out the stone, add a millstone, grind three nights through, and it will not come back. Before it has, a stone is only a stone.

Old Mu left the board at the mill door. He never took it down.

Someone asked him: in a good year with good water, why keep to one sack a household?

Old Mu said: rules are not made in hard times. Rules are made in good times. In hard times, you cannot make them stand.

By now you’ve probably recognized it: this is Metastable Failure.

What it is

A metastable failure is a class of failure in which no component of the system is broken, yet a very light trigger pushes the system, through load it generates itself, into a second, equally stable bad state — and it does not return when the trigger disappears.

Three things must hold at once:

  • Trigger. A brief, usually small disturbance: one slow query, one leader election, a burst of network jitter, one machine restarting. On its own it is harmless.
  • Sustained effect. An effect that strengthens with load. The more load, the slower each request, the more likely to time out, the more likely to fail.
  • Positive feedback (amplification). Once the system is slow, clients and upstreams manufacture more work: retries, resends after timeout, duplicate queries, refreshes, batch compensation, cache misses falling through to the origin. That extra work makes the system slower still, and the loop closes.

The essential condition is loop gain greater than one. If each slowdown buys less than one extra unit of work, the loop decays and the system recovers once the trigger passes — that was only a wobble. Once the gain exceeds one, the system has two stable points: healthy, and a state that is “slow just enough to keep itself slow.” Both are stable, and between them lies hysteresis: you can get in, and you cannot get out.

The amplifiers seen in real incidents are few and recurring:

  • Retry storms. Clients time out and retry; retries make the service slower; more requests time out. Without a global retry budget, one incident’s retry volume can be several times the original traffic.
  • The queue-timeout fixed point. Longer queue → longer wait → client timeout and resend → longer queue. Many systems have a mathematical fixed point here where queueing delay equals the client timeout exactly. At that point, any capacity you add gets swallowed.
  • Control-plane amplification. The data plane slows, health checks start failing, routes are removed and re-added, and heartbeats, reconnects, and list refreshes all spike together.
  • Cold-cache origin stampede. A crushed cache fails broadly and every request falls to the origin, which was designed to carry one percent of the traffic.
  • “Checking” requests. Clients repeatedly asking “where is my thing now?” Those queries consume the same resources and solve nothing.

Its handling runs opposite to an ordinary outage:

  • Capacity alone will not fix it. Added capacity is usually eaten by the loop; the system re-enters the same bad state at a larger scale. Unless the increase is large enough and sustained, you are only feeding the loop.
  • You must shed load. Remove the amplifiers (retry budgets, request deduplication, coalescing, blocking check-type queries), then deliberately drop some requests (load shedding, admission control) to push the system back into the healthy state’s basin of attraction.
  • Limit retries as a ratio, not a count. A retry budget caps total retries at a small fraction of original requests — ten percent, say — enforced globally, rather than each client independently retrying three times.
  • Make the rules while things are good. Tightening policy after the system has entered the bad state often accomplishes nothing, because by then every load-shedding action itself provokes more client action.

The distinction from neighbouring ideas matters. Backpressure pushes pressure back upstream; it is a signalling mechanism. A circuit breaker trips on one dependency; it is a local switch. A metastable failure describes the whole system as a dynamical system with a second stable point. The symptom is “every part is fine.” The cause is “the loop is sustaining itself.”

Why it matters

Capacity planning at scale generally assumes that load and user count are the same thing. Metastable failure breaks exactly that assumption: load can be generated by the system’s own degradation.

It explains a class of incident that otherwise makes no sense. There was a small trigger at the start. Every component’s metrics stayed inside their normal range throughout. The trigger vanished long ago. The system took hours or days to return. Adding machines did not help. In the postmortem, people read every component’s logs, because every component was in fact not broken.

It also changes the order of incident response. The conventional reflex is “find the broken component.” In a metastable state there is no broken component, and the search finds nothing. The right first question is “which class of work is amplifying itself right now,” and then cut it off. Run in the wrong order and the incident lengthens, because every extra minute of searching is another minute the amplifier keeps turning.

Finally, it explains why recovery comes from shedding load, not from waiting. The common assumption is that the system heals once the trigger passes. The definition of metastability is that it does not. The system has to be pushed back, and the push goes down, not up.

Metaphor mapping

  • The mill at Nine Turns → the system; the stone and the channel water → its ordinary processing capacity
  • Eighty-four households, one sack each → the stable baseline demand
  • The stone in the channel → a light trigger: one slow query, one failover, one burst of jitter
  • The stone turning at half speed → the temporary degradation the trigger causes
  • The line passing the third bend → crossing the tipping point into the feedback loop’s basin of attraction
  • The Lu wife adding two sacks → client-side work amplification: retries, batch compensation, duplicate requests
  • Long line → frightened hearts → more sacks → longer line → a positive feedback loop with gain above one
  • The stone pulled out, the line still three li long → trigger gone, system still in the bad state; the defining signature of metastability
  • One millstone becoming two → adding capacity; the loop rebuilds at a larger scale
  • Grinding grain to half flour, sent back for regrinding → quality collapse under overload manufacturing extra rework, a second-stage amplifier
  • No one may ask his place in the line → suppressing amplification from “checking” requests
  • One sack per household per day → admission control and a work quota
  • The gate closing when the yard holds more than a day → load shedding, dropping work deliberately to fall back into the healthy state
  • Not with the mill, with the sacks → recovery comes from removing load, not adding capacity
  • Keeping the board up in a good year → policies must be established while healthy; in the bad state they will not hold
  • A stone every year → triggers are unavoidable; what must be prevented is crossing the tipping point
Daily Fables每日寓言 2026-10-24