id | title |
---|---|
namespaces |
Namespaces |
Temporal 全局命名空间功能为客户端提供了在发生数据中心故障转移时从另一个集群继续执行其工作流的功能。尽管您可以配置全局命名空间以将其复制到任意数量的集群中,但是其仅将在单个集群中被视为处于活动状态。
Temporal 引入了一个新的顶级实体 Global Namespaces,它为跨集群的工作流执行复制提供支持。客户端应用程序需要对所有集群上的“活动/决策”任务运行 Worker 轮询。Temporal 将仅在当前活动集群上分派任务。备用集群上的 Worker 将闲置,直到全局命名空间进行故障转移。
由于 Temporal 是提供高度一致语义的服务,因此我们仅允许在活动集群上使用外部事件,例如 StartWorkflowExecution,SignalWorkflowExecution等。全局命名空间依赖于本地集群(Local_Quorum)上的轻量级事务(paxos)来更新工作流执行状态并创建复制任务,这些任务异步应用于跨集群的状态复制。如果应用程序在全局命名空间处于待机模式下的集群上进行这些API调用,则 Temporal 将使用 NamespaceNotActiveError 拒绝这些调用,其中会包含当前活动集群的名称。应用程序负责将外部事件转发到当前处于活动状态的集群。
此配置用于将集群本地的命名空间与全局命名空间区分开。它在任务更新时控制复制任务的创建,从而允许在集群之间复制状态。这是一个只读设置,仅在初始化命名空间时才能设置。
命名空间可以故障转移到的集群列表,包括当前的活动集群。这也是一个只读设置,仅在初始化命名空间时才能设置。开发路线图上的重新复制功能将允许更新此配置,以在将来添加/删除集群。
全局命名空间的当前活动集群的名称。每次全局命名空间故障转移到另一个集群时,都会更新此配置。
唯一的故障转移版本,也代表全局命名空间的当前活动集群。Temporal 允许从任何集群触发故障转移,因此故障转移版本的设计用来避免错误地在两个集群上同时触发故障转移时发生冲突。
与为活动执行提供最多一次语义的本地命名空间不同,全局命名空间只能支持至少一次语义。Temporal XDC 依赖于集群之间事件的异步复制,因此在发生故障转移时,由于复制任务的滞后,有可能在新的活动集群上再次调度活动。这也意味着在新集群进行故障转移后更新工作流的执行状态后,就无法应用该执行的任何先前的复制任务。这会导致工作流在先前的活动集群中执行所获得的某些进度损失。在解决冲突期间,Temporal 在丢弃复制任务之前会将所有外部事件(如信号)重新注入到新历史记录中。即使在故障转移期间某些进度可能会回滚,但 Temporal 保证了工作流不会卡住并将继续向前推进。
在活动集群和备用集群上都允许使用所有可见性 API。这使 Temporal Web 可以无缝地用于全局命名空间,因此可以从复制该命名空间的任何集群中查询工作流执行的所有可见性记录。即使全局命名空间处于待机模式,直接向Temporal Visibility API进行 API 调用的应用程序也将继续工作。但是当从备用集群查询工作流执行状态时,由于复制延迟的存在,查询可能会有延迟。
Temporal CLI也可用于查询命名空间配置或执行故障转移。这是一些相关的命令。
以下命令可用于描述全局命名空间元数据:
$ tctl --ns temporal-canary-xdc n desc
Name: temporal-canary-xdc
Description: temporal canary cross dc testing namespace
OwnerEmail: [email protected]
NamespaceData:
Status: REGISTERED
RetentionInDays: 7
EmitMetrics: true
ActiveClusterName: dc1
Clusters: dc1, dc2
以下命令可用于将全局命名空间 my-namespace-global 故障转移到 dc2 集群:
$ tctl --ns my-namespace-global n up --ac dc2
Temporal 不会跨集群转发活动的完成。任何未完成的活动最终都会根据配置超时。您的应用程序应具有重试逻辑,以便在故障转移到新的 DC 之后重试该活动并将其再次分派给 Worker 。即使没有全局命名空间,处理此操作与处理由 Worker 重新启动导致的活动超时的方式几乎相同。
Temporal 将拒绝该调用并返回 NamespaceNotActiveError。应用程序负责根据错误中提供的信息将失败的调用转发到活动集群。
此时的建议是,如果事件可以在任何DC中生成,则将事件发布到 Kafka 主题。然后,有一个消费者在同一 DC 中从聚合的 Kafka 主题进行消费,并将其发送给 Temporal。Kafka 消费者和全局命名空间都需要一起进行故障转移。