c7a02c3905
5 层 + 1 条 NATS 零拷贝消息总线的 monorepo(Monolith First → Microservices Morph B)。 纵向主干(任务流 + Token 流回流)已真实跑通,横向各层能力为带注释的桩。 已贯通(real code): - sundynix-shared: 共享契约 + JetStream/core NATS 真实收发(bus) + 内嵌 NATS(devnats) + e2e 测试 - sundynix-gateway: Gin 接入 + DSL 解析组装 + NATS Publish + SSE 流式输出 - sundynix-dispatcher: NATS 消费 + Eino Orchestrator 流式回流 + 熔断器 + LLM Pool 占位流式 - 链路: HTTP POST → DSL → sundynix.tasks.* → Dispatcher → Token 经 sundynix.streams.<id> 回流 → SSE - 基础设施: docker-compose(nats/postgres/redis/neo4j/milvus) + Makefile(make demo/e2e) 待填(桩): - Eino 图编排 compose.NewGraph、LLM Pool 接 vLLM/Ollama - Gateway store 换真实 pgx/redis - sundynix-mcp-go: Bleve+Milvus+Neo4j 混合检索 / UniOffice / 外部 API - sundynix-mcp-py: gVisor 沙箱 / MinerU(PaddleOCR) / Docker 解释器 - sundynix-desktop: React Flow 画布 → DSL 导出 → SSE 展示
47 lines
1.8 KiB
Bash
Executable File
47 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 无 Docker 的最小任务流演示:devnats(内嵌NATS) + gateway + dispatcher。
|
||
# 提交一个 DSL 任务,验证 Gateway → NATS → Dispatcher 全链路。
|
||
set -euo pipefail
|
||
cd "$(dirname "$0")/.."
|
||
|
||
mkdir -p .bin
|
||
echo "== 编译 =="
|
||
( cd sundynix-shared && go build -o ../.bin/devnats ./cmd/devnats )
|
||
( cd sundynix-gateway && go build -o ../.bin/gateway ./cmd/server )
|
||
( cd sundynix-dispatcher && go build -o ../.bin/dispatcher ./cmd/dispatcher )
|
||
|
||
cleanup() { kill "${GW_PID:-}" "${DISP_PID:-}" "${NATS_PID:-}" 2>/dev/null || true; }
|
||
trap cleanup EXIT
|
||
|
||
# 若 :4222 已有 NATS(docker compose 的容器),直接复用;否则起内嵌 devnats。
|
||
if nc -z 127.0.0.1 4222 2>/dev/null; then
|
||
echo "== 检测到已运行的 NATS(:4222),复用之 =="
|
||
else
|
||
echo "== 启动内嵌 devnats =="
|
||
.bin/devnats > .bin/devnats.log 2>&1 & NATS_PID=$!
|
||
for _ in $(seq 1 30); do nc -z 127.0.0.1 4222 2>/dev/null && break || sleep 0.2; done
|
||
fi
|
||
|
||
echo "== 启动 dispatcher / gateway =="
|
||
.bin/dispatcher > .bin/dispatcher.log 2>&1 & DISP_PID=$!
|
||
.bin/gateway > .bin/gateway.log 2>&1 & GW_PID=$!
|
||
|
||
for _ in $(seq 1 30); do
|
||
curl -s -o /dev/null http://127.0.0.1:8080/api/v1/billing && break || sleep 0.3
|
||
done
|
||
|
||
echo "== 提交 DSL 任务 =="
|
||
RESP=$(curl -s -X POST http://127.0.0.1:8080/api/v1/tasks \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{"nodes":[{"id":"n1","type":"agent","data":{"prompt":"hello"}}],"edges":[]}')
|
||
echo "$RESP"
|
||
TASK_ID=$(echo "$RESP" | sed -n 's/.*"task_id":"\([^"]*\)".*/\1/p')
|
||
|
||
echo "== 订阅 SSE Token 流 (Gateway ← NATS ← Dispatcher) =="
|
||
# 客户端在 TTFT(700ms) 内连上即可收全部 token;--max-time 超时(exit 28) 属正常,不让 set -e 中断
|
||
curl -sN --max-time 10 "http://127.0.0.1:8080/api/v1/tasks/$TASK_ID/stream" || true
|
||
echo
|
||
|
||
echo "== dispatcher 日志 =="
|
||
cat .bin/dispatcher.log
|