当前位置: 首页 > 知识库问答 >
问题:

更新任务列表操作失败,有节奏匹配服务

夏侯华彩
2023-03-14

前几天,我们的节奏设置遇到了一些问题。我们的一个机器实例开始将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:踏频版本为0.18.3

共有1个答案

哈雅珺
2023-03-14

这是gocql中的一个已知问题,可能由多种原因引起:

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

此外,如果匹配的节点运行热,则可能已达到单个任务列表的限制。如果是这样,请考虑启用可缩放的任务列表功能。

 类似资料:
  • 我想实现一个用例,在适当的缩减期间,我想确保cadence员工不接受任何新工作。我在k8上使用cadence,所以我计划给已知的最大超时设置一个terminationGracePeriodSeconds,在这个时间之前,我知道所有正在进行的任务都将在特定的pod上完成。因此,新任务将仅分配给在职员工。 我的用例是,我的活动具有较大的 startToClose 超时,并且在部署期间,活动任务将被选取

  • 每次我尝试打开玩家设置,它将只显示空白。下面的错误将显示在控制台中。 我尝试过以下链接:https://answers.unity.com/questions/1320634/unable-to-list-target-platforms-when-i-try-to-build.html,但仍然没有工作。 CommandInvokationFailure:无法更新Android SDK包列表。/a

  • 我在更新Android Studio 3.1 Canary 6版本后出现错误 我的分级档案是: 有什么解决办法吗?

  • 我正在尝试独立运行每个节奏服务,这样我就可以轻松地扩展它们。我的团队正在使用docker群,我们使用Portainer UI管理一切。到目前为止,我已经能够扩展前端服务以拥有两个副本,但是如果我对匹配的服务做同样的事情,我将通过工作流执行获得大量的。最终,执行将成功完成,但需要很长时间。要想有一个想法,使用两个匹配的服务副本需要2分钟,而只使用一个只需要7秒。 这是一个测试环境。我正在使用泊坞化的

  • 问题内容: 有没有正确的方法来更新IRedisList?使用下面的示例代码,我可以对其进行修改以删除列表,更新披萨并重新添加列表,但这感觉不对。命令行文档非常繁琐,但是比我要大得多,而且我不确定要从哪里开始寻找。 问题答案: 避免列表: 不幸的是,在这种情况下,Redis列表 并不是真正的好选择 。当我开始使用Redis时,我遇到了同样的问题, 它们似乎是显而易见的选择;)。 如果您将Redis列

  • 问题内容: 我正在使用该软件包在Go中编写Windows服务。 到目前为止,一切都很顺利,而且很容易上手,我喜欢它。 我已经编写了一些自动更新功能,并且希望该服务在完成更新后重新启动。 我尝试生成一个进程,该进程将使用来重新启动服务,但它会记录一条错误消息,该消息似乎与尝试在作为本地系统运行时尝试控制该服务有关。 更好的方法是,将服务设置为,效果很好! 唯一的麻烦是,似乎没有使用Go编程配置这些选