๐Ÿน ์˜ˆ์น˜๊ธˆ ์ฐจ์•ก ๋น„๊ต Spring Batch ๋ฆฌํŽ™ํ† ๋ง ๋ถ€๋ก

parallelStream vs CompletableFuture ์„œ๋น„์Šค์˜ apiํ˜ธ์ถœ ๋กœ์ง์„ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?

  • ํ˜„์žฌ ์˜ˆ์น˜๊ธˆ ์ฐจ์•ก ๋ฐฐ์น˜์˜ ์„œ๋น„์Šค๋กœ์ง์€, ๊ฐ ํŒŒํ‹ฐ์…˜์—์„œ ์‹คํ–‰๋˜๋ฉฐ,
  • ์ด๋ ‡๊ฒŒ ์‹คํ–‰๋œ ์ฝ”๋“œ๋Š” parallelStream์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€์ ์ธ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  • ํ•ด๋‹น ๋กœ์ง์˜ ํŠน์ง•์€ cpu์— ๋ถ€ํ•˜๋ฅผ ์ฃผ๋Š” ๊ณ„์‚ฐ์‹์ด ์•„๋‹Œ, ๋‹จ์ˆœ I/O (apiํ˜ธ์ถœ ๋Œ€๊ธฐ)์˜ ์†Œ์š”์‹œ๊ฐ„์ด ํฌ๋‹ค.

์ž‘์—… ์‹œ๋‚˜๋ฆฌ์˜ค

  • API ํ˜ธ์ถœ ์ž‘์—… 10,000๊ฑด ์ฒ˜๋ฆฌ
  • ๊ฐ ํ˜ธ์ถœ ์‘๋‹ต ์‹œ๊ฐ„ 200ms

parallelStream์˜ ์„ฑ๋Šฅ:

  • ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ ํ’€ ํฌ๊ธฐ: CPU ์ฝ”์–ด ์ˆ˜ - 1 (์˜ˆ: 7๊ฐœ์˜ ์ฝ”์–ด)
  • ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ โ‰ˆ ์ž‘์—… ๊ฐœ์ˆ˜/์Šค๋ ˆ๋“œ ์ˆ˜ร—์‘๋‹ต ์‹œ๊ฐ„\text{์ž‘์—… ๊ฐœ์ˆ˜} / \text{์Šค๋ ˆ๋“œ ์ˆ˜} \times \text{์‘๋‹ต ์‹œ๊ฐ„}์ž‘์—… ๊ฐœ์ˆ˜/์Šค๋ ˆ๋“œ ์ˆ˜ร—์‘๋‹ต ์‹œ๊ฐ„
  • โ‰ˆ10,000/7ร—200ms\approx 10,000 / 7 \times 200msโ‰ˆ10,000/7ร—200ms
  • โ‰ˆ286์ดˆ\approx 286์ดˆโ‰ˆ286์ดˆ

CompletableFuture + FixedThreadPool(100)**์˜ ์„ฑ๋Šฅ:

  • ์Šค๋ ˆ๋“œ ํ’€ ํฌ๊ธฐ: 100
  • ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ โ‰ˆ ์ž‘์—… ๊ฐœ์ˆ˜/์Šค๋ ˆ๋“œ ์ˆ˜ร—์‘๋‹ต ์‹œ๊ฐ„\text{์ž‘์—… ๊ฐœ์ˆ˜} / \text{์Šค๋ ˆ๋“œ ์ˆ˜} \times \text{์‘๋‹ต ์‹œ๊ฐ„}์ž‘์—… ๊ฐœ์ˆ˜/์Šค๋ ˆ๋“œ ์ˆ˜ร—์‘๋‹ต ์‹œ๊ฐ„
  • โ‰ˆ10,000/100ร—200ms\approx 10,000 / 100 \times 200msโ‰ˆ10,000/100ร—200ms
  • โ‰ˆ20์ดˆ\approx 20์ดˆโ‰ˆ20์ดˆ

a. ์ž‘์—…์˜ ์„ฑ๊ฒฉ

  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…:
    • CPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…(์˜ˆ: ๋ณต์žกํ•œ ๊ณ„์‚ฐ)์ด๋ฉด, ์ฝ”์–ด ์ˆ˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(์Šค๋ ˆ๋“œ ๊ฐ„ ์ „ํ™˜) ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•ด ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ: 7๊ฐœ์˜ ์ฝ”์–ด๋กœ 100๊ฐœ์˜ CPU ์ž‘์—… ์Šค๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค ํ•˜๋ฉด ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒ.
  • I/O ๋ฐ”์šด๋“œ ์ž‘์—…(API ํ˜ธ์ถœ ํฌํ•จ):
    • ๋„คํŠธ์›Œํฌ I/O ์ž‘์—…์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธธ๊ณ , ๋Œ€๊ธฐ ์ค‘์—๋Š” CPU๋ฅผ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ด ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ์ˆ˜ > ์ฝ”์–ด ์ˆ˜๊ฐ€ ์œ ๋ฆฌํ•˜๋ฉฐ, 100๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋„ ๋Œ€๋ถ€๋ถ„์˜ ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ์œผ๋ฏ€๋กœ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

2์ฐจ ๊ฒ€์ฆ๋กœ์ง ์‚ญ์ œ ์ „

๊ธฐ์กด๋กœ์ง

69961 ms 70048 ms 70396 ms


2์ฐจ ๊ฒ€์ฆ๋กœ์ง ์‚ญ์ œ ํ›„

๊ธฐ์กด ๋กœ์ง

55180 ms 55036 ms 55285 ms 55442 ms

(๊ณ„์‚ฐ๋กœ์ง + APIํ˜ธ์ถœ ๋กœ์ง) - ์Šค๋ ˆ๋“œ ๊ณ ์ •(20)

71139 ms 72220 ms

(APIํ˜ธ์ถœ ๋กœ์ง๋งŒ ์Šค๋ ˆ๋“œ ๊ณ ์ •(20)

64473 ms 65609 ms

  • ๋ฏธ๋ฆฌ ํŒŒํ‹ฐ์…˜ ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์ƒ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ๋˜๋Š” ์–‘์ด ๋งŽ์ง€ ์•Š๋‹ค.
  • ๋˜ํ•œ, stream().parallel()์€ forkJoinPool์—์„œ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ,
  • ๋ฐ์ดํ„ฐ์˜ ๋™๊ธฐํ™” ๋ณ‘๋ชฉ์„ ์ค„์ด๊ณ , ์ปจํ…์ŠคํŠธ ์ „ํ™˜ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ ๋” ํšจ์œจ์ ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ž„.

๊ฒฐ๊ณผ

  • stream().parallel() ๊ธฐ๋Šฅ์ด ํšจ์œจ์ ์ด๋‹ค.

QuerydslPagingItemReader๋ฅผ ์ ์šฉํ•จ์œผ๋กœ ์ธํ•˜์—ฌ, ์ผ์ •ํ•œ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ํŽ˜์ด์ง• ํ•˜๊ธฐ ๋•Œ๋ฌธ์—(Reader๋Š” ๊ฐ Partition๋ณ„ 1๋ฒˆ ์ž‘๋™) ์Šค์ผ€์ค„๋ง์ด ๋™์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋Ÿผ์—๋„ ์†๋„๊ฐ€ ๋” ๊ฐœ์„ ๋œ ์ด์œ ๋ฅผ ๋ถ„์„ํ•ด๋ณด๋ฉด ์ข‹์„๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

  • ์•„๋งˆ๋„ Where์ ˆ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ reader์˜ ์†๋„๊ฐ€ ํฌ๊ฒŒ ์˜ฌ๋ผ๊ฐ“์œผ๋ฉฐ, 1๋ฒˆ์˜ ํ˜ธ์ถœ๋งŒ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ฐœ์„ ๋˜์—ˆ์„๊ฒƒ์ด๋‹ค.

292Column

๊ธฐ์กด :

chunk-size:20 55969 ms

๋ณ€๊ฒฝํ›„ :

chunk-size:20 54679 ms 54416 ms


2์ฐจ ๊ฒ€์ฆ ์‚ญ์ œ์‹œ ์ตœ์ข… ์ฐจ์•ก ์ธ์›์ด ๋‹ค๋ฅธ ์ด์œ 

๊ธฐ์กด : reader์—์„œ ๋„˜์–ด์˜จ๋…€์„๋“ค์˜(์˜›๋‚ ๊ธฐ์ค€ ๋‚ ์งœ๋ฒ”์œ„ ๋‚ด์˜ ๊ฐ€์žฅ์ตœ์‹ Point)์ฐจ์•ก -> ์ฐจ์•ก์ด์žˆ๋Š”๋…€์„๋“ค์˜ (๋ชจ๋“ ๋‚ ์งœ ๋ฒ”์œ„๋‚ด์˜ ์ตœ์‹  Point)์˜ ์ฐจ์•ก ํ˜„์žฌ : reader์—์„œ ๊ฐ€์ ธ์˜จ๋…€์„๋“ค์˜(๋ชจ๋“ ๋‚ ์งœ๋ฒ”์œ„๋‚ด์˜ ์ตœ์‹  Point)์˜ ์ฐจ์•ก

ํ˜„์žฌ:281 / ๊ธฐ์กด:141

ํ˜„์žฌ์ฐจ์•ก์— ๊ธฐ์กด์ฐจ์•ก์ด ๋ชจ๋‘ ํฌํ•จ๋˜์–ด์žˆ์Œ

=> ์˜›๋‚ ๊ธฐ์ค€ ๋‚ ์งœ๋ฒ”์œ„ ๋‚ด์˜ ๊ฐ€์žฅ์ตœ์‹ ํฌ์ธํŠธ์™€ ์‹ค์‹œ๊ฐ„ ํฌ์ธํŠธ๋Š” ๋‹ค๋ฅผ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ. ๊ฑฐ๊ธฐ ๋‚ด์—

์ „๋‚ ์˜ ์ตœ์‹ ํฌ์ธํŠธ vs ํ˜„์žฌ ์ตœ์‹ ํฌ์ธํŠธ(์‹ ํ•œ) -> ์—ฌ๊ธฐ์—” ์•ˆ๊ฑธ๋ฆฌ์ง€๋งŒ ํ˜„์žฌ ์ตœ์‹ ํฌ์ธํŠธ vs ํ˜„์žฌ ์ตœ์‹ ํฌ์ธํŠธ(์‹ ํ•œ) -> ์—ฌ๊ธฐ์—๋Š” ๊ฑธ๋ฆฐ๋‹ค.


์‹œํ–‰์ฐฉ์˜ค

Limit์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  JpaPagingReader๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๊ฐ€?

์ด๊ฒŒ ๋ฌด์Šจ์†Œ๋ฆฌ์ธ์ง€?
  • ๋ณดํ†ต์˜ Batch ์„œ๋น„์Šค๋ผ๋ฉด I/O ์ž‘์—…์— ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ ค์žˆ๊ฒ ์ง€๋งŒ, ํ˜„์žฌ ์˜ˆ์น˜๊ธˆ ์ฐจ์•ก ๋ฐฐ์น˜๋Š” processor ์ฆ‰, ์˜ˆ์น˜๊ธˆ ๋น„๊ต ์—ฐ์‚ฐ์—์„œ ํฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๊ณ ์žˆ๋‹ค.
  • ์ด์— ํ•ด๋‹นํ•˜๋Š” ์‹œ๊ฐ„ ์†Œ๋ชจ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด processor(์„œ๋น„์Šค๋กœ์ง) ์„ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ํ•จ์œผ๋กœ ์ตœ์ข… ์ฒ˜๋ฆฌ์‹œ๊ฐ„ ๋‹จ์ถ•์„ ๊พ€ํ•  ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด๋‹ค.
  • ์ดํ›„ ์„ค๋ช…ํ•˜๊ฒ ์ง€๋งŒ, ๋‚ด๋ถ€ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๋กœ์ง์€ ์ฒญํฌ์˜ ํŠธ๋ Œ์ ์…˜์„ ๋ฌด๋„ˆ๋œจ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผํ•จ.

- processor๋Š” reader์˜ return๊ฒฐ๊ณผ๋กœ๋งŒ ํŠธ๋ฆฌ๊ฑฐ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

Pasted image 20241206113120.png

ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, processor์˜ ๋กœ์ง์„ writer์— ํ• ๋‹นํ•˜์—ฌ ์ฒญํฌ์‚ฌ์ด์ฆˆ๋กœ ์ปจํŠธ๋กค ํ• ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

reader(dto) -> processor -> writer(dtoList)

- ๊ตฌํ˜„ ๊ฒฐ๊ณผ reader์˜ return์ธ dto๊ฐ’์„ chunk์‚ฌ์ด์ฆˆ ๋งŒํผ List dto๋กœ ํ•ฉ์ณ ์ผ๊ด„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
์†Œ์š”์‹œ๊ฐ„ : 1๋ถ„ 9์ดˆ

-> ๊ธฐ์กด limit์ ˆ์„ ์ด์šฉํ•œ ๋กœ์ง๋ณด๋‹ค ์†๋„๊ฐ€ ๋”๋น ๋ฅด๋ฉฐ, JpaPagingReader๋ฅผ ์ ์šฉํ•œ๋‹ค๋ฉด ์ค‘๋ณต selectํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ ๋” ๋นจ๋ผ์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค.

์šฐ๋ ค๋˜๋Š” ์ ์€ writer๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์˜ ์—ญํ• ๊นŒ์ง€ ๋งก๋Š”๊ฒŒ, ์„ค๊ณ„ ๋ชฉ์ ์— ๋ถ€ํ•ฉํ•œ์ง€ ์ƒ๊ฐํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค.

๊ฒฐ๋ก  : ๋‘˜ ์ค‘ ํ•˜๋‚˜

1. ๋ฆฌ๋”,ํ”„๋กœ์„ธ์„œ ๊ฐ๊ฐ dto 1๊ฐœ ์”ฉ ์ฒ˜๋ฆฌ (์—ญํ•  ๋ถ„๋‹ด)
2. ํ”„๋กœ์„ธ์„œ ๋กœ์ง์„ ์ œ๊ฑฐํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋Š” ์œ ์ง€ํ•˜๋ผ, ์„œ๋น„์Šค๋กœ์ง์—์„œ dto list๋กœ ๋‚ด๋ถ€ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๋กœ์ง์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ
#### 292 ์ปฌ๋Ÿผ
## Processor ์‚ญ์ œ(๋ณ‘๋ ฌ์ฒ˜๋ฆฌ)๋กœ์ง
#### grid-size:6 / chunk-size:20
54679 ms
54416 ms
## Processor ์ˆœ์ฐจ์ฒ˜๋ฆฌ(writer๋งŒ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ) ๋กœ์ง

#### grid-size:6 / chunk-size:20
60440 ms
62271 ms
#### grid-size:10 / chunk-size:20
58129 ms
56723 ms
#### grid-size:16 / chunk-size:20
58595 ms
56314 ms

#### grid-size:32 / chunk-size:20
- SQLTransientConnectionException
- ์Šค๋ ˆ๋“œํ’€ ์ ์œ ๊ฐฏ์ˆ˜ ์ดˆ๊ณผ

๋ฐ์ดํ„ฐ ์ƒ์œผ๋กœ๋Š” ๋‚ด๋ถ€ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์˜ ์Šน๋ฆฌ

ํ•˜์ง€๋งŒ, ์ดํ›„ ์ฒญํฌ ๋ฐฉ์‹ Batch์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฆฌ๋”,ํ”„๋กœ์„ธ์„œ,๋ผ์ดํ„ฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ์ •ํ–ˆ๋‹ค.