acquire-core-x/README.md
forge-bot e6e29e6b5d Phase 1: 실동작 Enduro/X + PostgreSQL XA 매입 슬라이스
- Enduro/X 7.0.12 소스빌드 이미지(-DENABLE_POSTGRES=ON, libndrxxaecpg XA 스위치)
- docker-compose: postgres(max_prepared_transactions=100) + endurox app
- ECPG XA 서비스 3종: ACQUIRE→RECONCILE→SETTLE (tpservice + EXEC SQL)
- 클라이언트 tpbegin/tpcall체인/tpcommit → tmsrv 2PC(prepare/commit) 원자 커밋
- 검증: 서비스 AVAIL, 커밋 row(status=S) psql 확인, 롤백 시 무잔존, pg_prepared_xacts=0
- 규명된 런타임 요건: sysctl fs.mqueue.*, ulimit msgqueue/nofile, XA open-str JSON
- docs/architecture.md, README, service-catalog 설계

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 09:16:12 +00:00

56 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# acquire-core-x — 카드 매입·정산 시스템 (실동작 Enduro/X)
실제 **Enduro/X**(오픈소스 Tuxedo/ATMI TP 모니터) + **ECPG/PostgreSQL** 위에서
**실제로 기동·트랜잭션 처리되는** 카드 매입·정산 레거시 시스템. 포지(Klaro Forge)
자율 마이그레이션 도구의 대형 전환 대상 픽스처 — 이 C/ATMI 시스템을 Java Spring Boot로
전환한다.
> 앞서의 `acquire-core-full`(자체 TxCore 셔임, 컴파일만 되는 픽스처)과 달리, 이 프로젝트는
> **진짜 TP 미들웨어에서 tpcall·XA 트랜잭션이 실제로 동작**한다. (사용자 요구 = B방식)
## 스택
| 계층 | 실체 |
|---|---|
| TP 모니터 | Enduro/X 7.0.12 (오픈 Tuxedo/ATMI: `tpservice`/`tpcall`/`tpadvertise`/`tpbegin`) — 소스빌드 |
| 전문 버퍼 | UBF (≈FML32): `Bget`/`Bchg`, 필드테이블 `mkfldhdr` |
| DB 접근 | ECPG (`EXEC SQL`) → PostgreSQL 15 |
| 분산 트랜잭션 | XA 2PC — `libndrxxaecpg.so` ECPG XA 스위치, `tmsrv`가 조율 |
| 오케스트레이션 | `ndrxd` + `ndrxconfig.xml` + `app.ini`(CCONFIG) |
## 실행 (docker-compose)
```bash
docker compose -f docker/docker-compose.yml up -d --build # postgres + endurox app
```
### 필수 런타임 요건 (없으면 ndrxd 부팅 실패 — 실측으로 규명됨)
POSIX 큐/세마포어 한도 때문에 app 컨테이너에 반드시 필요:
```yaml
sysctls:
fs.mqueue.msg_max: "512"
fs.mqueue.msgsize_max: "65536"
ulimits:
msgqueue: 536870912 # 큐 1개 = msg_max×msgsize_max ≈ 5.6MB, 기본 RLIMIT_MSGQUEUE(800KB) 초과
nofile: 65536
```
PostgreSQL는 XA(2단계 커밋) 위해 `-c max_prepared_transactions=100`.
## 구성
- `docker/``endurox.Dockerfile`(Enduro/X 소스빌드, `-DENABLE_POSTGRES=ON`), `docker-compose.yml`
- `db/``schema.sql`(merchant/purchase/approval/settlement/ledger …)
- `app/``conf/`(ndrxconfig.xml, app.ini, 환경), `ubftab/`(UBF 필드테이블),
서비스 `.pgc`/`.c`, `entrypoint.sh`
- `docs/``architecture.md`, `service-catalog.md`
- `ref/` — Enduro/X upstream PostgreSQL 통합테스트(참고용, .gitignore)
- `slice/` — 최초 검증용 non-DB ATMI 슬라이스(부팅+tpcall 증명 완료)
## 검증 상태
- [x] Enduro/X 소스빌드 (PostgreSQL XA 포함) → 이미지 `acquire-x/endurox:7.0.12`
- [x] `ndrxd` 부팅 (10 프로세스 runok)
- [x] 커스텀 `tpservice` advertise + **실제 `tpcall` 왕복** (ACQUIRE: fee=2500 net=997500)
- [x] ECPG XA 서비스 체인(매입→대사→정산) + 커밋 row psql 검증 + 롤백 검증 ✅
- [ ] 2000본+ 확장 (Phase 2)
- [ ] 포지 마이그레이션 → Spring Boot (Phase 3)