附录:服务状态码说明

本文为您介绍访问服务返回的状态码的说明信息。

状态码

说明

200

服务正常返回。

400

Processor返回异常。

原因

  • 对于平台提供的通用Processor(例如TensorflowPytorch),如果请求输入格式有问题,导致服务端无法识别,则返回状态码400。

  • 对于自定义Processor,如果代码抛出异常,会在服务端返回状态码400。

    说明

    您也可以在自定义Processor中返回任意自定义的状态码。

401

服务鉴权失败。

原因:访问服务时未指定Token或指定的Token信息不正确。

处理方法

  1. 服务Token在服务部署时会自动生成。您也可以在服务初次部署时,通过在配置文件中增加Token字段来指定固定Token值,在服务更新时Token值保持不变。

  2. 您可以在控制台的PAI EAS模型在线服务页面,单击目标服务操作列下的在线调试,查询到服务访问的Token;也可以通过eascmd desc service_name命令来获取服务的Token信息。

  3. 访问服务。

    • 在使用curl命令进行服务测试时,您可以直接将Token值以HTTP Header的方式添加到请求中,例如:curl -H 'Authorization: NWMyN2UzNjBiZmI2YT***' http:// xxx.cn-shanghai.aliyuncs.com/api/predict/echo

    • 在使用SDK访问服务时,调用对应的SetToken()函数即可,详情请参见Java SDK使用说明

404

找不到服务。

原因:服务名称或服务请求的Endpoint使用不正确。

405

方法不被允许。

原因:比如服务器只支持GET请求,却发送了POST请求就会返回405。尝试更换请求方法。

408

请求计算超时。

原因:服务端为每个请求配置了默认的超时时间(默认为5秒,您可以在创建服务JSON文件中配置metadata.rpc.keepalive字段来调整超时时间),当单个请求的处理时长超过metadata.rpc.keepalive字段配置的值后,服务端会返回状态码408,来中断该请求的处理,并断开该请求所在的TCP连接。

说明

单个请求的处理时长包含Processor的计算时间、请求接收网络数据包时间以及单个请求在队列中排队的时间。

429

请求触发限流。

原因EAS提供了基于QPS的限流功能,您可以在创建服务JSON文件中配置metadata.rpc.rate_limit字段开启该功能。开启限流功能后,如果请求并发数超出了指定限制后,超出的部分请求会被丢弃并返回状态码429。

450

超出队列长度丢弃请求。

原因:服务端的计算实例在接收到请求后,会先将请求放入队列中进行排队。当实例中的worker(worker数量默认为5,您可以在创建服务JSON文件中配置metadata.rpc.worker_threads字段来调整worker数量)空闲时,会从队列中获取数据进行计算。当worker计算时间过长,导致队列中请求堆积。当队列打满时(队列长度默认为64,您可以在创建服务JSON文件中配置metadata.rpc.max_queue_size字段来调整队列长度),新来的请求会直接被拒绝,并返回状态码450,来避免队列过度堆积导致所有请求RT越来越高最终服务不可用。

说明

队列限长在一定程度上也是一种限流保护,避免大流量导致服务雪崩。

处理方法

  • 当返回的状态码有少量450时,因为服务端的实例是相互独立的,您可以通过重试调度到其他相对空闲的实例上,避免客户端感知,但不能无限重试,否则限流的保护作用会失效。

  • Processor内部代码卡住时,所有请求均返回状态码450。当所有worker在处理请求时出现死锁等场景,导致没有worker从队列中获取数据进行处理,这种场景需要排查Processor代码的Bug。

499

客户端主动断开连接。

原因:当客户端主动断开连接时,客户端不会接收到状态码499,该连接上未处理完成的请求会在服务端记录一个状态码499。例如:在客户端配置了HTTP超时时间为30毫秒,服务端的处理延时为50毫秒,客户端等待30毫秒后未获取到返回结果时,会放弃该请求,并主动断开连接,此时在服务端监控中,会出现状态码499。

500

服务器内部错误。服务器遇到错误,无法完成请求。

501

尚未实施。服务器作为网关或代理,从上游服务器收到无效响应。

502

错误网关。服务器作为网关或代理,从上游服务器收到无效响应。

503

服务不可用。

原因:通过网关访问服务时,如果后端服务实例状态全部为非Ready,则网关会返回状态码503。

比较常见的一种场景是,服务部署完成后状态为Running,且服务各实例状态均为Ready,但发起请求后,服务端返回状态码503。通常是因为异常请求触发了代码中的Bug,导致后端服务实例Crash,从而无法正常响应请求,此时网关会向客户端返回状态码503。

504

网关超时。服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505

HTTP版本不受支持。服务器不支持请求中所用的HTTP协议版本。