!Logo
Samply.Beam是一个分布式任务代理,专为在严格的网络环境中进行高效通信而设计。它提供跨严格网络边界的常用通信模式、端到端加密和签名,以及基于易用REST API的证书管理和验证功能。
Samply.Beam特别适合以下场景:
!Architecture Schema
Samply.Beam由两个中央运行组件和每个分布式节点上的一个代理组成:
系统中的每个组件都通过其分层的BeamId唯一标识:
app3.proxy2.broker1.samply.de <---------------------------> AppId <----------------------> ProxyId <---------------> BrokerId
CN=proxy2.broker2.samply.deSamply.Beam基于任务和结果的通信模型:
json{ "id": "70c0aa90-bfcf-4312-a6af-42cbd57dc0b8", "from": "app7.proxy-hd.broker-project1.samply.de", "to": [ "app1.proxy-hd.broker-project1.samply.de", "app5.proxy-ma.broker-project1.samply.de" ], "body": "需要完成的工作描述", "failure_strategy": { "retry": { "backoff_millisecs": 1000, "max_tries": 5 } }, "ttl": "30s", "metadata": "代理可读取并使用此字段,例如代表应用应用过滤器" }
字段说明:
id:任务的UUID标识符from:提交应用的BeamID(由Proxy根据身份验证信息自动设置)to:允许检索任务并提交结果的工作者BeamID列表body:工作描述,Broker不解释此内容failure_strategy:建议客户端如何处理失败,可选值:discard(丢弃)、retry(重试)failure_strategy.retry:重试策略,max_tries(最大重试次数)和backoff_millisecs(重试间隔毫秒数)ttl:生存时间,超时后Broker将删除任务及其结果metadata:代理可读取的关联数据,可为任意类型json{ "from": "app1.proxy-hd.broker-project1.samply.de", "to": [ "app7.proxy-hd.broker-project1.samply.de" ], "task": "70c0aa90-bfcf-4312-a6af-42cbd57dc0b8", "status": "succeeded", "body": "成功完成的结果数据", "metadata": ["任意", "数据", "类型", "都是", "允许的"] }
字段说明:
from:提交结果的客户端BeamIDto:结果的预期接收者BeamIDtask:关联任务的UUIDstatus:工作结果状态,允许值:claimed(已认领)、tempfailed(临时失败)、permfailed(永久失败)、succeeded(成功)body:结果负载,除claimed状态外,所有状态都需要此字段metadata:代理可读取的关联数据,可为任意类型且不加密创建新任务,由指定的工作者处理。当前body大小限制为10MB。
POST/v1/tasksAuthorization: ApiKey <BeamID> <ApiKey>示例:
bashcurl -k --json '{"body":"生命、宇宙和一切的终极问题的答案是什么?","failure_strategy":{"retry":{"backoff_millisecs":1000,"max_tries":5}},"from":"app.proxy1.broker.example.de","id":"70c0aa90-bfcf-4312-a6af-42cbd57dc0b8","metadata":"代理可读取此字段","to":["app.proxy2.broker.example.de"],"ttl":"60s"}' \ -H "Authorization: ApiKey app.proxy1.broker.example.de AppKey" \ [***]
响应:
HTTP/1.1 201 Created Location: /tasks/70c0aa90-bfcf-4312-a6af-42cbd57dc0b8 Content-Length: 0
注意:服务器可能忽略提交的id属性并自动生成自己的ID,应使用响应中Location头指定的URL来引用任务。
工作者定期调用此端点来检索提交的任务。
GET/v1/tasksfrom (可选): 仅获取由此ID创建的任务to (可选): 仅获取定向到此ID的任务filter (可选): 仅获取满足指定过滤条件的任务
filter=todo: 匹配要由查询客户端处理的未完成任务Authorization: ApiKey <BeamID> <ApiKey>示例:
bashcurl -k -H "Authorization: ApiKey app.proxy2.broker.example.de AppKey" \ [***]
响应:
json[ { "id": "70c0aa90-bfcf-4312-a6af-42cbd57dc0b8", "from": "app.proxy1.broker.example.de", "to": ["app.proxy2.broker.example.de"], "body": "生命、宇宙和一切的终极问题的答案是什么?", "failure_strategy": {"retry":{"backoff_millisecs":1000,"max_tries":5}}, "ttl": "60s", "metadata": "代理可读取此字段" } ]
创建或更新任务的结果。当前body大小限制为10MB。
PUT/v1/tasks/<task_id>/results/<app_id>Authorization: ApiKey <BeamID> <ApiKey>示例:
bashcurl -k -X PUT --json '{"from":"app.proxy2.broker.example.de","metadata":["任意","数据类型","都是","允许的"],"status":"succeeded","body":"答案是42","task":"70c0aa90-bfcf-4312-a6af-42cbd57dc0b8","to":["app.proxy1.broker.example.de"]}' \ -H "Authorization: ApiKey app.proxy2.broker.example.de AppKey" \ [***]
响应:
HTTP/1.1 204 No Content Content-Length: 0
任务提交者调用此端点来检索结果。
GET/v1/tasks/<task_id>/resultsAuthorization: ApiKey <BeamID> <ApiKey>示例:
bashcurl -k -H "Authorization: ApiKey app.proxy1.broker.example.de AppKey" \ [***]
响应:
json[ { "from": "app.proxy2.broker.example.de", "to": ["app.proxy1.broker.example.de"], "task": "70c0aa90-bfcf-4312-a6af-42cbd57dc0b8", "status": "succeeded", "body": "答案是42", "metadata": ["任意","数据类型","都是","允许的"] } ]
所有读取端点都支持长轮询,作为常规(重复)轮询的高效替代方案。
wait_count: API调用将阻塞,直到有这么多结果可用wait_time: 阻塞的最长时间(如果未指定单位,默认为秒)示例:
bash# 阻塞直到有1个结果可用或30秒过去 curl -k -H "Authorization: ApiKey app.proxy1.broker.example.de AppKey" \ [***]
为了更好地支持异步用例,开发版本支持服务器发送事件(Server-Sent Events)用于结果检索。
GET/v1/tasks/<task_id>/results?wait_count=3Accept: text/event-stream示例:
bashcurl -k -H "Accept: text/event-stream" \ -H "Authorization: ApiKey app.proxy1.broker.example.de AppKey" \ [***]
响应:
event: new_result data: {"body":"答案是42","from":"app.proxy2.broker.example.de","metadata":["任意","数据类型","都是","允许的"],"status":"succeeded","task":"70c0aa90-bfcf-4312-a6af-42cbd57dc0b8","to":["app.proxy1.broker.example.de"]}
监控Samply.Beam组件的运行状态。
GET/v1/healthProxy响应:
HTTP/1.1 200 OK Content-Length: 0
Broker响应:
json{ "summary": "healthy", "vault": { "status": "ok" } }
开发环境包含一个broker和两个proxy:
bash# 启动开发环境 ./dev/beamdev start # 或在后台运行服务 ./dev/beamdev start_bg docker-compose logs -f
bashdocker run -d \ --name beam-broker \ -p 8080:8080 \ -e RUST_LOG=info \ -e BROKER_ID=broker.example.de \ -e VAULT_ADDR=[***] \ -e VAULT_TOKEN=your-vault-token \ samply/beam-broker:latest
bashdocker run -d \ --name beam-proxy \ -p 8081:8080 \ -e RUST_LOG=info \ -e PROXY_ID=proxy1.broker.example.de \ -e BROKER_URL=[***] \ -v ./privkey.pem:/app/privkey.pem \ -v ./rootcert.pem:/app/rootcert.pem \ samply/beam-proxy:latest
yamlversion: '3.8' services: vault: image: hashicorp/vault:latest ports: - "8200:8200" environment: - VAULT_DEV_ROOT_TOKEN_ID=dev-root-token - VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200 cap_add: - IPC_LOCK command: server -dev broker: image: samply/beam-broker:latest depends_on: - vault ports: - "8080:8080" environment: - RUST_LOG=info - BROKER_ID=broker.example.de - VAULT_ADDR=[***] - VAULT_TOKEN=dev-root-token restart: unless-stopped proxy1: image: samply/beam-proxy:latest depends_on: - broker ports: - "8081:8080" environment: - RUST_LOG=info - PROXY_ID=proxy1.broker.example.de - BROKER_URL=[***] - ROOTCERT_FILE=/app/rootcert.pem - PRIVKEY_FILE=/app/privkey.pem volumes: - ./proxy1/privkey.pem:/app/privkey.pem - ./proxy1/rootcert.pem:/app/rootcert.pem restart: unless-stopped proxy2: image: samply/beam-proxy:latest depends_on: - broker ports: - "8082:8080" environment: - RUST_LOG=info - PROXY_ID=proxy2.broker.example.de - BROKER_URL=[***] - ROOTCERT_FILE=/app/rootcert.pem - PRIVKEY_FILE=/app/privkey.pem volumes: - ./proxy2/privkey.pem:/app/privkey.pem - ./proxy2/rootcert.pem:/app/rootcert.pem restart: unless-stopped
| 环境变量 | 描述 | 默认值 |
|---|---|---|
BROKER_ID | Broker的BeamID | broker.example.de |
VAULT_ADDR | Hashicorp Vault地址 | `[***] |
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429