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>
This commit is contained in:
commit
e6e29e6b5d
19 changed files with 1005 additions and 0 deletions
56
README.md
Normal file
56
README.md
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
# 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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue