UpdateTaskList 操作因 Cadence 匹配服务失败

问题描述

前几天,我们的节奏设置遇到了一些问题。我们的一台机器实例开始将 CPU 使用率提高到 90%,并且所有入站工作流执行都停留在“计划”状态。检查日志后,我们注意到匹配服务抛出以下错误:

{
  "level": "error","ts": "2021-03-20T14:41:55.130Z","msg": "Operation failed with internal error.","service": "cadence-matching","error": "InternalServiceError{Message: UpdateTaskList operation failed. Error: gocql: no hosts available in the pool}","metric-scope": 34,"logging-call-at": "persistenceMetricClients.go:872","stacktrace": "github.com/uber/cadence/common/log/loggerimpl.(*loggerImpl).Error\n\t/cadence/common/log/loggerimpl/logger.go:134\ngithub.com/uber/cadence/common/persistence.(*taskPersistenceClient).updateErrorMetric\n\t/cadence/common/persistence/persistenceMetricClients.go:872\ngithub.com/uber/cadence/common/persistence.(*taskPersistenceClient).UpdateTaskList\n\t/cadence/common/persistence/persistenceMetricClients.go:855\ngithub.com/uber/cadence/service/matching.(*taskListDB).UpdateState\n\t/cadence/service/matching/db.go:103\ngithub.com/uber/cadence/service/matching.(*taskReader).persistAckLevel\n\t/cadence/service/matching/taskReader.go:277\ngithub.com/uber/cadence/service/matching.(*taskReader).getTasksPump\n\t/cadence/service/matching/taskReader.go:156"
}

重新启动工作流程后,一切都恢复正常,但我们仍在努力弄清楚发生了什么。在这个事件发生的那一刻,我们并没有表现出任何繁重的工作量,它只是突然发生。我们的主要怀疑是匹配服务可能在此事件期间失去了与 cassandra 数据库的连接,而在我们重新启动它之后,它能够恢复它。但这只是目前的假设。

这个问题的原因可能是什么?有没有办法防止将来发生这种情况?也许我们错过了一些动态配置?

PS:Cadence 版本为 0.18.3

解决方法

这是 gocql 中的一个 known issue,可能由多种原因引起:

  1. Cassandra 过载,某些节点没有响应。您可能认为您的负载很小,但最好的查看方式是通过 Cadence 指标/仪表板。有一节是关于持久性指标的。
  2. 如果 1. 是问题所在,您可以调整 ratelimiting 以保护您的 Cassandra。使用 matching.persistenceGlobalMaxQPS 将作为全局速率限制器来覆盖 matching.persistenceMaxQPS
  3. 网络问题或 gocql 中的一些错误。这真的很令人沮丧。我们最近决定在此 PR 中进行刷新。希望这会在下一个版本中得到缓解。

此外,如果匹配的节点正在运行,那么您可能会达到单个任务列表的限制。如果是这样,请考虑启用 the scalable tasklist feature

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...