错误、状态与恢复决策
首先确定报告失败的边界。Rust 错误码、remoting 响应码、gRPC 消息体状态、gRPC 传输状态和进程退出码描述不同契约。应保留错误码与操作上下文,不要通过匹配人类可读的错误句子实现集成逻辑。
调用方应检查哪个值?
| 接口层 | 应检查的值 | 含义 |
|---|---|---|
| 规范 Rust 错误 | Error::descriptor() 及其稳定的点分错误码 | 标识声明的失败类型与恢复提示,同时保留供内部诊断使用的强类型原因。 |
| 客户端外观错误 | ClientError::descriptor() 或 shared_error() | 保留规范描述符,而不是将原因压平成字符串。 |
| remoting 响应 | 数值响应码及允许公开的响应字段 | 多个规范错误可能映射到同一数值码;数值码不是唯一的内部原因。 |
| Proxy gRPC | 方法响应状态、存在时的逐项状态及传输结果 | RPC 成功送达仍可能包含失败的 RocketMQ 操作;传输失败时可能没有任何消息体结果。 |
| 生产者结果 | 外层结果、结果是否存在、再检查 SendResult.send_status | 返回结果对象仍可能报告刷盘或复制超时。 |
| CLI | 进程退出状态、安全 stderr 及命令专用输出 | 退出状态是自动化信号;部分操作结果也可能需要进一步检查。 |
错误目录及其组件模块定义描述符身份和映射。外层服务边界可以使用服务级描述符包装原因,因此启动失败不一定暴露最内层配置错误码。
常见规范错误
恢复提示属于目录元数据。操作列说明如何结合具体操作使用提示,并不承诺自动重试。
| 稳定错误码 | 目录提示 | 常见原因与下一步 |
|---|---|---|
core.configuration.parse_failed | Never | 输入语法或反序列化失败。修正所选文件与格式后再启动。 |
core.configuration.missing / core.configuration.invalid | Never | 缺少必填设置,或值/组合无效。检查所属配置模型与加载优先级。 |
protocol.header.invalid / protocol.body.invalid | Never | 字段或消息体编码无效。应修正请求,重复发送相同字节无法修复问题。 |
protocol.request.unsupported / protocol.version.unsupported | Never | 所选端点或版本未实现请求。检查端点、feature 与兼容范围。 |
route.topic.not_found | RefreshRoute | 主题不存在、尚未注册,或在所选 NameServer 上不可见。确认主题创建与 Broker 注册,再在有限重试预算内刷新路由。 |
auth.credentials.invalid | RefreshCredentials | 身份/签名无效或凭据过期。修正或轮换凭据,诊断中不能包含凭据值。 |
auth.permission.denied | Never | 当前身份没有目标资源/操作权限。应检查策略与资源范围,而不是无限重试相同凭据。 |
transport.admission.queue_saturated | Backoff | 本地请求接纳已满。降低并发,检查待处理数量与字节数,并仅在操作预算内重试。 |
transport.connection.timeout / transport.response.timeout | Backoff | 连接或响应截止时间已到。决定是否可以重复变更前,应判断请求字 节是否可能已经到达对端。 |
controller.leadership.not_leader | RefreshLeader | 请求到达非当前 Leader 的 Controller。刷新 Leader 元数据,并保留原操作身份。 |
storage.capacity.exhausted | OperatorAction | 存储无法接纳操作。检查剩余空间、保留压力和配置限制;重试本身不会创造容量。 |
storage.read.failed / storage.write.failed | OperatorAction | 存储操作失败。保留有界诊断上下文,并调查 I/O 与后端状态。 |
storage.state.corrupted | OperatorAction | 存储状态违反预期格式或不变量。隔离受影响的恢复路径,使用备份恢复流程,不要删除格式元数据来压制错误。 |
此表用于常见问题查询,不是完整目录。Broker、Proxy、Controller、Client、认证、可观测性和工具在组件错误目录中定义了更具体的描述符。已有更具体描述符时,应保留它。
描述符映射的准确示例
以下是目录声明的映射,不表示所有 HTTP 或 gRPC 端点使用相同外层封装,也不表示它们始终返回表中的传输状态。
| 规范描述符 | remoting | gRPC 消息体 / 传输映射 | HTTP / CLI 映射 |
|---|---|---|---|
protocol.header.invalid | InvalidParameter (29) | BadRequest / InvalidArgument | 400 / 64 |
route.topic.not_found | TopicNotExist (17) | TopicNotFound / NotFound | 404 / 66 |
auth.credentials.invalid | NoPermission (16) | Unauthorized / Unauthenticated | 401 / 77 |
auth.permission.denied | NoPermission (16) | Forbidden / PermissionDenied | 403 / 77 |
transport.admission.queue_saturated | SystemBusy (2) | TooManyRequests / ResourceExhausted | 429 / 75 |
controller.leadership.not_leader | ControllerNotLeader (2007) | InternalError / FailedPrecondition | 409 / 65 |
storage.capacity.exhausted | SystemError (1) | InternalError / ResourceExhausted | 507 / 65 |
例如,凭据无效与权限被拒绝都映射到 remoting 响应码 16。仅看到 16 的重试实现,不能推断刷新凭据就能解决策略拒绝。同样,通用 SystemError 可以表示多种存储或服务失败,不能据此安全地重复写入。
数值与轻量枚举定义于边界类型。适配器代码将它们转换为具体协议响应类型,错误内核本身不负责网络通信。