First Ticket νλ‘μ νΈμ λκΈ°μ΄ μλΉμ€.
ν°μΌ μ€ν μ νΈλν½ νμ¦μ μ μ΄νκΈ° μν λκΈ°μ΄ μμ€ν
μ μ 곡νλ€.
ν°μΌ μλ§€κ° μ΄λ¦¬λ©΄ νΈλν½μ΄ μκ°μ μΌλ‘ νμ¦νμ¬ μλ§€ μμ€ν
μ κ³ΌλΆνκ° λ°μνλ€.
queue-service λ μ¬μ©μλ₯Ό λκΈ°μ΄μ μ€ μΈμ°κ³ μΌμ μΈμμ©λ§ μ
μ₯μ μΉμΈνμ¬ νΈλν½μ μ μ΄νλ€.
- μ¬μ©μκ° ν μ§μ β λκΈ° ν ν° λ°κΈ + μλ² λΆμ¬ + Redis Hash μ ν ν° μ 보 μ μ₯
- ν΄λΌμ΄μΈνΈκ° ν΄λ§μΌλ‘ μκΈ° μλ² μ‘°ν (μλ²κ° κΆμ₯ ν΄λ§ κ°κ²©μ λμ μΌλ‘ μλ΅)
AdmissionSchedulerκ° μ μλ²batchSizeλͺ μ μ μ₯ μΉμΈ- μ μ₯ μΉμΈλ μ¬μ©μμκ² JWT μ μ₯ ν ν° λ°κΈ
- μ¬μ©μλ μ μ₯ ν ν°μ κ°μ§κ³ μλ§€ μλΉμ€λ‘ μ§μ
program-service μ μ΄λ²€νΈλ₯Ό μμ νμ¬ ProgramMeta (Read Model) λ₯Ό μ μ§νλ€:
| μ΄λ²€νΈ | μ²λ¦¬ |
|---|---|
program.created |
λκΈ°μ΄ νμ± μ 보 μ μ₯ |
program.time.updated |
νμ± μκ° κ°±μ |
program.cancelled |
λκΈ°μ΄ μ 리 |
| νλͺ© | κΈ°μ |
|---|---|
| μ μ₯μ | Redis (λκΈ° ν ν°, ProgramMeta) + PostgreSQL (Kafka Inbox) |
| λ©μμ§ λΈλ‘컀 | Apache Kafka |
| JWT | jjwt 0.12.6 |
κ³΅ν΅ κΈ°μ μ€νμ κ³΅ν΅ README μ°Έκ³ .
DDD + ν₯μ¬κ³ λ μν€ν μ² κΈ°λ°
com.firstticket.queueservice
βββ queuetoken/ # QueueToken Aggregate (λκΈ° ν ν° κ΄λ¦¬)
β βββ domain/ # λλ©μΈ λͺ¨λΈ, VO, Enum, Exception, Repository μΈν°νμ΄μ€
β βββ application/ # λκΈ° ν ν° κ΄λ¦¬ μλΉμ€, Command/Query/Result DTO
β βββ config/ # Aggregate μ μ© μ€μ
β βββ infrastructure/ # Redis Repository, Lua Script, JWT λ°κΈκΈ°, μ€μΌμ€λ¬
β βββ presentation/ # REST Controller, Response DTO, Polling μ μ±
βββ programmeta/ # ProgramMeta Aggregate (μΈλΆ μ΄λ²€νΈ Read Model)
β βββ domain/ # λλ©μΈ λͺ¨λΈ, VO, Enum, Exception, Repository μΈν°νμ΄μ€, λλ©μΈ μ΄λ²€νΈ ν¬νΈ
β βββ application/ # μ΄λ²€νΈ μ²λ¦¬ μλΉμ€, Command Dto
β βββ infrastructure/ # Kafka Consumer, Redis Repository, λλ©μΈ μ΄λ²€νΈ μ΄λν°
βββ shared/ # Aggregate κ° κ³΅μ μμ
βββ config/ # μ μ μ€μ
| Method | Path | μ€λͺ |
|---|---|---|
| POST | /api/v1/queues/programs/{programId} |
λκΈ°μ΄ μ§μ (λκΈ° ν ν° λ°κΈ) |
| GET | /api/v1/queues/programs/{programId} |
λκΈ° / μ μ₯ μν μ‘°ν (ν΄λ§) |
| DELETE | /api/v1/queues/programs/{programId} |
λκΈ° μ·¨μ |
μμΈν μμ² / μλ΅ μμλ REST Docs μ°Έμ‘°: http://localhost:8085/docs/index.html
| νκ²½ | ν¬νΈ |
|---|---|
| local | 8085 |
| prod | 8080 (컨ν μ΄λ λ΄λΆ) |
λ€μ μΈνλΌκ° λ¨Όμ μ€νλμ΄ μμ΄μΌ νλ€.
- infra λ ν¬μ docker-compose β Redis, kafka, PostgreSQL, Zipkin
- eureka-server β μλΉμ€ λμ€μ»€λ²λ¦¬
- config-server β μ€μ κ΄λ¦¬ μλ²
- program-service β Kafka μ΄λ²€νΈ λ°ν
CONFIG_SERVER_USERNAME=
CONFIG_SERVER_PASSWORD=
GITHUB_USER=
GITHUB_TOKEN=.env.example νμΌμ μ°Έκ³ νμ¬ .env λ₯Ό μμ±νλ€.
μ€μ μ config-repo μμ κ΄λ¦¬νλ€.
κ³΅ν΅ (application.yml)
- Redis / PostgreSQL / Kafka μ°κ²° μ 보
- Zipkin, Prometheus
- Kafka Producer / Consumer κΈ°λ³Έκ° (idempotence, retries λ±)
queue-service μ μ© (queue-service.yml)
- ν μ μ±
:
queue.token.waiting-ttl,queue.token.admission-batch-size - JWT:
queue.jwt.secret,queue.jwt.entry-token-ttl - Kafka ν ν½ λ§€ν:
kafka.topics.* - Inbox νμ±ν:
messaging.inbox.enabled - μ€ν€λ§:
queue_schema(JPA + Flyway)
νκ²½λ³ (queue-service-{profile}.yml)
- ν¬νΈ, JWT TTL λ± νκ²½ μμ‘΄ μ€μ
curl http://localhost:8085/actuator/health
# β {"status":"UP"}