Skip to content

Latest commit

Β 

History

History
103 lines (68 loc) Β· 4.05 KB

File metadata and controls

103 lines (68 loc) Β· 4.05 KB

Hello Virtual Thread

Virtual Thread λž€?

Java Virtual Thread

κ°€μƒμŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법

Java21을 μ‚¬μš©ν•˜λ©΄ μŠ€ν”„λ§ λΆ€νŠΈ 3.2λΆ€ν„° λ‹€μŒκ³Ό 같이 application.yml 에 λ‹€μŒκ³Ό 같은 섀정을 μΆ”κ°€ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ 가상 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

spring:
  threads:
    virtual:
      enabled: true

λ‹€μŒκ³Ό 같이 μ„€μ •ν•˜κ³  http/product-api.httpμ—μ„œ μƒν’ˆμ„ μƒμ„±ν•˜λŠ” APIλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ ν˜„μž¬ μ–΄λ–€ μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ 둜그λ₯Ό 찍어보도둝 ν•˜μž.

적용 μ „

virtual-thread-disabled.png

  • μƒν’ˆμ„ μƒμ„±ν•˜λŠ” μŠ€λ ˆλ“œλŠ” κ·Έλƒ₯ μŠ€λ ˆλ“œμ—μ„œ λ™μž‘ν•˜κ³ , λΉ„λ™κΈ°μ μœΌλ‘œ ProductCreateEventλ₯Ό λ§Œλ“œλŠ” 것도 AsyncConfigμ—μ„œ μ§€μ •ν•œ μŠ€λ ˆλ“œ ν’€μ˜ μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

적용 ν›„

virtual-thread-enabled.png

  • μƒν’ˆμ„ μƒμ„±ν•˜λŠ” μŠ€λ ˆλ“œ 및 λΉ„λ™κΈ°μ μœΌλ‘œ ProductCreateEventλ₯Ό μƒμ„±ν•˜λŠ” μŠ€λ ˆλ“œλ„ λͺ¨λ‘ 가상 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

가상 μŠ€λ ˆλ“œλ₯Ό μ μš©ν•˜μ§€ μ•Šμ€ 경우, κ°€μƒμŠ€λ ˆλ“œλ₯Ό μ μš©ν•œ 경우 각각 λΆ€ν•˜ν…ŒμŠ€νŠΈ

Environment

  • web containerλŠ” tomcat.server.threads.max=1둜 μ„€μ •ν•˜μ—¬, μ΅œλŒ€ μŠ€λ ˆλ“œκ°€ 1개둜 μ„œλ²„κ°€ λ™μž‘λ˜λ„λ‘ μ„€μ •ν•œλ‹€.
  • Dockerfile λΉŒλ“œ μ‹œ System Property둜 -Djdk.virtualThreadScheduler.maxPoolSize=1κ³Ό 같이 μ„€μ •ν•΄μ€€λ‹€.
    • 이λ₯Ό 톡해 κ°€μƒμŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬κ°€ μ΅œλŒ€ 1개의 ν”Œλž«νΌ μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ„€μ •ν•œλ‹€.
  • κ°€μƒμŠ€λ ˆλ“œλ₯Ό μ μš©ν•œ κ²½μš°μ™€ μ μš©ν•˜μ§€ μ•Šμ€ 경우 각각 λΆ€ν•˜ν…ŒμŠ€νŠΈμ—μ„œ 50λͺ…μ˜ 가상 μœ μ €κ°€ λ™μ‹œμ— GET /health μš”μ²­μ„ 보내도둝 ν•œλ‹€.
    • GET /health API λŠ” λ‹€μŒκ³Ό 같이 κ΅¬ν˜„λΌ μžˆλ‹€.
@GetMapping("/health")
fun healthCheck(): String {
    log.info("Thread: {}", Thread.currentThread())
    Thread.sleep(1000L) // Blocking
    return "OK"
}

가상 μŠ€λ ˆλ“œλ₯Ό μ μš©ν•˜μ§€ μ•Šμ€ 경우

## Locust ν΄λ”λ‘œ 이동
cd locust/

## ν…ŒμŠ€νŠΈ μ‹€ν–‰: μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ ν›„ `localhost:8089`μ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.
docker compose -f docker-compose-platform.yml up -d

## μ’…λ£Œ μ‹œ
docker compose -f docker-compose-platform.yml down

λΆ€ν•˜ν…ŒμŠ€νŠΈ μ‹€ν–‰ κ²°κ³Ό

not-using-virtual-thread-1.png

not-using-virtual-thread-2.png

  • μŠ€λ ˆλ“œκ°€ 1개이기 λ•Œλ¬Έμ—, 50λͺ…μ˜ μœ μ €κ°€ μš”μ²­μ„ 보내도 1개만 응닡이 κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ RPSκ°€ 1인 것을 확인할 수 μžˆλ‹€.
    • 1개의 μš”μ²­μ΄ μ²˜λ¦¬λ˜λŠ” λ™μ•ˆ λ‚˜λ¨Έμ§€ 응닡은 λŒ€κΈ°ν•˜λ―€λ‘œ μ‘λ‹΅μ‹œκ°„μ΄ 계속 μ¦κ°€ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

가상 μŠ€λ ˆλ“œλ₯Ό μ μš©ν•œ 경우

## Locust ν΄λ”λ‘œ 이동
cd locust/

## ν…ŒμŠ€νŠΈ μ‹€ν–‰: μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ ν›„ `localhost:8089`μ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.
docker compose -f docker-compose-virtual.yml up -d

## μ’…λ£Œ μ‹œ
docker compose -f docker-compose-virtual.yml down

λΆ€ν•˜ν…ŒμŠ€νŠΈ μ‹€ν–‰ κ²°κ³Ό with VisualVM Monitoring

using-virtual-thread-1.png

using-virtual-thread-2.png

  • μ‚¬μš©ν•˜λŠ” ν”Œλž«νΌ μŠ€λ ˆλ“œλŠ” 1κ°œμ΄μ§€λ§Œ, 가상 μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€μ–΄μ„œ 응닡을 ν•˜κΈ° 떄문에 RPSκ°€ 50인 것을 확인할 수 μžˆλ‹€.
    • 50λͺ…μ˜ μœ μ €κ°€ 있고, μ‘λ‹΅ν•˜λŠ”λ° 1μ΄ˆκ°€ 걸리기 λ•Œλ¬Έμ— μžμ—°μŠ€λŸ½λ‹€.
  • κ°€μƒμŠ€λ ˆλ“œκ°€ 계속 μƒμ„±λ˜κ³  GC둜 사라지기 λ•Œλ¬Έμ—, Heap μ˜μ—­μ˜ λ©”λͺ¨λ¦¬κ°€ μ˜¬λΌκ°”λ‹€ λ‚΄λ €κ°”λ‹€ ν•˜λŠ” κ²ƒμœΌλ‘œ μΆ”μΈ‘λœλ‹€.

Reference