LangGraph 平台:可扩展性与弹性¶
LangGraph 平台旨在根据您的工作负载进行水平扩展。该服务的每个实例都是无状态的,不会在内存中保留任何资源。该服务被设计为能够优雅地处理实例的添加或移除,包括硬关机的情况。
服务器可扩展性¶
当你为某个服务添加更多实例时,只要在这些实例前面配置了合适的负载均衡机制,它们就会分担 HTTP 负载。在大多数部署模式中,我们会自动为服务配置一个负载均衡器。在“无控制平面的自托管”模式下,你需要自行添加负载均衡器。由于这些实例是无状态的,任何负载均衡策略都适用,不需要也不建议使用会话粘性。服务器的任何实例都可以与任何队列实例进行通信(通过 Redis 发布/订阅),这意味着取消或流式传输正在进行的运行的请求可以由任意实例处理。
队列可扩展性¶
当你为服务添加更多实例时,运行吞吐量将线性增加,因为每个实例都配置为处理一定数量的并发运行任务(默认情况下为 10 个)。每次运行的每次尝试都将由单个实例处理,通过 PostgreSQL 的多版本并发控制(MVCC)模型来保证精确一次语义(有关崩溃恢复的详细信息,请参阅下面的章节)。因临时性数据库错误而失败的尝试最多会重试 3 次。我们不使用长事务或锁,这使我们能够更高效地利用 PostgreSQL 资源。
弹性¶
当一个运行任务由队列实例处理时,该队列工作器会在 Redis 中定期记录心跳时间戳。
当接收到正常关闭请求(SIGINT)时,实例会进入关闭模式,这意味着: - 停止接受新的 HTTP 请求 - 给任何正在进行的运行任务有限的秒数来完成(如果未完成,它将被重新放回队列) - 阻止实例从队列中获取更多的运行任务
如果发生硬关闭,例如由于服务器崩溃或基础设施故障,任何正在进行的运行任务将由一个定期清理任务接管。该任务会查找那些超出心跳时间窗口的正在进行的运行任务,并将它们重新放回队列,以便其他实例可以接手处理。
PostgreSQL 恢复能力¶
对于由我们管理 PostgreSQL 数据库的部署模式,我们会进行定期备份,并设置持续复制的备用副本以实现自动故障转移。此外,根据需求,我们还可以选择设置只读副本以及其他高级故障转移功能。
与 PostgreSQL 的所有通信都会对可重试的错误进行重试。如果 PostgreSQL 暂时不可用(例如在数据库重启期间),大部分/所有流量应该仍能继续正常处理。如果 PostgreSQL 实例长时间故障,流量将切换到故障转移副本。如果在主实例恢复在线之前,故障转移副本也发生故障,服务将不可用。
Redis 弹性¶
所有需要持久存储的数据都存储在 Postgres 中,而非 Redis。Redis 仅用于存储临时元数据以及实例间的通信。有关我们如何使用 Redis 的更多详细信息,请参考架构页面。因此,我们对 Redis 没有持久性要求。
与 Redis 的所有通信都会针对可重试错误实现重试机制。如果 Redis 暂时不可用,例如在数据库重启期间,大部分/所有流量应该仍能继续正常处理。如果 Redis 长时间出现故障,LGP 服务将无法使用。