You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debezium Server对接NATS JetStream报503无响应者错误求助

排查Debezium+NATS JetStream CDC配置中的503错误

我在配置Debezium+NATS JetStream实现变更数据捕获(CDC)时遇到以下错误:

Error Publishing: 503 No Responders Available For Request

复现步骤

  • 安装go-task
  • 安装docker-compose
  • 将application.properties复制到conf/debezium/application.properties
  • 将init.sql复制到mssql/init.sql
  • 执行命令:
task init
task debezium
# task clean # 用于清理环境

环境配置文件

docker-compose.yaml

services:
  nats:
    image: nats:${NATS_VERSION}
    ports:
      - 4222:4222
      - 8222:8222
    command:
      - "--debug"
      - "--http_port=8222"
      - "--jetstream"
    healthcheck:
      test: wget --no-verbose --tries=1 --spider http://localhost:8222/healthz || exit 1
      interval: 10s
      timeout: 5s
      retries: 3

  mssql:
    image: mcr.microsoft.com/mssql/server:${MSSQL_VERSION}
    hostname: mssql
    ports:
      - 1433:1433
    environment:
      ACCEPT_EULA: Y
      MSSQL_PID: Developer
      MSSQL_AGENT_ENABLED: True
      MSSQL_COLLATION: Cyrillic_General_CI_AS
      MSSQL_SA_PASSWORD: ${MSSQL_SA_PASSWORD}
    healthcheck:
      test: /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "${MSSQL_SA_PASSWORD}" -Q "SELECT 1" || exit 1
      interval: 10s
      timeout: 5s
      retries: 3

  debezium:
    image: debezium/server:${DEBEZIUM_VERSION}
    ports:
      - 8080:8080
    depends_on:
      - nats
      - mssql
    volumes:
      - $PWD/conf/debezium/application.properties:/debezium/conf/application.properties
      # - $PWD/data:/data/offsets.dat
    healthcheck:
      test: curl --silent http://localhost:8080/q/health || exit 1
      interval: 10s
      timeout: 5s
      retries: 3

application.properties

debezium.source.connector.class=io.debezium.connector.sqlserver.SqlServerConnector
debezium.source.offset.storage.file.filename=data/offsets.dat
debezium.source.offset.flush.interval.ms=0
debezium.source.schema.history.internal=io.debezium.storage.file.history.FileSchemaHistory
debezium.source.schema.history.internal.file.filename=data/schema_history.dat
debezium.source.topic.prefix=mssql
debezium.source.database.hostname=mssql
debezium.source.database.port=1433
debezium.source.database.user=dbz
debezium.source.database.password=pass
debezium.source.database.names=test_db
debezium.source.database.applicatiotnIntent=ReadOnly
debezium.source.database.encrypt=false
debezium.source.table.include.list=dbo.test_1,dbo.test_2
debezium.sink.type=nats-jetstream
debezium.sink.nats-jetstream.url=nats://nats:4222
debezium.sink.nats-jetstream.create-stream=true
debezium.sink.nats-jetstream.subjects=*.*.*
debezium.sink.nats-jetstream.storage=file
quarkus.log.level=DEBUG
quarkus.log.console.json=false

init.sql

CREATE DATABASE [test_db];

ALTER DATABASE [test_db] SET ALLOW_SNAPSHOT_ISOLATION ON;

GO

USE [test_db];

CREATE LOGIN dbz WITH PASSWORD = 'pass', CHECK_POLICY = OFF;
CREATE USER dbz FOR LOGIN dbz;

EXEC sys.sp_cdc_enable_db;

GRANT SELECT ON SCHEMA :: dbo TO dbz;
GRANT SELECT ON SCHEMA :: cdc TO dbz;

-- DROP TABLE [test_1];

CREATE TABLE [test_1] (
    id int,
    comment text,
    PRIMARY KEY(id)
);

GRANT SELECT ON dbo.[test_1] TO dbz;

EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'test_1', @role_name = NULL, @supports_net_changes = 0;

INSERT INTO [test_1] (id, comment) VALUES (1, 'text'), (2, 'text'), (3, 'text'), (4, 'text'), (5, 'text');

GO

Taskfile.yml

version: "3"

env:
  NATS_VERSION: "2.10-alpine"
  DEBEZIUM_VERSION: "2.6.2.Final"
  MSSQL_VERSION: "2019-latest"
  POSTGRES_VERSION: "16.3"
  POSTGRES_USER: user
  POSTGRES_PASSWORD: Password*
  POSTGRES_DB: test_db
  MSSQL_SA_PASSWORD: Password*
  MSSQL_DB: test_db

tasks:
  up:
    run: once
    cmds:
      - docker-compose up --wait --detach

  down:
    run: once
    cmds:
      - docker-compose stop

  clean:
    deps:
      - down
    cmds:
      - docker-compose rm -f

  init:
    run: once
    deps:
      - task: nats:init
      - task: mssql:init
      # - docker-compose up --wait --detach debezium

  mssql:up:
    cmds:
      - docker-compose up --wait --detach mssql

  mssql:init:
    deps:
      - task: mssql:up
    env:
      SQLCMDUSER: sa
      SQLCMDPASSWORD: "{{.MSSQL_SA_PASSWORD}}"
      SQLCMDSERVER: localhost
    cmds:
      - sqlcmd --input-file mssql/init.sql

  nats:up:
    cmds:
      - docker-compose up --wait --detach nats

  nats:init:
    deps:
      - task: nats:up
    cmds:
      - nats -s nats://127.0.0.1:4222 stream add --config conf/nats/stream.json

  debezium:
    cmds:
      - docker-compose up debezium --no-log-prefix

错误排查与解决方案

1. 修复流配置冲突

你已经设置了debezium.sink.nats-jetstream.create-stream=true,Debezium会自动创建匹配主题的流,但又通过task nats:init手动添加了流。如果手动创建的流的subjects配置不匹配Debezium实际发送的主题(格式为mssql.test_db.dbo.test_1),就会触发503错误。

解决方法:

  • 删除task nats:init步骤,让Debezium自动创建流;
  • 或者修改手动创建流的conf/nats/stream.json,确保subjects包含mssql.*.*.*或具体的mssql.test_db.dbo.test_1。

2. 修正配置拼写错误

application.properties中有一处拼写错误:

debezium.source.database.applicatiotnIntent=ReadOnly

应改为applicationIntent(缺少字母n),这个错误会导致SQL Server连接参数异常,影响CDC数据读取。

3. 修复文件存储权限

你注释掉了$PWD/data:/data/offsets.dat挂载,Debezium容器内的data目录可能没有写入权限,导致偏移量和schema历史无法持久化,引发运行异常。

解决方法:
取消挂载注释,确保宿主机data目录存在且权限正确:

volumes:
  - $PWD/conf/debezium/application.properties:/debezium/conf/application.properties
  - $PWD/data:/data

同时执行命令创建目录并设置权限:

mkdir -p data
chmod 777 data

4. 验证NATS连接可达性

容器depends_on仅保证启动顺序,不代表服务就绪。可以在Debezium容器内测试NATS连接:

docker exec -it <debezium-container-id> sh
apk add nats-cli
nats -s nats://nats:4222 ping

如果连接失败,检查NATS容器的端口映射和网络配置。

5. 确认CDC权限配置

在SQL Server中执行以下命令,确认test_1表的CDC已启用,且dbz用户有足够权限:

USE test_db;
EXEC sys.sp_cdc_help_change_data_capture;

内容的提问来源于stack exchange,提问作者Artem Klevtsov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:10:05