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
相关产品推荐
相关产品推荐

