server: port: ${PATBOND_CREATION_PORT:8085} spring: application: name: patbond-creation datasource: # 与 patbond-user 共库(MVP 单库多 schema);本服务只读写 creation schema, # 并只读 community.posts 的 generation_job_id 关联(建草稿由 community 端点完成)。 # Flyway 迁移链(V1..V6,含 creation 基线)由 patbond-user 启动时统一执行, # 本服务不携带 Flyway —— 单一 flyway_schema_history 归属不拆(ADR-023 §2)。 url: ${PATBOND_DB_URL:jdbc:postgresql://127.0.0.1:5432/patbond} username: ${PATBOND_DB_USER:patbond} password: ${PATBOND_DB_PASSWORD:patbond} # /api/v1/** 业务端点自骨架起即接 RS256 校验,与 user/pet/community 同一约定。 patbond: jwt: # RS256 公钥,用于本地校验 patbond-auth 签发的 access token。 # 值可以是 PEM 文件路径,也可以是内联 PEM 内容(以 -----BEGIN 开头)。 # 私钥只给 patbond-auth,绝不入库。 public-key: ${PATBOND_JWT_PUBLIC_KEY:} # /internal/** 服务间共享密钥(Java↔Java 既有通道),需与 patbond-user 同值。 # 注意:调用 patbond-ai 用的**不是**这个 token,而是下面的服务身份 JWT # ——两套机制并存的原因见 ADR-023 §5。 internal-token: ${PATBOND_INTERNAL_TOKEN:dev-only-internal-token} user-service: # 预签名上传凭证来源:patbond-user 的 /internal/media/**(ADR-017 边界: # 媒体上传流程归 user,本服务不直连对象存储、也不持有其凭证)。 url: ${PATBOND_USER_SERVICE_URL:http://127.0.0.1:8082} creation: # ---- 上游生成服务(patbond-ai,Python)---- ai-service: url: ${PATBOND_AI_SERVICE_URL:http://127.0.0.1:8000} # 单次 HTTP 调用超时。注意这是**提交/查询**的超时,不是生成耗时—— # Java↔Python 边界一律异步(ADR-023 §4),故此值与出图出片时长无关, # 不得为了「等出图」而调大。 connect-timeout: ${PATBOND_AI_CONNECT_TIMEOUT:2s} read-timeout: ${PATBOND_AI_READ_TIMEOUT:5s} # ---- 服务身份 JWT(ADR-023 §5)---- # **独立密钥对**,与用户 token 的密钥对不同。理由:现有 JwtVerifier 只验 # 签名、不校验 aud/iss,用户 token 亦无 aud claim;若复用同一密钥对, # 四个模块都会把服务票当合法用户 token 接受。独立密钥对无需改动任何 # 已发布的验证器。私钥只给本服务,公钥给 patbond-ai。 service-token: private-key: ${PATBOND_SERVICE_JWT_PRIVATE_KEY:} issuer: ${PATBOND_SERVICE_JWT_ISSUER:patbond-api} audience: ${PATBOND_SERVICE_JWT_AUDIENCE:patbond-ai} subject: ${PATBOND_SERVICE_JWT_SUBJECT:service:creation-worker} # 短有效期:服务票每次调用现签,不缓存、不复用。 ttl: ${PATBOND_SERVICE_JWT_TTL:5m} # ---- Worker 与租约(ADR-023 §3/§4)---- worker: # 关掉后本服务只提供读写端点、不消费队列(便于单实例调试与测试隔离)。 enabled: ${PATBOND_CREATION_WORKER_ENABLED:true} # 调度器 tick 间隔。真正的轮询节律由 next_attempt_at 控制, # tick 只决定「最快多久发现一件该做的事」。 tick-interval: ${PATBOND_CREATION_TICK_INTERVAL:3s} # 单 tick 最多领取多少条,防止一个实例吃光整个队列。 batch-size: ${PATBOND_CREATION_BATCH_SIZE:5} # 租约时长。**必须大于最长的单次轮询间隔**(见下 poll-interval-late), # 否则会出现「任务仍在跑但租约过期被他人抢占」。每次轮询顺带续租。 lease-ttl: ${PATBOND_CREATION_LEASE_TTL:60s} # 服务端轮询 patbond-ai 的退避节律(ADR-023 §4)。视频任务绝对次数很多, # 固定 3s 会产生数百次无谓轮询与续租写入。 poll-interval-early: ${PATBOND_CREATION_POLL_EARLY:3s} # 前 60 秒 poll-interval-mid: ${PATBOND_CREATION_POLL_MID:10s} # 60s ~ 5min poll-interval-late: ${PATBOND_CREATION_POLL_LATE:30s} # 5min 以后 poll-early-until: ${PATBOND_CREATION_POLL_EARLY_UNTIL:60s} poll-mid-until: ${PATBOND_CREATION_POLL_MID_UNTIL:5m} # 失败重试的指数退避基数(实际间隔 = base * 2^(attempt-1))。 retry-backoff-base: ${PATBOND_CREATION_RETRY_BACKOFF:30s} # 客户端硬超时由服务端下发而非客户端硬编码(ADR-023 §10):图片与视频 # 差一个量级,硬编码两个数会使换 provider 就要发版。 client-timeout-image: ${PATBOND_CREATION_CLIENT_TIMEOUT_IMAGE:5m} client-timeout-video: ${PATBOND_CREATION_CLIENT_TIMEOUT_VIDEO:20m} # 任务被判定为僵死的阈值(running 超过此时长)。对应客户端的第六个 UI 态, # 它不是错误态(ADR-023 §10)。 stale-after-image: ${PATBOND_CREATION_STALE_IMAGE:10m} stale-after-video: ${PATBOND_CREATION_STALE_VIDEO:40m}