[Java/Spring] Heap ์บ์‹œ vs Offheap ์บ์‹œ - ์บ์‹œ ํžˆํŠธ์ธ๋ฐ ์™œ ๋А๋ฆด๊นŒ?
ยท
Backend/Jave&Spring
๋ฐฐ๊ฒฝ์–ผ๋งˆ ์ „ ์—…๋ฌด์—์„œ ์บ์‹œ๋ฅผ ์ ์šฉํ–ˆ๋Š”๋ฐ๋„ ์„ฑ๋Šฅ์ด ๋‚˜์•„์ง€์ง€ ์•Š๋Š” ์ด์ƒํ•œ ์ƒํ™ฉ์„ ๊ฒช์—ˆ๋‹ค.์บ์‹œ ํžˆํŠธ๋Š” ์ •์ƒ์ด์—ˆ๋‹ค. ๊ทผ๋ฐ ๋А๋ ธ๋‹ค. ๋ฌธ์ œ๋Š” 8500๊ฐœ์งœ๋ฆฌ Map์„ ์บ์‹œ์—์„œ ๊บผ๋‚ด๋Š” ๋กœ์ง์— ์žˆ์—ˆ๋‹ค. getDataMap()์€ ๋ถ„๋ช… ์บ์‹œ์—์„œ ์‘๋‹ตํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์š”์ฒญ์ด ๋ชฐ๋ฆด ๋•Œ๋งˆ๋‹ค ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐ˜๋ณต๋๋‹ค.@Cacheable(value = "dataCache", key = "'dataMap'")public Map getDataMap() { return dataRepository.findAll();} ์›์ธ์„ ํŒŒ๊ณ ๋“ค๋‹ค ๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์บ์‹œ ์„ค์ • ํŒŒ์ผ์—์„œ ๋ฌด์‹ฌ์ฝ” ์„ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋๋‹ค. 50 ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋•Œ ์ฒ˜์Œ์œผ๋กœ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋‹ค. Heap ์บ์‹œ์™€ Offheap ์บ์‹œ๋Š” ๋™์ž‘ ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š”..
[ClickHouse] ClickHouse JOIN์ด ๋А๋ฆฐ ์ด์œ ์™€ ์ตœ์ ํ™” ์ „๋žต
ยท
Backend/Database
ClickHouse๋ฅผ ์ฒ˜์Œ ์“ฐ๋‹ค ๋ณด๋ฉด ํ•œ ๋ฒˆ์ฏค ์ด๋Ÿฐ ๊ฒฝํ—˜์„ ํ•œ๋‹ค. MySQL์—์„œ๋Š” ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ๋Œ์•„๊ฐ€๋˜ JOIN ์ฟผ๋ฆฌ๊ฐ€ ClickHouse์—์„œ๋Š” ์œ ๋… ๋А๋ฆฌ๊ฑฐ๋‚˜, WHERE ์กฐ๊ฑด์„ ๋‹ค ๊ฑธ์—ˆ๋Š”๋ฐ๋„ ํ’€์Šค์บ” ์ˆ˜์ค€์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๊ทธ ์ด์œ ๋ฅผ ClickHouse์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹์—์„œ ์ฐพ๊ณ , ์‹ค์ œ๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™” ์ „๋žต์„ ์ •๋ฆฌํ•œ๋‹ค. ์–ด๋–ค ์ƒํ™ฉ์ธ๊ฐ€ ์ˆ˜์–ต ๊ฑด์˜ ์œ ์ € ํ–‰๋™ ๋กœ๊ทธ(page_view_log)์™€ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ(order_log)๋ฅผ JOINํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ๋ณธ ํŠน์ • ๊ธฐ๊ฐ„, ํŠน์ • ์œ ์ €์˜ ๊ตฌ๋งค ๊ฑด์ˆ˜๋ฅผ ์ง‘๊ณ„ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์•„๋ž˜์ฒ˜๋Ÿผ ์“ฐ๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.SELECT count(*)FROM default.page_view_log p JOIN default.order_log o ON ..
[Java/Spring] ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์žฌ์ฒ˜๋ฆฌ ์•„ํ‚คํ…์ฒ˜ - BlockingQueue๋กœ ๋ฐ์ดํ„ฐ ์œ ์‹ค ๋ง‰๊ธฐ
ยท
Backend/Jave&Spring
๋ฐฐ๊ฒฝ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฐฐ์น˜ ์‹œ์Šคํ…œ์—์„œ ๋ฒŒํฌ INSERT๊ฐ€ ๊ฐ„ํ—์ ์œผ๋กœ ํƒ€์ž„์•„์›ƒ์œผ๋กœ ์‹คํŒจํ–ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ๋Š” ์˜ˆ์™ธ๋ฅผ ๋กœ๊ทธ๋กœ๋งŒ ๋‚จ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•œ ์ˆ˜์ฒœ ๊ฑด์ด ๊ทธ๋Œ€๋กœ ์œ ์‹ค๋๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ์€ DB ๋ถ€ํ•˜๊ฐ€ ๋†’์€ ๊ตฌ๊ฐ„์ด๋‹ค. ์‹คํŒจ๊ฐ€ ์—ฐ๋‹ฌ์•„ ์ˆ˜ ์ฒœ๊ฑด์”ฉ N๋ฒˆ ๋ฐœ์ƒํ–ˆ๋‹ค. ์‹œ๋„ํ–ˆ๋˜ ๋ฐฉ์‹ ๋‹จ์ˆœํžˆ ์˜ˆ์™ธ๋ฅผ ์žก์•„ ์žฌ์‹œ๋„ํ•˜๋Š” ๋ฐฉ์‹์€ ๋ฐฐ์น˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ , ์‹คํŒจ๊ฐ€ ์—ฐ๋‹ฌ์•„ ๋ฐœ์ƒํ•˜๋ฉด ์žฌ์‹œ๋„ ๋กœ์ง๋„ ํ•จ๊ป˜ ์‹คํŒจํ•œ๋‹ค. ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ์€ DB ๋ถ€ํ•˜๊ฐ€ ๋†’์€ ๊ตฌ๊ฐ„์ด๋‹ค. ์žฌ์‹œ๋„๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ™์€ ๋ถ€ํ•˜ ๊ตฌ๊ฐ„์—์„œ ๋‹ค์‹œ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ณ , ๊ทธ ์‚ฌ์ด ๋‹ค๋ฅธ ๋ฐฐ์น˜๋„ ๊ฐ™์€ ์Šค๋ ˆ๋“œํ’€์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์‹คํŒจ๊ฐ€ ์—ฐ๋‹ฌ์•„ ์ˆ˜ ์ฒœ๊ฑด์”ฉ N๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ํŒจํ„ด์—์„œ ์ธ๋ผ์ธ ์žฌ์‹œ๋„๋Š” ์ˆ˜์‹ญ ๋ฒˆ ์—ฐ์†์œผ๋กœ ์Œ“์—ฌ ๋ฐฐ์น˜ ์ „์ฒด๋ฅผ ๋งˆ๋น„์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋Œ€์‹ ..
[Java] volatile - ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
ยท
Backend/Jave&Spring
๋“ค์–ด๊ฐ€๋ฉฐ ๋…๋ฆฝ ํ + ์ „์šฉ ์›Œ์ปค ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์ข…๋ฃŒ ์‹ ํ˜ธ๊ฐ€ ์›Œ์ปค ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. @PreDestroy์—์„œ running = false๋ฅผ ๋ถ„๋ช…ํžˆ ์ผ๋Š”๋ฐ๋„ ์›Œ์ปค ์Šค๋ ˆ๋“œ๋Š” ๋ฃจํ”„๋ฅผ ๊ณ„์† ๋Œ๊ณ  ์žˆ์—ˆ๋‹ค. private volatile boolean running = true; ํ•ด๊ฒฐ์ฑ…์€ volatile ํ•œ ํ‚ค์›Œ๋“œ์˜€์ง€๋งŒ, ์™œ ์—†์œผ๋ฉด ์•ˆ ๋˜๋Š”์ง€๋Š” ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ์ด ๊ธ€์€ ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์— ์ด๋ฅด๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์„ ๋‹ด์•˜๋‹ค. 1. ๋ฌธ์ œ ๋ฐœ์ƒ - volatile ์—†์ด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”๊ฐ€ volatile ์—†์ด ์ข…๋ฃŒ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ƒ๊ธฐ๋Š”์ง€ ์ฝ”๋“œ๋กœ ๋จผ์ € ๋ณด์ž.// volatile ์—†์Œprivate boolean running = true;// ์›Œ์ปค ..
[DB] READ_UNCOMMITTED์—์„œ DELETE๊ฐ€ ํƒ€์ž„์•„์›ƒ ๋‚˜๋Š” ์ด์œ 
ยท
Backend/Database
๋ฌธ์ œ ์ƒํ™ฉ ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด„ ์‚ญ์ œํ•˜๋Š” ๋ฐฐ์น˜์—์„œ ๋‘ ์ข…๋ฅ˜์˜ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.Lock wait timeout exceeded; try restarting transaction ← ์„œ๋ธŒ์ฟผ๋ฆฌ DELETE ๋‹จ๊ณ„Query execution was interrupted (max_statement_time exceeded) ← PK ๊ธฐ๋ฐ˜ SELECT+DELETE ๋‹จ๊ณ„ ๋‘ ์—๋Ÿฌ๋Š” ๋™์‹œ์— ๋ฐœ์ƒํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์„œ๋ธŒ์ฟผ๋ฆฌ DELETE๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Lock wait timeout์ด ๋ฐœ์ƒํ–ˆ๊ณ , PK ๊ธฐ๋ฐ˜ SELECT+DELETE๋กœ ์ „ํ™˜ํ•œ ๋’ค max_statement_time exceeded๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํƒ€์ž„์•„์›ƒ ์ข…๋ฅ˜๊ฐ€ ๋ฐ”๋€ ๊ฒƒ ์ž์ฒด๊ฐ€ ๋ถ„์„ ํฌ์ธํŠธ๋‹ค. ์ดˆ๊ธฐ ์ฝ”๋“œ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ DELETE ๊ตฌ์กฐ์˜€๋‹ค.DELET..
[Spring/batch] BlockingQueue์™€ ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•œ Telegram 429 Rate Limit ํ•ด๊ฒฐ
ยท
Backend/Jave&Spring
๋ฌธ์ œ ์ƒํ™ฉ ์Šคํ”„๋ง ๋ฐฐ์น˜ ์„œ๋น„์Šค์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—… ๋Œ€์ƒ์„ ์Šค๋ ˆ๋“œ ํ’€๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ ํ›„ Telegram์œผ๋กœ ๋ฐฐ์น˜ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ฆผํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ํ‰์†Œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ, ๋‹จ๊ธฐ๊ฐ„(1~2์ดˆ)์— ๋๋‚˜๋Š” ๋ฐฐ์น˜ ๋Œ€์ƒ์ด ๋งŽ์€ ํŠน์ • ์‹œ๊ฐ„๋Œ€์˜ ๋ฐฐ์น˜์—์„œ๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐ˜๋ณต ๋ฐœ์ƒํ–ˆ๋‹ค. 14:30:00์— 46๊ฑด์„ ๋Œ€์ƒ์œผ๋กœ ๋ฐฐ์น˜ ์‹œ์ž‘ ํ›„, ์ˆœ์ฐจ์ ์œผ๋กœ Telegram ์•Œ๋ฆผ์„ ๋ฐœ์†กํ–ˆ๋‹ค.(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰๋ถ€ํ„ฐ ์•Œ๋ฆผ ๋ฐœ์†ก๊นŒ์ง€ ๋ฐฐ์น˜ ๋Œ€์ƒ ๋‹น 1~2์ดˆ ์•ˆ์— ๋๋‚œ๋‹ค.) ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ 14:30:33๋ถ€ํ„ฐ Telegram ์•Œ๋ฆผ ๋ฐœ์†ก ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 14:30:33 429 Too Many Requests retry_after: 2714:30:34 429 Too Many Requests retry_after: 2..
giraffe_
'Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก