- 10개 모듈 추가/확장(au py rc st lg cl mm vl mg cm), 각 30 서비스 = 330 + tmsrv - build.sh 자동발견으로 11 모듈서버 + dbio 라이브러리 23 + 배치 22 빌드 - schema.d 11파일 → 75 테이블, 모듈별 disjoint - 부팅 리소스 규명: fs.mqueue.queues_max=8192(330큐>256), NDRX_MSGSIZEMAX 16000· MSGMAX 50(큐당 5.6MB→0.8MB), msgqueue ulimit 2GB → 전 12서버 runok - 검증: xadmin psc 333 AVAIL, 매입체인 XA 커밋, prepared_xacts=0 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
119 lines
5.8 KiB
SQL
119 lines
5.8 KiB
SQL
-- mg 모듈 (전문게이트웨이 / message gateway) 스키마
|
|
-- ISO8583 전문 로그/라우팅/채번/채널세션/큐/통계 테이블.
|
|
-- Loaded into PostgreSQL on first boot (docker-entrypoint-initdb.d). Prefix 60.
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- 전문 채번 (STAN / 전문 시퀀스) - MG_STAN 이 nextval 로 채번
|
|
-- ---------------------------------------------------------------------------
|
|
CREATE SEQUENCE IF NOT EXISTS mg_stan_seq; -- System Trace Audit Number
|
|
CREATE SEQUENCE IF NOT EXISTS mg_msg_seq; -- 전문 로그 PK
|
|
CREATE SEQUENCE IF NOT EXISTS mg_route_seq; -- 라우팅 룰 PK
|
|
CREATE SEQUENCE IF NOT EXISTS mg_queue_seq; -- 송수신 큐 PK
|
|
|
|
-- 이름있는 카운터 (세션 시퀀스 등 채번용 - MG_SESSION/MG_KEYEXCH)
|
|
CREATE TABLE IF NOT EXISTS mg_seq (
|
|
seq_name TEXT PRIMARY KEY,
|
|
seq_val BIGINT NOT NULL DEFAULT 0,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- 전문 로그 (mg_msg_log) - 수신/송신 전문의 원장
|
|
-- ---------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS mg_msg_log (
|
|
msg_id BIGINT PRIMARY KEY,
|
|
stan BIGINT NOT NULL, -- 전문 추적번호
|
|
mti TEXT NOT NULL, -- 전문유형(0200/0210/0800...)
|
|
channel TEXT NOT NULL, -- 채널ID
|
|
direction TEXT NOT NULL, -- IN / OUT
|
|
proc_code TEXT NOT NULL DEFAULT '000000', -- 처리코드
|
|
bitmap TEXT NOT NULL DEFAULT '', -- 비트맵(hex)
|
|
amount BIGINT NOT NULL DEFAULT 0,
|
|
pan TEXT NOT NULL DEFAULT '', -- (마스킹된) 카드번호
|
|
mac TEXT NOT NULL DEFAULT '', -- 메시지 인증코드
|
|
rc TEXT NOT NULL DEFAULT '00', -- 응답코드
|
|
raw_msg TEXT NOT NULL DEFAULT '', -- 원 전문
|
|
status TEXT NOT NULL DEFAULT 'R', -- R=수신, S=송신, A=ACK, N=NACK, C=확인
|
|
biz_date DATE NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
CREATE INDEX IF NOT EXISTS ix_mg_msg_log_stan ON mg_msg_log (stan);
|
|
CREATE INDEX IF NOT EXISTS ix_mg_msg_log_chan ON mg_msg_log (channel, biz_date);
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- 라우팅 룰 (mg_route) - 채널/전문유형 -> 목적지 매핑
|
|
-- ---------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS mg_route (
|
|
route_id BIGINT PRIMARY KEY,
|
|
channel TEXT NOT NULL,
|
|
mti TEXT NOT NULL,
|
|
dest TEXT NOT NULL, -- 목적지 서비스/노드
|
|
priority INTEGER NOT NULL DEFAULT 100,
|
|
active BOOLEAN NOT NULL DEFAULT true,
|
|
biz_date DATE NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
CREATE INDEX IF NOT EXISTS ix_mg_route_lookup ON mg_route (channel, mti, active);
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- 채널 (mg_channel) - 세션/사인온 상태
|
|
-- ---------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS mg_channel (
|
|
channel TEXT PRIMARY KEY,
|
|
name TEXT NOT NULL DEFAULT '',
|
|
status TEXT NOT NULL DEFAULT 'DOWN', -- UP / DOWN / SIGNON / SIGNOFF
|
|
session_key TEXT NOT NULL DEFAULT '',
|
|
last_stan BIGINT NOT NULL DEFAULT 0,
|
|
signon_at TIMESTAMPTZ,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- 송수신 큐 (mg_queue) - 재전송 대상 관리
|
|
-- ---------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS mg_queue (
|
|
queue_id BIGINT PRIMARY KEY,
|
|
stan BIGINT NOT NULL,
|
|
channel TEXT NOT NULL,
|
|
mti TEXT NOT NULL DEFAULT '',
|
|
payload TEXT NOT NULL DEFAULT '',
|
|
status TEXT NOT NULL DEFAULT 'Q', -- Q=대기, S=송신, D=완료, F=실패
|
|
retry_cnt INTEGER NOT NULL DEFAULT 0,
|
|
biz_date DATE NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
CREATE INDEX IF NOT EXISTS ix_mg_queue_status ON mg_queue (status, biz_date);
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- 채널 일별 통계 (mg_stat) - mg_stat_batch 가 채움
|
|
-- ---------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS mg_stat (
|
|
channel TEXT NOT NULL,
|
|
biz_date DATE NOT NULL,
|
|
in_cnt BIGINT NOT NULL DEFAULT 0,
|
|
out_cnt BIGINT NOT NULL DEFAULT 0,
|
|
err_cnt BIGINT NOT NULL DEFAULT 0,
|
|
amount_sum BIGINT NOT NULL DEFAULT 0,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (channel, biz_date)
|
|
);
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- Seed: 채널 + 기본 라우팅 룰
|
|
-- ---------------------------------------------------------------------------
|
|
INSERT INTO mg_channel (channel, name, status) VALUES
|
|
('CH01', 'VAN 게이트웨이', 'DOWN'),
|
|
('CH02', '매입사 링크', 'DOWN'),
|
|
('CH03', '해외 네트워크', 'DOWN')
|
|
ON CONFLICT (channel) DO NOTHING;
|
|
|
|
INSERT INTO mg_route (route_id, channel, mti, dest, priority, active, biz_date) VALUES
|
|
(nextval('mg_route_seq'), 'CH01', '0200', 'ACQUIRE', 10, true, '2026-07-19'),
|
|
(nextval('mg_route_seq'), 'CH01', '0800', 'MG_ECHO', 20, true, '2026-07-19'),
|
|
(nextval('mg_route_seq'), 'CH02', '0200', 'ACQ_EDC', 10, true, '2026-07-19')
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
INSERT INTO mg_seq (seq_name, seq_val) VALUES
|
|
('SESSION', 0), ('KEYVER', 0)
|
|
ON CONFLICT (seq_name) DO NOTHING;
|