主题
可扩展性与弹性
LangSmith 旨在随你的工作负载进行水平扩展。服务的每个实例都是无状态的,不在内存中保留任何资源。该服务经过设计,可妥善处理实例的新增或移除,包括硬关闭的情况。
服务器可扩展性
当你向服务添加更多实例时,只要在它们前面放置适当的负载均衡机制,这些实例就会分担 HTTP 负载。在大多数部署模式中,我们会自动为服务配置负载均衡器。在“无控制平面的自托管”模式中,你需要自行添加负载均衡器。由于实例是无状态的,任何负载均衡策略都可以使用,不需要也不建议使用会话粘性。服务器的任何实例都可以与任何队列实例通信(通过 Redis PubSub),这意味着取消或流式传输进行中 run 的请求可以由任意实例处理。
队列可扩展性
当你向服务添加更多队列 worker 时,run 吞吐量会线性增长,因为每个队列 worker 都配置为执行固定数量的并发 run(N_JOBS_PER_WORKER,默认 10)。该值控制并发 run 执行数,而不是部署可服务的 API 请求数。每个 run 的每次尝试都由单个实例处理,并通过 Postgres 的 MVCC 模型实现精确一次语义(崩溃恢复详情见下文)。因临时数据库错误而失败的尝试最多重试 3 次。我们不使用长事务或锁,这使我们能够更高效地利用 Postgres 资源。
弹性
当队列实例处理 run 时,该队列 worker 会定期将心跳时间戳记录到 Redis 中。
当收到优雅关闭请求(SIGINT)时,实例会进入关闭模式,并执行以下操作:
- 停止接受新的 HTTP 请求
- 给所有进行中的 run 有限秒数来完成(如果未完成,将被放回队列)
- 停止该实例从队列中获取更多 run
如果因服务器崩溃或基础设施故障发生硬关闭,任何进行中的 run 都会被内部清理任务接管,该任务会查找已超过心跳窗口的进行中 run。清理任务每 2 分钟运行一次,并将这些 run 放回队列,供其他实例获取。
Postgres 弹性
对于由 LangSmith 管理 Postgres 数据库的部署模式,会定期备份并持续复制备用副本,以实现自动故障转移。此 Postgres 配置仅在 Cloud 部署选项的专用部署类型中可用。
与 Postgres 的所有通信都会对可重试错误实施重试。如果 Postgres 暂时不可用(例如数据库重启期间),大多数/所有流量应能继续成功。Postgres 长时间故障将导致 Agent Server 不可用。
Redis 弹性
所有需要持久存储的数据都存储在 Postgres 中,而不是 Redis。Redis 仅用于临时元数据和实例间通信。因此,我们对 Redis 没有持久性要求。
与 Redis 的所有通信都会对可重试错误实施重试。如果 Redis 暂时不可用(例如数据库重启期间),大多数/所有流量应能继续成功。Redis 长时间故障将导致 Agent Server 不可用。