Sign inSign up

sllwakeup/piscina

By sllwakeup

Updated 3 days ago

node 线程池 piscina

Image
0

359

sllwakeup/piscina repository overview

# 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 启动

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 内部网络访问,不要向公网开放。

Docker Compose

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 实际排队数。池状态可能为 healthybusysaturatedclosing

执行 JavaScript 示例

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_HOST0.0.0.0服务监听地址
NODE_RUNNER_PORT8787服务监听端口
NODE_RUNNER_TOKENHTTP 鉴权 Token;为空时不鉴权
NODE_RUNNER_MIN_WORKERS4最小 Worker 数
NODE_RUNNER_MAX_WORKERS24最大 Worker 数
NODE_RUNNER_IDLE_TIMEOUT_MS300000额外空闲 Worker 回收时间
NODE_RUNNER_QUEUE_CAPACITY最大 Worker 数的 4 倍最大排队请求数
NODE_RUNNER_QUEUE_TIMEOUT_MS1000排队等待超时,单位毫秒
NODE_RUNNER_DEFAULT_TIMEOUT15默认执行超时,单位秒
NODE_RUNNER_MAX_TIMEOUT60最大执行超时,单位秒
NODE_RUNNER_CLOSE_TIMEOUT_MS66000默认优雅关闭等待时间,单位毫秒
NODE_RUNNER_COMPILE_TIMEOUT_MS1000JavaScript 编译超时,单位毫秒
NODE_RUNNER_MAX_BODY_BYTES1048576最大请求体字节数
NODE_RUNNER_MAX_CODE_BYTES262144最大源码字节数
NODE_RUNNER_MAX_RESULT_BYTES1048576最大返回值字节数
NODE_RUNNER_MAX_LOGS200单次执行最大日志条数
NODE_RUNNER_MAX_EFFECTS100单次执行最大 effects 条数
NODE_RUNNER_WORKER_MAX_OLD_GENERATION_MB128单个 Worker 老生代内存上限
NODE_RUNNER_WORKER_MAX_YOUNG_GENERATION_MB32单个 Worker 新生代内存上限
NODE_RUNNER_WORKER_CODE_RANGE_MB64单个 Worker 代码区上限
NODE_RUNNER_WORKER_STACK_MB4单个 Worker 栈上限

旧变量 NODE_RUNNER_WORKERS 已不再使用,请改为 NODE_RUNNER_MIN_WORKERSNODE_RUNNER_MAX_WORKERS

安全说明

该服务应部署在内部网络,不建议直接暴露到公网。node:vm 用于隔离任务状态,不是安全沙箱;只应执行可信任的产品自定义函数代码。

Tag summary

Content type

Image

Digest

sha256:7779c1892

Size

77.2 MB

Last updated

3 days ago

docker pull sllwakeup/piscina