diff --git a/HTTP_API_README.md b/HTTP_API_README.md index 82d1166..f06f2e9 100644 --- a/HTTP_API_README.md +++ b/HTTP_API_README.md @@ -157,7 +157,7 @@ json_error(ErrCode, ErrMessage) when is_integer(ErrCode), is_binary(ErrMessage) | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | uuid | binary (string) | ✅ | 主机唯一标识符 | -| task_id | integer | ✅ | 任务 ID | +| task_id | integer | ✅ | 任务 ID,和 uuid 一起作为部署任务唯一标识 | | config | map | ✅ | 部署配置内容 | #### 响应参数 @@ -255,13 +255,16 @@ json_error(ErrCode, ErrMessage) when is_integer(ErrCode), is_binary(ErrMessage) #### 示例响应 ```json { - "result": { - "task_id": 1001, - "status": "deployed" - } + "data": "ok" } ``` +部署过程实时日志通过 SSE 获取: + +```http +GET /event_stream?uuid=qbxmjyzrkpntfgswaevodhluicqzxplkm&task_id=1 +``` + #### 错误响应 ```json { diff --git a/docs/container_deploy_request.md b/docs/container_deploy_request.md index f3db2f0..6eed456 100644 --- a/docs/container_deploy_request.md +++ b/docs/container_deploy_request.md @@ -94,11 +94,19 @@ HTTP body 必须是 JSON object。`http_protocol` 会使用 `json:decode/1` 解 | 字段 | JSON 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `uuid` | string | 是 | 目标 efka 所属主机 UUID。服务端用它查找 `iot_host` 进程,不会下发到 efka。 | -| `task_id` | non-negative integer | 是 | 部署任务 ID。会进入内部命令的 `task_id` 字段,用于关联部署结果和部署日志流。 | +| `task_id` | non-negative integer | 是 | 部署任务 ID。会进入内部命令的 `task_id` 字段,用于关联部署结果和部署日志流。`iot` 内部使用 `{uuid, task_id}` 作为任务唯一标识。 | | `config` | object | 是 | 容器创建配置。会被校验并转换成内部部署参数 map。 | 顶层没有 `timeout` 字段。当前 HTTP handler 等待 efka command response 的超时时间固定为 10 秒。 +部署过程的实时反馈通过 SSE 读取: + +```http +GET /event_stream?uuid=&task_id= +``` + +`/container/deploy` 收到合法请求后会先在 `iot` 内部创建或复用 `{uuid, task_id}` 对应的任务进程,然后再向 `efka` 下发部署命令。SSE handler 订阅同一个任务进程;该进程会缓存最近的部署事件,支持多个页面同时订阅,并在收到 efka 的 close 事件后关闭 SSE。 + ## 4. config 参数 ### 必填字段 diff --git a/docs/efka_iot_protocol.md b/docs/efka_iot_protocol.md index 88d4d98..c05b99a 100644 --- a/docs/efka_iot_protocol.md +++ b/docs/efka_iot_protocol.md @@ -207,6 +207,14 @@ ok }}} ``` +`task_event` 本身不携带 `uuid`。`iot` 在接收该消息时使用当前已鉴权 `ssl_channel` 绑定的 host UUID,把事件路由到内部任务进程 `{UUID, TaskId}`。HTTP 页面通过 SSE 订阅时也必须使用同一组参数: + +```http +GET /event_stream?uuid=&task_id= +``` + +`iot` 会为每个 `{UUID, TaskId}` 维护一个独立的任务进程,用于缓存最近的部署日志、支持多个 SSE listener,并在收到 close 事件后结束事件流。 + ### iot -> efka: pub ```erlang