服务挂钩疑难解答

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

使用本文获取常见问题的一般故障排除指南和解答(常见问题解答)。

查看活动和调试问题

Web 访问管理员中的“服务挂钩”页显示每个订阅的最新活动(过去 14 天),以及订阅是启用、禁用还是受限。

可以访问有关订阅的详细历史记录,包括详细的请求/响应数据,这对于调试有问题的服务或订阅很有用。

  1. 若要查看订阅的活动和状态,请转到 “服务挂钩 ”页。

    显示订阅活动和状态的视图的屏幕截图。

  2. 若要查看订阅的详细活动(包括完整请求、响应和事件有效负载数据),请在表中选择订阅,然后选择“ 历史记录”。

    显示订阅活动的详细视图的屏幕截图。

订阅失败和缓刑(受限)

失败类型

服务挂钩通知失败分为以下类别:

  • 终端故障
  • 暂时性故障
  • 持久失败

终端故障

唯一的终端失败是 HTTP 状态代码 410(已消失)。 当订阅看到终端故障时,无论其以前的状态如何,它都会自动禁用。

暂时性故障

当订阅看到暂时性故障时,它会尝试重新发送通知最多 8 次,每次尝试之间的延迟增加。 暂时性故障包括以下代码:

  • 408(请求超时)
  • 502(错误的网关)
  • 503(服务不可用)
  • 504(网关超时)

暂时性故障的重试序列

重试# 等待时间
重试 1 之前 等待约 1 秒
重试 2 之前 等待约 2 秒(总延迟为 3 秒)
重试 3 之前 等待约 4 秒(总延迟 7 秒)
重试 4 之前 等待约 8 秒(总延迟为 15 秒)
重试 5 之前 等待约 16 秒(总延迟 31 秒)
重试 6 之前 等待约 32 秒(总延迟 63 秒)
重试 7 之前 等待约 60 秒(最大退避时间,总延迟为 123 秒)
重试 8 之前 等待约 60 秒(最大退避时间,总延迟为 183 秒)

如果通知耗尽了所有重试次数,并持续看到每次尝试的暂时性故障,订阅将停止尝试发送通知,并将通知视为持久失败。

持久失败

持久失败包括所有其他 HTTP 故障代码,例如:404(未找到)、500(内部服务器错误),等等。

当订阅看到持久失败时,它将置于缓刑状态

试用期

在缓刑时,订阅在可以发送的通知数量方面受到限制。 如果订阅继续达到持久失败,则订阅将越来越有限,并最终被禁用。 如果在缓刑时订阅收到成功的响应,则会将其还原到完全启用的状态。

订阅处于缓刑时的最大重试次数序列为 7 个

当订阅处于缓刑中时,任何新事件都将丢失。 重试成功后,将启用订阅,并再次发布事件。

重试# 等待时间
重试 1 之前 等待约 20 分钟
重试 2 之前 等待约 40 分钟(总缓刑时间为 1 小时)
重试 3 之前 等待约 1 小时 20 分钟(总缓刑时间为 2.33 小时)
重试 4 之前 等待约 2 小时 40 分钟(总缓刑时间为 5 小时)
重试 5 之前 等待约 5 小时 20 分钟(总缓刑时间为 10.33 小时)
重试 6 之前 等待约 10 小时 40 分钟(总缓刑时间为 21 小时)
重试 7 之前 等待约 15 小时(最大退避时间,总缓刑时间为 36 小时)

重试七次后,如果通知使用者失败,订阅状态将设置为 DisabledBySystem

常见问题

问:服务挂钩的有效负载限制是什么?

答: 有效负载限制为 2 MB。 更大的有效负载会导致性能和可靠性下降。 最佳做法是,服务挂钩应将有效负载限制为 2 MB 或更小。

问:状态已启用(受限)是什么意思?

答: 如果出现过多故障,订阅将受到限制。 启用(受限)与缓刑相同。

问:状态“已禁用”(由于失败)的含义是什么?

答:在长时间 连续失败或遇到终端故障 后,会自动禁用订阅。 在声明失败之前,会多次重试暂时性故障 类型。 不会重试持久失败 类型。 下面是每种故障类型的示例。

  • 暂时性:408(请求超时)、502(错误的网关)、503(服务不可用)、504(网关超时)
  • 终端:410(消失)
  • 持久:非暂时性或终端的所有故障

问:“已禁用”状态(用户左项目)的含义是什么?

答: 创建订阅的用户不再是团队成员。

问:如果服务挂钩不起作用,该怎么办?

答: 检查以下项:

  • 确认订阅已启用

  • 确认订阅设置正确(事件筛选器和操作)

  • 查看历史记录,尤其是在发生故障时

问:是否可以授予常规项目用户查看和管理项目的服务挂钩订阅的能力?

答: 默认情况下,只有项目管理员才拥有这些权限。 若要将这些权限直接授予其他用户,可以使用命令行工具安全性 REST API。

问:是否可以以编程方式创建订阅?

答: 是的,请使用 REST API