# sllwakeup/piscina
基于 Node.js 24 和 Piscina 5.3.2 的独立 JavaScript 执行服务,用于运行 IoT 平台的产品自定义函数。PHP 通过 HTTP 调用本服务,无需在 PHP 镜像中安装 Node.js。
## 镜像特性
- Worker 数量按负载在最小值与最大值之间扩容,额外空闲 Worker 默认 5 分钟后回收
- 支持有界排队、排队超时、编译超时和执行超时
- 限制请求体、源码、返回值、日志和 effects 的大小
- 提供健康检查、线程池资源信息和 JavaScript 执行接口
- 支持 Token 鉴权,使用非 root 用户运行
## 拉取镜像
```bash
docker pull sllwakeup/piscina:latest
docker run -d \
--name piscina \
--restart unless-stopped \
-p 127.0.0.1:8787:8787 \
-e NODE_RUNNER_TOKEN=your-secret-token \
-e NODE_RUNNER_MIN_WORKERS=4 \
-e NODE_RUNNER_MAX_WORKERS=24 \
-e NODE_RUNNER_QUEUE_CAPACITY=64 \
sllwakeup/piscina:latest
镜像直接运行时默认监听 8787。上例仅将端口映射到本机;生产环境建议通过 Docker 内部网络访问,不要向公网开放。
services:
node-runner:
image: sllwakeup/piscina:latest
restart: unless-stopped
environment:
NODE_RUNNER_HOST: 0.0.0.0
NODE_RUNNER_PORT: 8787
NODE_RUNNER_TOKEN: your-secret-token
NODE_RUNNER_MIN_WORKERS: 4
NODE_RUNNER_MAX_WORKERS: 24
NODE_RUNNER_IDLE_TIMEOUT_MS: 300000
NODE_RUNNER_QUEUE_CAPACITY: 64
NODE_RUNNER_QUEUE_TIMEOUT_MS: 1000
expose:
- "8787"
GET /health 无需鉴权。服务正常时返回 HTTP 200;关闭过程中返回 HTTP 503。
{
"ok": true,
"pool": {
"threads": 4,
"min_threads": 4,
"max_threads": 24,
"idle_threads": 4,
"queued": 0,
"in_flight": 0,
"completed": 0
}
}
GET /resources 返回进程信息、Worker 数量及使用情况。配置 Token 后需携带鉴权请求头:
curl http://127.0.0.1:8787/resources \
-H 'Authorization: Bearer your-secret-token'
响应示例:
{
"ok": true,
"process": {
"name": "node-runner",
"pid": 12345,
"status": "running"
},
"pools": [
{
"name": "piscina",
"type": "worker_threads",
"size": {
"current": 4,
"min": 4,
"max": 24
},
"usage": {
"idle": 4,
"in_use": 0,
"queued": 0
},
"status": "healthy"
}
]
}
usage.queued 来自 Piscina 实际排队数。池状态可能为 healthy、busy、saturated 或 closing。
curl -X POST http://127.0.0.1:8787/run \
-H 'Authorization: Bearer your-secret-token' \
-H 'Content-Type: application/json' \
-d '{"code":"async function onMessage(message, ctx) { return message }","message":{"device_status":1},"ctx":{},"timeout":15}'
成功响应示例(非固定格式,有业务代码约定):
{
"success": true,
"result": {
"device_status": 1
},
"error": null,
"logs": [],
"effects": [],
"duration_ms": 5
}
NODE_RUNNER_TOKEN 为空时,/resources 和 /run 不要求鉴权。配置 Token 后,两者都需要携带相同的 Bearer Token。
| 变量 | 默认值 | 说明 |
|---|---|---|
NODE_RUNNER_HOST | 0.0.0.0 | 服务监听地址 |
NODE_RUNNER_PORT | 8787 | 服务监听端口 |
NODE_RUNNER_TOKEN | 空 | HTTP 鉴权 Token;为空时不鉴权 |
NODE_RUNNER_MIN_WORKERS | 4 | 最小 Worker 数 |
NODE_RUNNER_MAX_WORKERS | 24 | 最大 Worker 数 |
NODE_RUNNER_IDLE_TIMEOUT_MS | 300000 | 额外空闲 Worker 回收时间 |
NODE_RUNNER_QUEUE_CAPACITY | 最大 Worker 数的 4 倍 | 最大排队请求数 |
NODE_RUNNER_QUEUE_TIMEOUT_MS | 1000 | 排队等待超时,单位毫秒 |
NODE_RUNNER_DEFAULT_TIMEOUT | 15 | 默认执行超时,单位秒 |
NODE_RUNNER_MAX_TIMEOUT | 60 | 最大执行超时,单位秒 |
NODE_RUNNER_CLOSE_TIMEOUT_MS | 66000 | 默认优雅关闭等待时间,单位毫秒 |
NODE_RUNNER_COMPILE_TIMEOUT_MS | 1000 | JavaScript 编译超时,单位毫秒 |
NODE_RUNNER_MAX_BODY_BYTES | 1048576 | 最大请求体字节数 |
NODE_RUNNER_MAX_CODE_BYTES | 262144 | 最大源码字节数 |
NODE_RUNNER_MAX_RESULT_BYTES | 1048576 | 最大返回值字节数 |
NODE_RUNNER_MAX_LOGS | 200 | 单次执行最大日志条数 |
NODE_RUNNER_MAX_EFFECTS | 100 | 单次执行最大 effects 条数 |
NODE_RUNNER_WORKER_MAX_OLD_GENERATION_MB | 128 | 单个 Worker 老生代内存上限 |
NODE_RUNNER_WORKER_MAX_YOUNG_GENERATION_MB | 32 | 单个 Worker 新生代内存上限 |
NODE_RUNNER_WORKER_CODE_RANGE_MB | 64 | 单个 Worker 代码区上限 |
NODE_RUNNER_WORKER_STACK_MB | 4 | 单个 Worker 栈上限 |
旧变量 NODE_RUNNER_WORKERS 已不再使用,请改为 NODE_RUNNER_MIN_WORKERS 和 NODE_RUNNER_MAX_WORKERS。
该服务应部署在内部网络,不建议直接暴露到公网。node:vm 用于隔离任务状态,不是安全沙箱;只应执行可信任的产品自定义函数代码。
Content type
Image
Digest
sha256:7779c1892…
Size
77.2 MB
Last updated
3 days ago
docker pull sllwakeup/piscina