๐ Timeout Tamer: ์ธ๋ด๊ฐ ์ง๋ณด๋ฅผ ๋ง๋ฌ์ ๋
Source: Dev.to
๋๋ ค์ด ๊ต์ฐฉ ์ํ
๊ทธ๋ฆฌ๋ํผ์์ ๋ ์์, ๋ง๋ฒ์ฌ ๋ฃจ๋๋ ๊ฐ์ฅ ์๋ํ ์ฃผ๋ฌธ์ ์ค๋นํ์ต๋๋ค โ 427๊ฐ์ ๋ง๋ฒ ๋ฐ์ดํฐ ํ์ ํผ๋ธ๋ฆฌ์ํ๋ ๊ฒ. ๊ทธ๋ ๋ ๋ง๋ฒ ์งํก์ด๋ฅผ ํ๋๋ฅด๋ฉฐ(โPublishโ ํด๋ฆญ)โฆ ๊ทธ๋ฆฌ๊ณ TimeOut, ์ฑ๋ ๋ฌธ์ง๊ธฐ๊ฐ ํฌํธ์ ๋ซ์๋ฒ๋ ธ์ต๋๋ค.
โ๋น์ ์ ์ธ๋ด๊ฐ ๋ง๋ฃ๋์์ต๋๋ค.โ
๊ทธ๋ ์ ์ฐฝ์กฐ๋ฌผ์ด ์ฌ๋ผ์ง ๊ฑธ๊น์?
์ ๋น: TimeOut
TimeOut โ 30์ด ๊ท์น์ ์งํค๋ ๋ฌด์๋นํ ์ํธ์. โ๋จธ๋ฌด๋ฅด์ง ๋ง๋ผ. ์์ง์ด๊ฑฐ๋ ์ฌ๋ผ์ ธ๋ผ.โ
์์ ๋ค์ ์งํฉ
๋ฃจ๋๋ ์ธ ๋ช ์ ์ฉ๊ฐํ ์บ๋ฆญํฐ๋ฅผ ๋ถ๋ฆ ๋๋ค:
- @TrackProgress (๋ด๋ ์ดํฐ) โ ์ด ์ฌ์ ์ ์ด์ผ๊ธฐํด ์ฃผ๋ ๋ง๋ฒ ์ฃผ์.
- Async (์ ์ํ ๋ฌ๋ฆฌ๊ธฐ) โ ๋ฌด๊ฑฐ์ด ์์ ์ ์คํ๋ก๋ํฉ๋๋ค. ์ฐจ๋จ ์์!
- SSE (์์ญ์ด๋ ์) โ ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ ํํฉ๋๋ค.
ํ์คํธ: ํ์์์ ๊ธธ๋ค์ด๊ธฐ
Actโฏ1: ๊ต์ฐฉ ์ํ
- ๋ฌธ์ : 427๊ฐ์ ํ์ ๋๊ธฐ์ ์ผ๋ก ํผ๋ธ๋ฆฌ์ํ๋ ๋ฐ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ ธ์ต๋๋ค. TimeOut์ด ์ผ๋ฅด๋ ๊ฑฐ๋ ธ์ต๋๋ค.
- ๊ฒฐ๊ณผ: ๋ฃจ๋๋ ๋ฉ์ถฐ ์์, ๋ถํ์คํ๊ณ , ๊ต์ฐฉ ์ํ์ ๋น ์ก์ต๋๋ค.
Actโฏ2: Async ๊ตฌ์กฐ
๋จ๊ณ๋ณ ๊ธฐ์ ๊ฐ์ด๋
@TrackProgress๊ฐ ๋ฑ์ฅ (AOP ๋ง๋ฒ)
@TrackProgress("Unleashing the grid gods")
public void publishGrid(List rows) {
String taskId = generateTaskId();
progressService.startTask(taskId, rows.size());
publisher.publishAsync(rows, taskId);
return taskId;
}
- @TrackProgress (๋ด๋ ์ดํฐ): ์์ฌ์ ์ธ ์์ ์ ํ์ํ๊ณ ์ฌ์ฅ๋ฐ๋์ ๋ถ์ฌํฉ๋๋ค.
Async๊ฐ ๋ถํ๋ฅผ ๋ด๋น (๋ณ๋ ฌ ์์ )
new Thread(() -> {
try {
// Process in chunks. No rush!
jp.proceed();
completeTask(id);
} catch (Exception e) {
failTask(id, e);
}
}).start();
- Async (์ ์ํ ๋ฌ๋ฆฌ๊ธฐ): ์์ ์ ์คํํฉ๋๋ค. ๋ฃจ๋๋ ๋ค์์ ๋ฐ์ต๋๋ค:
{
"taskId": "grid-427-groove",
"message": "Your magic is brewing!",
"track": "/pulse"
}
SSE๊ฐ ์ฌ์ ์ ์์ญ์ (์ค์๊ฐ ์ฐ๊ฒฐ)
// As chunks complete:
progressService.updateProgress(taskId, 42, "Validating dreamsโฆ");
- SSE (์์ญ์ด๋ ์): ๊ฐ ์ฌ์ฅ๋ฐ๋์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค, ์:
Publishingโฆ 42% [โโโโโโโโโโโ]
ํด๋ผ์ด๋งฅ์ค: ์งํ์ด ์๊ฐ์ ์ ๋ณตํ๋ค
- TimeOut์ด ๋น์์ผ๋ ค ํฉ๋๋ค.
- @TrackProgress๊ฐ ์ด์ ํ๋ฅผ ๋ด๋ ์ด์ ํฉ๋๋ค.
- Async๊ฐ ๊ทธ๋ฆผ์ ์์์ ์์ ํฉ๋๋ค.
- SSE๊ฐ ๋ฃจ๋๋ฅผ ๊ณ์ ๋ชฐ์ ์ํต๋๋ค.
์ต์ข ์ธ์นจ:
Publishingโฆ 100% [โโโโโโโโโโโโ] Published! โจ
๋ฃจ๋๋ ๋ฏธ์ ์ง์ต๋๋ค. ๊ทธ๋ฆฌ๋๊ฐ ์ด์๋ฉ๋๋ค.
๋ฑ์ฅ์ธ๋ฌผ ๋ฐ ๊ฐ๋
- @TrackProgress (๋ด๋ ์ดํฐ) โ ์ฃผ์ + AOP; ๊ธด ์ฌ์ ์ ๋งฅ๋ฝํํฉ๋๋ค.
- Async (์ ์ํ ๋ฌ๋ฆฌ๊ธฐ) โ Java ์ค๋ ๋ฉ, ๋ ผ๋ธ๋กํน; ๋ฃจ๋๊ฐ ๋ฉ์ถ์ง ์๊ฒ ํฉ๋๋ค.
- SSE (์์ญ์ด๋ ์) / WebSocket (์งํ์) โ ServerโSent Events(๋๋ WebSocket)๋ ๋ฐฑ์๋์ ๋ฐ๋์ ํ๋ก ํธ์๋ ์ฌ์ฅ๋ฐ๋์ ์ฐ๊ฒฐํฉ๋๋ค.
์ฐธ๊ณ : ์ํคํ ์ฒ ์ ์ฝ์ ๋ง๋ ๊ฒ์ ์ฌ์ฉํ์ธ์. - TimeOut (์ ๋น) โ AWS API Gateway ํ์์์ ์ ์ฝ; ํ์ ์ ์ด๋ฐํ๋ ์์ธ.
์์ฝ
- ๋ฌธ์ : ๋๊ธฐ์ ๋ฌด๊ฑฐ์ด ์์ ์ด ๋ฒฝ์ ๋ถ๋ชํ์ต๋๋ค.
- ํด๊ฒฐ์ฑ
:
@TrackProgress์ Async๋ฅผ ๊ฒฐํฉํด ๋๊ธฐ๋ฅผ ์งํ ํํฐ๋ก ์ ํํฉ๋๋ค. - ๊ฒฐ๊ณผ: ์ด๋ ๋์ ๊ตํฅ๊ณก์ด ์ธ๋ฆฝ๋๋ค.
Timeout Tamerโs Creed (ํ์์์ ๊ธธ๋ค์ด๋ ์ ์กฐ)
์ ์ฝ์ ์ ๋ฌผ์ ์จ๊น๋๋ค. ์ธ๋ด๊ฐ ์ํ๋ ๋:
- ๋ ธ๋ ฅ์ ๋ด๋ ์ด์ ํ๋ค.
- ํ๋ก์ธ์ค๋ฅผ ํด๋ฐฉํ๋ค.
- ์ค์๊ฐ์ผ๋ก ์์ญ์์ ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ TimeOut? ์กด๊ฒฝ์ ๊ณ ๊ฐ๋ฅผ ๋๋์ ๋๋ค.
๊ตํ
๋ค์์ ์ ํ์ด ๋ค๊ฐ์ฌ ๋, ์ผ์ธ์กฐ๋ฅผ ๋ฐฐ์นํ์ธ์:
@TrackProgressโฏโโฏAsyncโฏโโฏSSE/WebSocket
์ด ์ํฉ์ ์ฌ๋ฌ๋ถ์ ์ด๋ป๊ฒ ํด๊ฒฐํ์๊น์?