/* Page prose (zh-Hans) */
"DistributedLocationTransparency" = "# 位置透明：回报与代价\n\n头号特性是**位置透明**：无论一个分布式 actor 碰巧住在你自己的进程里，还是住在全国另一头的一台服务器上，你都用*同样的方式*调用它。actor 系统会解析它在哪里并路由这次调用。你那句 `try await ledger.currentBalance()` 的代码不会因答案不同而改变。\n\n这确实很强大。你可以把你的系统当作一组互相发送消息的 actor 来推理，让运行时去处理每个 actor *坐落*在何处的管道细节，而这甚至可以随着你扩容或挪动服务而改变。\n\n但透明说的是*你如何写这次调用*，而不是这次调用*花费*什么。要对代价看得清清楚楚，因为它是真实存在的：\n\n* **延迟。**  \n一次本地 actor 的跳转是纳秒级。一次网络往返是毫秒级，往往慢上千倍。那种在进程内没问题的喋喋不休的来回，在线缆上可能会爬行。你会想发送更少、更大的消息，而不是许多微小的。\n* **部分失败。**  \n在一个进程里，只要你的代码在运行，actor 就存在。跨越一张网络，另一端可能在对话中途凭空消失：崩溃、重启、不可达。那就是你一直看到的 `throws`。你必须为那些不会返回的调用*做设计*，而不是把失败当成罕见的意外。\n* **序列化。**  \n每一个参数和结果都要被编码和解码。这消耗 CPU，还更微妙地约束了你的 API：你只能交换那些能通过 `Codable` 的东西。丰富的内存图和在线资源都留在家里。\n\n位置透明并不会让这些代价消失；它只是让它们*在调用时是统一的*。知道它们就在那里，正是让你不至于把一个分布式系统当作本地系统来设计的东西。\n\n[上一页](@previous)  |  第 7 / 9 页  |  [下一页: 何时才重要](@next)";
