Skip to content

HOTSPOT-pro/HOTSPOT-BATCH

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

220 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

HOTSPOT-BATCH

HOTSPOT ์„œ๋น„์Šค์˜ ๋ฐฐ์น˜ ์ „์šฉ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌ์„ฑ

  • ์‹คํ–‰ ๋ฐฉ์‹: CLI ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ฐ˜ (BatchJobRunner)
  • ์‹œ๊ฐ„๋Œ€ ๊ธฐ์ค€: KST (Asia/Seoul)
  • ๊ณตํ†ต ๊ธฐ๋Šฅ:
    • Job ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒ€์ฆ
    • Job ๊ฒฐ๊ณผ ๋กœ๊น…
    • Chunk ์ง„ํ–‰ ๋กœ๊ทธ

Job ๋ชฉ๋ก

  1. familyRemoveJob
  • ๋ชฉ์ : family_remove_schedule์˜ ๋„๋ž˜ ๊ฑด(SCHEDULED) ์ฒ˜๋ฆฌ
  • ๋ฐฉ์‹: Tasklet
  • ํ˜„์žฌ ์ƒํƒœ: ๊ตฌํ˜„ ์ง„ํ–‰ ์™„๋ฃŒ(์‚ญ์ œ/์ง‘๊ณ„/์ƒํƒœ ๊ฐฑ์‹ )
  1. usageAggregationJob
  • ๋ชฉ์ : ์ฃผ๊ฐ„ ๋ฆฌํฌํŠธ seed ์ƒ์„ฑ + ์‚ฌ์šฉ๋Ÿ‰ ์ง€ํ‘œ ์ง‘๊ณ„
  • ๋ฐฉ์‹: Job1 (Chunk - 2step ๊ตฌ์กฐ) + Job2 (Chunk - 1step ๊ตฌ์กฐ)
  • ํ˜„์žฌ ์ƒํƒœ: ๊ตฌํ˜„ ์ง„ํ–‰ ์™„๋ฃŒ
  1. cryptoKeyRotationJob
  • ๋ชฉ์ : DEK ๋กœํ…Œ์ด์…˜(ํ–ฅํ›„ activate/reencrypt/retire ๋ถ„๋ฆฌ ์˜ˆ์ •)
  • ๋ฐฉ์‹: Chunk skeleton
  • ํ˜„์žฌ ์ƒํƒœ: skeleton
  1. redisDualWriteJob (์˜ˆ์ •)
  • ๋ชฉ์ : Redis ์ด์ค‘ํ™”/๋™๊ธฐํ™”
  • ๋ฐฉ์‹: ๋ฏธ์ •
  • ํ˜„์žฌ ์ƒํƒœ: ๋ฏธ๊ตฌํ˜„

์‹คํ–‰ ๋ฐฉ๋ฒ•

์˜ˆ์‹œ:

./gradlew bootRun --args="--job.name=familyRemoveJob --yearMonth=202604"

์ง€์› ํŒŒ๋ผ๋ฏธํ„ฐ:

  • job.name (ํ•„์ˆ˜)
  • targetDate (yyyy-MM-dd, ์„ ํƒ)
  • yearMonth (yyyyMM, ์„ ํƒ)

familyRemoveJob ์ฒ˜๋ฆฌ ํ๋ฆ„

  1. family_remove_schedule์—์„œ SCHEDULED && schedule_date <= ์‹คํ–‰์ผ ์กฐํšŒ
  2. ๋Œ€์ƒ family_sub ์ œ๊ฑฐ
  3. ๋Œ€์ƒ ํšŒ์„ ์˜ policy_sub, blocked_service_sub ๋น„ํ™œ์„ฑํ™”(is_active=false)
  4. family.family_num, family.family_data_amount ์žฌ๊ณ„์‚ฐ
  5. ๋‚จ์€ family_sub.data_limit ๊ฐฑ์‹ 
  6. ์„ฑ๊ณต ์‹œ COMPLETED, ์‹คํŒจ ์‹œ FAILED

๐Ÿ“Š ์ฃผ๊ฐ„ AI ๋ถ„์„ ๋ฆฌํฌํŠธ ํŒŒ์ดํ”„๋ผ์ธ

ํšŒ์„  ๋Œ€์ƒ์ž์˜ ์ผ์ฃผ์ผ ๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰์„ ์ˆ˜์ง‘ํ•˜๊ณ  ์ง€ํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ด๋ฅผ ๋ถ„์„ํ•ด ์ฃผ๊ฐ„ AI ๋ถ„์„ ๋ฆฌํฌํŠธ ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ์ „์ฒด ํ๋ฆ„

usageAggregationJob

  • ๋ฆฌํฌํŠธ ๋Œ€์ƒ seed ์ƒ์„ฑ, Redis ์‚ฌ์šฉ๋Ÿ‰ ์ง‘๊ณ„, ์ „์ฃผ ์Šค๋ƒ…์ƒท ๋น„๊ต, ์ ์ˆ˜ ๋ฐ ํƒœ๊ทธ ๊ณ„์‚ฐ
  • ์ƒํƒœ ์ „์ด: PENDING -> AGGREGATED

llmFeedbackJob

  • ์ง‘๊ณ„ ์™„๋ฃŒ ๋ฆฌํฌํŠธ ์กฐํšŒ, ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ, LLM ํ˜ธ์ถœ, AI ํ”ผ๋“œ๋ฐฑ ์ €์žฅ

  • ์ƒํƒœ ์ „์ด: AGGREGATED -> COMPLETED

  • ์Šค์ผ€์ค„ ์‹คํ–‰: WeeklyReportJobScheduler

  • ์‹คํ–‰ ์ˆœ์„œ: usageAggregationJob ์„ ํ–‰ ์‹คํ–‰ ํ›„ ์„ฑ๊ณต ์‹œ llmFeedbackJob ์‹คํ–‰


โœจ ์™œ ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆด๋‚˜

  • ์ง‘๊ณ„์™€ LLM ํ˜ธ์ถœ์˜ ์žฅ์•  ๋ฒ”์œ„ ๋ถ„๋ฆฌ
  • Step1 ๊ธฐ๋ฐ˜ seed ์ ์žฌ์™€ ๋ฉฑ๋“ฑ์„ฑ ํ™•๋ณด
  • MOD(weekly_report_id, gridSize) ๊ธฐ๋ฐ˜ ํŒŒํ‹ฐ์…”๋‹ ๊ตฌ์กฐ
  • Redis ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๋น„๋™๊ธฐ prefetch ๊ธฐ๋ฐ˜ N+1 ์™„ํ™”
  • week_start_date = ? ๊ธฐ๋ฐ˜ ์ „์ฃผ ๋น„๊ต ์กฐํšŒ ์ตœ์ ํ™”
  • AsyncItemProcessor + AsyncItemWriter + WebClient + RateLimiter/Retry ๊ธฐ๋ฐ˜ ์™ธ๋ถ€ API ๋ณ‘๋ชฉ ์™„ํ™”

โšก ์„ฑ๋Šฅ ํŠœ๋‹ ํ•ต์‹ฌ

  • Chunk Size

    • ๋ณ€๊ฒฝ๊ฐ’: 1000 -> 200
    • ํšจ๊ณผ: Chunk๋‹น DB/Redis ๋Œ€๊ธฐ ๋ถ€๋‹ด ๊ฐ์†Œ ๋ฐ ์ฒ˜๋ฆฌ ํšŒ์ „์œจ ๊ฐœ์„ 
  • Grid Size

    • ๋ณ€๊ฒฝ๊ฐ’: 8 -> 4
    • ํšจ๊ณผ: ๊ณผ๋„ํ•œ Context Switching ๋น„์šฉ ์™„ํ™” ๋ฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ํšจ์œจ ๊ฐœ์„ 
  • ์ „์ฃผ ์Šค๋ƒ…์ƒท ์กฐํšŒ

    • ๋ณ€๊ฒฝ ๊ตฌ์กฐ: DISTINCT ON ๊ธฐ๋ฐ˜ ์กฐํšŒ -> week_start_date = ? ์ •ํ™• ์กฐํšŒ
    • ํšจ๊ณผ: ๋ถˆํ•„์š”ํ•œ ์Šค์บ” ๋ฐ ์ •๋ ฌ ์ œ๊ฑฐ, DB ๋ถ€ํ•˜ ์ ˆ๊ฐ

๐Ÿ“˜ ์ƒ์„ธ ๋ฌธ์„œ

๐Ÿ›  Tech Stack

  • Framework: Spring Boot, Spring Batch, Spring Batch Integration, WebFlux
  • Database: PostgreSQL, Redis
  • Communication: WebClient, Resilience4j
  • AI: OpenAI ํ˜ธํ™˜ LLM API

์ฐธ๊ณ  ๋ฌธ์„œ

About

โค๏ธโ€๐Ÿ”ฅ HOTSPOT Batch Server

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages