Initialize RTGS prototype repository
3센터 A-A-A RTGS 실시간총액결제 프로토타입 최초 버전관리 시작. - backend: Kotlin/Gradle 멀티모듈(sequencer, common, 채널/센터 모듈) - frontend: Vite + TS - infra: docker-compose, prometheus/grafana, ELK 네이티브 스크립트 - loadtest(k6), sim(장애/순서/정합성 시나리오), docs(PoC 보고서/복원력방안)
This commit is contained in:
57
sim/lib.sh
Normal file
57
sim/lib.sh
Normal file
@@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env bash
|
||||
# RTGS 검증 하니스 공통 함수 (복원력방안 부록A 재현: S1/S2/S4)
|
||||
# 포터블 Git Bash에서 실행. 실행 중인 DC1 스택(인프라+6서비스)을 전제로 한다.
|
||||
set -u
|
||||
|
||||
PG_BIN="/c/ai-dev/apps/postgresql-16.4/bin/psql.exe"
|
||||
KAFKA_PROD="/c/ai-dev/apps/kafka-3.8.1/bin/windows/kafka-console-producer.bat"
|
||||
JPS="/c/ai-dev/apps/jdk-21/bin/jps"
|
||||
JAVA="C:\\ai-dev\\apps\\jdk-21\\bin\\java.exe"
|
||||
JAR_DIR="C:\\ai-dev\\workspace\\rtgs\\backend"
|
||||
CHANEL="http://localhost:8091"
|
||||
NS="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08"
|
||||
|
||||
PSQL() { PGCLIENTENCODING=UTF8 "$PG_BIN" -h localhost -p 5433 -U rtgs -d rtgs "$@"; }
|
||||
q() { PSQL -t -A -c "$1" | tr -d '[:space:]'; } # 스칼라 결과(공백 제거)
|
||||
|
||||
pass() { echo " [PASS] $1"; }
|
||||
fail() { echo " [FAIL] $1"; FAILED=1; }
|
||||
hr() { echo "------------------------------------------------------------"; }
|
||||
|
||||
# 정식 pacs.008.001.08 전문 생성 후 접수(curl). 인자: from to amount bmi
|
||||
submit() {
|
||||
local from=$1 to=$2 amt=$3 bmi=$4
|
||||
local xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?><Document xmlns=\"$NS\"><FIToFICstmrCdtTrf>\
|
||||
<GrpHdr><MsgId>$bmi</MsgId><CreDtTm>2026-07-10T12:00:00</CreDtTm><NbOfTxs>1</NbOfTxs>\
|
||||
<SttlmInf><SttlmMtd>CLRG</SttlmMtd></SttlmInf></GrpHdr><CdtTrfTxInf>\
|
||||
<PmtId><EndToEndId>$bmi</EndToEndId></PmtId><IntrBkSttlmAmt Ccy=\"KRW\">$amt</IntrBkSttlmAmt>\
|
||||
<ChrgBr>SLEV</ChrgBr><Dbtr><Nm>BANK-$from</Nm></Dbtr>\
|
||||
<DbtrAcct><Id><Othr><Id>ACC-$from</Id></Othr></Id></DbtrAcct>\
|
||||
<DbtrAgt><FinInstnId><ClrSysMmbId><MmbId>$from</MmbId></ClrSysMmbId></FinInstnId></DbtrAgt>\
|
||||
<CdtrAgt><FinInstnId><ClrSysMmbId><MmbId>$to</MmbId></ClrSysMmbId></FinInstnId></CdtrAgt>\
|
||||
<Cdtr><Nm>BANK-$to</Nm></Cdtr><CdtrAcct><Id><Othr><Id>ACC-$to</Id></Othr></Id></CdtrAcct>\
|
||||
</CdtTrfTxInf></FIToFICstmrCdtTrf></Document>"
|
||||
curl -s -m 8 -X POST "$CHANEL/pay/customer" -H "Content-Type: application/xml" --data-binary "$xml" >/dev/null
|
||||
}
|
||||
|
||||
# 22자리 유일 BMI 생성. 인자: 기관코드(4) 인덱스
|
||||
mkbmi() { printf '20260710%04d%010d' "$1" "$(( ($(date +%s) % 1000000) * 100 + $2 ))"; }
|
||||
|
||||
# 미완결(PDNG/ACSP) 잔류가 0이 될 때까지 대기(최대 초). 인자: timeout_sec
|
||||
wait_drain() {
|
||||
local t=${1:-40} n
|
||||
for ((i=0;i<t;i++)); do
|
||||
n=$(q "SELECT count(*) FROM transfer WHERE status IN ('PDNG','ACSP')")
|
||||
[ "$n" = "0" ] && return 0
|
||||
sleep 1
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
# 서비스 PID(jar 이름으로). 인자: 서비스명(sequencer/hermes 등)
|
||||
pid_of() { "$JPS" -l | grep -i "$1-0.1.0.jar" | awk '{print $1}' | head -1; }
|
||||
|
||||
# 서비스 기동(새 콘솔 창). 인자: 표시명 서비스명
|
||||
start_svc() {
|
||||
cmd //c start "$1" cmd //k "$JAVA -jar $JAR_DIR\\$2\\build\\libs\\$2-0.1.0.jar"
|
||||
}
|
||||
Reference in New Issue
Block a user