์ ์ฒด ๊ธ (68) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ [๋ฆฌ๋ทฐ] "์ฑ๊ณต๊ณผ ์คํจ๋ฅผ ๊ฒฐ์ ํ๋ 1%์ ๋คํธ์ํฌ ์๋ฆฌ" ์ฝ๊ฒ ๋ ๊ณ๊ธฐ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฑ์๋ ๊ฐ๋ฐ๊ณผ ์๋ฒ ์ธํ๋ผ ์ ๋ฌด๋ฅผ ํ๋ฉฐ ์๋ ๊ฐ์ ๊ถ๊ธ์ฆ์ด ์๊ฒผ๋ค.ํ ์๋ฒ์์ ๋ ํ๋ก์ธ์ค ๊ฐ HTTP ํธ์ถ(localhost ํธ์ถ) ์ ์ฌ์๋ ๋ก์ง์ ์ถ๊ฐํด์ผ ํ ๊น?๊ฐ์ ์๋ธ๋ท์์ ์๋ฒ to ์๋ฒ๋ก 200GB ํ์ผ์ ์ฎ๊ฒจ์ผ ํ๋ค. ๋ฌด์์ ๊ณ ๋ คํด์ผ ํ ๊น?์์ผ์ ๋ฌด์์ธ๊ฐ? OS์ ํ๋กํ ์ฝ ์คํ์์ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ํ๋ก์ธ์ค๋ก ์ ๋ฌํ ์ง ์ด๋ป๊ฒ ์๊น?๋๊ท๋ชจ ์์คํ ์ ๋ฆฌ๋ ์ค ์๋ฒ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ ๋๋ ค์ผ ํ ๊น?NAT๋ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?์ด๋ฌํ ๊ถ๊ธ์ฆ์ ์์ฆ์ AI๋ก๋ ํด๊ฒฐํ ์ ์์ง๋ง, ๋ด ์ง์์ผ๋ก๋ AI๊ฐ ํ๋ ๋ง์ ๊ฒ์ฆํ ์ ์์ด์ ์ง์ ์ฑ ์ ์ฝ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ์ฑ ๋ฆฌ๋ทฐ์ ํจ๊ป ๊ถ๊ธํ๋ ๊ฒ๋ค์ ์ค์ค๋ก ๋ต๋ณํด๋ณด๊ณ ์ ํ๋ค. ์ถํด๊ทผ ์๊ฐ๊ณผ ์์ฌ ์๊ฐ ํํ์ด ์ฝ์๊ณ 3์ฃผ ์ ๋ ๊ฑธ๋ฆฐ.. Opensearch ์ Index State Management๋ฅผ ์ ์ฉํด ์์งํ ๋ก๊ทธ ๊ด๋ฆฌํ๊ธฐ OpenSearch๋ Kibana ๋์ฒด๋ก OpenSearch Dashboard๋ฅผ ์ ๊ณตํ๋ค. ๋ก๊ทธ ์์ง์ ์ํด OpenSearch๋ฅผ ์ด๋ค๋ฉด, ์ธ๋ฑ์ค์ ๋ฌดํ์ ๋ก๊ทธ๊ฐ ์์ฌ ๋์คํฌ๋ฅผ ์ก์๋จน๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ISM(Index State Management)์ ์ด ์ธ๋ฑ์ค๋ฅผ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์๋์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. (Kibana์์๋ ILM(Index Lifecycle Management)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.) ์ด ๊ธ์ ๋ชฉ์ ์ ISM์ ์ด๋ป๊ฒ ์ค์ ํ๋์ง ๋น ๋ฅด๊ฒ ์๊ณ , ์ค์ํ ์ด๋ค Policy(State + Action + Transition)๋ฅผ ์ค๊ณํ ์ง ๊ณ ๋ฏผํ๋ ๋ฐ ์๊ฐ์ ํฌ์ํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.ISM ๊ตฌ์ฑ ์์ISM์ ํฌ๊ฒ ์๋ 4๊ฐ์ง๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.Policy์ธ๋ฑ์ค ์๋ช ์ฃผ๊ธฐ ์ ์ฑ ์ ์ฒด๋ฅผ ์ ์ํ๋ .. Spring ์์ SSE Spec ์ถฉ์กฑ์ํค๊ธฐ SSE ์ Spec ์ id, event, data, retry ๋ก ์ ํด์ ธ์์ต๋๋ค.(SSE(Server-Sent Events) Spec ์ ์ ํด์ ธ ์๋ค)Spring ์์๋ SSE Spec ์ Flux ๋๋ SseEmitter ๋ฅผ ํ์ฉํด Spec ์ ์ถฉ์กฑ์ํฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ์์๋ณด๊ณ ์ ํฉ๋๋ค. 1. FluxSSE๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ํ๋ ค๋ณด๋ด๋ ๊ตฌ์กฐ์ ๋๋ค. "๋ฐ์ดํฐ๋ฅผ ํ๋ ค๋ณด๋ธ๋ค"๋ผ๋ ๊ฐ๋ ์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํํํ๊ธฐ ์ํ ํ์ค ๋ช ์ธ๋ก ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ(Reactive Streams) ๊ฐ ์์ต๋๋ค.๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ฆ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ(Publisher) → ๊ตฌ๋ (Subscriber) ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, ์ด๋ฅผ ๊ตฌํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Project Reactor์ด๊ณ ๊ทธ ํต์ฌ ํ์ ์ด Flux์ Mo.. Spring MVC ์์ Flux<T> ๋ฅผ ๋ฐํํ๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น? Spring MVC์์ ๋น๋๊ธฐ ์คํ์ ์ง์ํ๊ฒ ๋๋ฉด์ SSE๋ฅผ ๊ตฌํํ๊ฑฐ๋ WebClient๋ฅผ ์ฌ์ฉํ ๋ Flux๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์ด๋ Flux๋ฅผ ์ปจํธ๋กค๋ฌ์์ ๋ฐํํ๋ฉด MVC๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ์๋ ๋ด์ฉ์ Flux์ ๋ฐํ/๊ตฌ๋ ๋ชจ๋ธ์ ์ดํดํ๋ฉด ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ผ๋ฉฐ Spring Boot 3.x ๊ธฐ๋ฐ์ ๋๋ค. 1. Web๊ณผ WebFlux ์์กด์ฑ์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด?Spring Boot์์ spring-boot-starter-web๊ณผ spring-boot-starter-webflux ์์กด์ฑ์ ํจ๊ป ์ถ๊ฐํ๋ฉด Boot์ ์๋ ๊ตฌ์ฑ์ ์ํด MVC(Tomcat)๋ก ๋์์ง๋๋ค.dependencies { implementation 'org.springframework.boot:.. SSE(Server-Sent Events) Spec ์ ์ ํด์ ธ ์๋ค ์๋ฒ ๊ด๋ จ ์์ ์ฝ๋๋ Java/Spring ์ผ๋ก ์งํ๋๋ฉฐ, SSE Spec(์๋ต ํ์)์ ๋ํด ์์๋ณด๋ ๊ฒ์ผ๋ก ์๋ฒ์์ SSE ๊ตฌํ ๋ฐฉ๋ฒ์๋ ๋ค์ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์. ํด๋ผ์ด์ธํธ ์์ ์ฝ๋์ ๋ํด ๋ ์๊ณ ์ถ๋ค๋ฉด '์ฐธ๊ณ ' ์ ์๋จ 2๊ฐ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์. 0. SSE ์ Spec์ ์ ํด์ ธ ์๋ค.SSE๋ HTML ์คํ(WHATWG) ์ ์ ์๋์ด ์๊ณ , HTTP ์คํ(IETF)๊ณผ๋ ๋ณ๊ฐ์ ๋๋ค.WHATWG → SSE (EventSource, Event Stream ํฌ๋งท) ์ ์IETF → HTTP/1.1, HTTP/2, HTTP/3 ์ ์ HTTP ๋ฒ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฑด SSE ์ Spec์ด ์๋๋ผ HTTP๊ฐ SSE๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋๋ค. ์๋ฅผ ๋ค์ด HTTP/2.0 ๊ณผ HTTP/1.1 ์ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์์ด.. Spring Boot์ Graceful Shutdown ์ต์ ์ Async์ฉ ์ฐ๋ ๋ ํ๊ณผ ํจ๊ป ์ฐ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? (SmartLifeCycle, Phased ์ ํจ๊ป timeout-per-shutdown-phase ์คํด ๋ฐ๋ก์ก๊ธฐ) ์ด ๊ธ์์๋ Graceful Shutdown์ "์ฐ์ํ ์ข ๋ฃ"๋ก ์ธ๊ธํฉ๋๋ค. 1. ์ฐ์ํ ์ข ๋ฃ ํ ์คํธ ํ๊ฒฝ ์ค์ ์ฐ์ํ ์ข ๋ฃ ํ ์คํธ๋ IDE์์ ์คํ ์ ์ํํ๊ฒ ๋์ํ์ง ์๋๋ค๊ณ ์ค๋ช ๋์ด ์์ด, Linux ์๋ฒ์์ jar๋ฅผ ์๋์ผ๋ก ์ข ๋ฃํ๋ฉฐ ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค.Using graceful shutdown with your IDE may not work properly if it does not send a proper SIGTERM signal. See the documentation of your IDE for more details. 1.1 application.yml ์ค์ application.yml์ ์ฐ์ํ ์ข ๋ฃ๋ฅผ ์ค์ ํ์์ต๋๋ค. ์คํ๋ง ๋ถํธ 3.4๋ถํฐ๋ ์ฐ์ํ ์ข ๋ฃ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋๋ฉฐ, .. Disk I/O ๋ฐ์ด๋ ์๋ฒ๋ฅผ ์ํ ํ์ด์ง ์บ์(Page Cache) "์น ๊ฐ๋ฐ์๋ฅผ ์ํ ๋๊ท๋ชจ ์๋น์ค๋ฅผ ์งํฑํ๋ ๊ธฐ์ "์ ๋ด์ฉ์ ์ฌ๊ตฌ์ฑํ์ต๋๋ค. ํ์ด์ง ์บ์๋?OS๋ ๋์คํฌ ์ก์ธ์ค๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค.ํ๋ก์ธ์ค A๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ๋ ํ, ๋ ์ด์ ๊ทธ ๋ฐ์ดํฐ๊ฐ ํ์ ์์ด์ก๋ค๊ณ ํด์ OS๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ๋ก ํด์ ํ์ง ์์ต๋๋ค.๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋จ๊ฒจ๋๋๋ฐ, ์ด๊ฒ์ด ๋ฐ๋ก ํ์ด์ง ์บ์์ ๋๋ค. ์ด ๋๋ถ์ ํ๋ก์ธ์ค B๊ฐ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋ ๋์คํฌ๋ฅผ ๋ค์ ์ฝ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ๋ก ๊ฐ์ ธ์ฌ ์ ์๊ฒ ๋ฉ๋๋ค. * OS์ ํ์ผ ์์คํ ๋ง๋ค ๋์คํฌ ์ฝ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅผํ ๋ฐ?๋ฆฌ๋ ์ค์๋ ext3, ext2 ๊ฐ์ ์ฌ๋ฌ ํ์ผ ์์คํ ์ด ์๊ณ ๊ฐ๊ฐ ๋์คํฌ๋ฅผ ์ฝ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด์ง๋ง, VFS(Virtual File System)๊ฐ ์ด๋ค ํ์ผ ์์คํ ์ ์ฌ์ฉํ๋ ํ์ด์ง ์บ์๋ฅผ ๋์ผํ๊ฒ ์ ๊ณตํด์ค๋ค๊ณ .. search_after API ๋ก OpenSearch์์ 10,000๊ฑด ์ด์ Pagination ์๋๋ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ best practice ๊ฐ ์๋ ์ ์์ต๋๋ค. ์ฐธ๊ณ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๋ฌธ์ ์ํฉOpenSearch์์ from๊ณผ size๋ฅผ ํ์ฉํด ํ์ด์ง ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ๋ ์ค, ๋ฐ์ดํฐ๊ฐ 10,000๊ฑด์ ๋์ด๊ฐ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค."Result window is too large, from + size must be less than or equal to: [10000] but was [10008]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting."OpenSearch(El.. ์ด์ 1 2 3 4 ยทยทยท 9 ๋ค์