1C: Enterprise: Java, PostgreSQL, Hazelcast๋ฅผ ์œ„ํ•œ ๊ณ ๋ถ€ํ•˜ ํ™•์žฅ ๊ฐ€๋Šฅ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ 

์ด ๊ธ€์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ๋ฐฉ๋ฒ•๊ณผ ์ด์œ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉ ์‹œ์Šคํ…œ โ€“ ํด๋ผ์ด์–ธํŠธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ 1C:Enterprise ์„œ๋ฒ„ ๊ฐ„์— ์ •๋ณด๋ฅผ ์ „์†กํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ - ์ž‘์—… ์„ค์ •๋ถ€ํ„ฐ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํ†ตํ•œ ์‚ฌ๊ณ ๊นŒ์ง€.

์ƒํ˜ธ ์ž‘์šฉ ์‹œ์Šคํ…œ(์ดํ•˜ SV)์€ ์ „๋‹ฌ์ด ๋ณด์žฅ๋˜๋Š” ๋ถ„์‚ฐ๋œ ๋‚ด๊ฒฐํ•จ์„ฑ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. SV๋Š” ์˜จ๋ผ์ธ ์„œ๋น„์Šค(1C์—์„œ ์ œ๊ณต)์™€ ์ž์ฒด ์„œ๋ฒ„ ์‹œ์„ค์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋Ÿ‰ ์ƒ์‚ฐ ์ œํ’ˆ์œผ๋กœ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์€ ํ™•์žฅ์„ฑ์„ ๊ฐ–์ถ˜ ๊ณ ๋ถ€ํ•˜ ์„œ๋น„์Šค๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SV๋Š” ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ—ค์ด์ ค ์บ์ŠคํŠธ ๋ฐ ๊ฒ€์ƒ‰ ์—”์ง„ ํƒ„์„ฑ ๊ฒ€์ƒ‰. ๋˜ํ•œ Java์™€ PostgreSQL์„ ์ˆ˜ํ‰์ ์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
1C: Enterprise: Java, PostgreSQL, Hazelcast๋ฅผ ์œ„ํ•œ ๊ณ ๋ถ€ํ•˜ ํ™•์žฅ ๊ฐ€๋Šฅ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ 

๋ฌธ์ œ ์„ฑ๋ช…

์ƒํ˜ธ ์ž‘์šฉ ์‹œ์Šคํ…œ์„ ๋งŒ๋“  ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด 1C์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์กฐ๊ธˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„ , ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ์ผ์„ ์•„์ง ๋ชจ๋ฅด๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์šฐ๋ฆฌ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. :) ์šฐ๋ฆฌ๋Š” 1C:Enterprise ๊ธฐ์ˆ  ํ”Œ๋žซํผ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ์—๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ๋„๊ตฌ๋Š” ๋ฌผ๋ก  ๋น„์ฆˆ๋‹ˆ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐœ๋ฐœ ํŒจ๋Ÿฌ๋‹ค์ž„

1C:Enterprise์—์„œ ์ƒ์„ฑ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ XNUMX๋‹จ๊ณ„๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ โ€œDBMS โ€“ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ โ€“ ํด๋ผ์ด์–ธํŠธโ€. ๋‹ค์Œ์œผ๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋‚ด์žฅ 1C ์–ธ์–ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ์ฒด(๋””๋ ‰ํ„ฐ๋ฆฌ, ๋ฌธ์„œ ๋“ฑ)์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž‘์—…๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์–‘์‹ ๋ฐ ๋ช…๋ น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋Šฅ๋„ ์„œ๋ฒ„์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์–‘์‹ ์ˆ˜์‹ , ์—ด๊ธฐ ๋ฐ ํ‘œ์‹œ, ์‚ฌ์šฉ์ž์™€์˜ "ํ†ต์‹ "(๊ฒฝ๊ณ , ์งˆ๋ฌธ ๋“ฑ), ๋น ๋ฅธ ์‘๋‹ต์ด ํ•„์š”ํ•œ ์–‘์‹์˜ ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ(์˜ˆ: ๊ฐ€๊ฒฉ์— ์ˆ˜๋Ÿ‰ ๊ณฑํ•˜๊ธฐ), ๋กœ์ปฌ ํŒŒ์ผ ์ž‘์—… ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์žฅ๋น„ ์ž‘์—….

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ ํ”„๋กœ์‹œ์ €์™€ ํ•จ์ˆ˜์˜ ํ—ค๋”๋Š” &AtClient / &AtServer ์ง€์‹œ๋ฌธ(์˜์–ด ๋ฒ„์ „์˜ ์–ธ์–ด์—์„œ๋Š” &AtClient / &AtServer)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์œ„์น˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1C ๊ฐœ๋ฐœ์ž๋Š” ์ด์ œ ์ง€์‹œ๋ฌธ์ด ์‹ค์ œ๋กœ ~ ์ด์ƒ, ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ์ง€๊ธˆ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋ฒ„ ์ฝ”๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ธํ•ด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ทผ๋ณธ์ ์ธ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ์„œ๋ฒ„ ์ฝ”๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ๋“  ์„œ๋ฒ„์—์„œ๋“  ํ˜ธ์ถœ๋˜๋Š” ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์„œ๋ฒ„ ์ฝ”๋“œ์—์„œ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Ÿฌํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์ด๋ฅผ ํ˜ธ์ถœํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ซํžˆ๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„œ๋ฒ„๋Š” ๋” ์ด์ƒ ํ˜ธ์ถœํ•  ์‚ฌ๋žŒ์ด ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

1C: Enterprise: Java, PostgreSQL, Hazelcast๋ฅผ ์œ„ํ•œ ๊ณ ๋ถ€ํ•˜ ํ™•์žฅ ๊ฐ€๋Šฅ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ 
๋ฒ„ํŠผ ํด๋ฆญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ: ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€๋งŒ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด "์žฅ๊ธฐ ์‹คํ–‰" ๋ณด๊ณ ์„œ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜์–ด ๋ณด๊ณ ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ณด๋‚ด๋ ค๋Š” ๊ฒฝ์šฐ ๊ทธ๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ์„œ๋ฒ„๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํด๋งํ•˜๋Š” ๋“ฑ์˜ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ถˆํ•„์š”ํ•œ ํ˜ธ์ถœ๋กœ ์‹œ์Šคํ…œ์„ ๋กœ๋“œํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋‹ค์ง€ ์šฐ์•„ํ•ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด ์ „ํ™”๊ฐ€ ์™”์„ ๋•Œ์—๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. SIP- ์ „ํ™”๋ฅผ ๊ฑธ ๋•Œ ๋ฐœ์‹ ์ž ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ๋Œ€๋ฐฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด๋ฅผ ์ฐพ์•„ ๋ฐœ์‹  ์ƒ๋Œ€๋ฐฉ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๋˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ๋ฌธํ•œ ์ƒํ’ˆ์ด ์ฐฝ๊ณ ์— ๋„์ฐฉํ•˜๋ฉด ์ด์— ๋Œ€ํ•ด ๊ณ ๊ฐ์˜ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ƒ์‚ฐ ๊ทธ ์ž์ฒด

๋ฉ”์‹œ์ง• ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ด๋ฉฐ ์ „๋‹ฌ์ด ๋ณด์žฅ๋˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ 1C ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฉ”์‹ ์ €(๋ฉ”์‹œ์ง€, ํ™”์ƒ ํ†ตํ™”)๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜ํ‰ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€ํ•˜๋Š” ๋…ธ๋“œ ์ˆ˜๋ฅผ ๋Š˜๋ ค์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ะ ะตะฐะปะธะทะฐั†ะธั

์šฐ๋ฆฌ๋Š” SV์˜ ์„œ๋ฒ„ ๋ถ€๋ถ„์„ 1C:Enterprise ํ”Œ๋žซํผ์— ์ง์ ‘ ํ†ตํ•ฉํ•˜์ง€ ์•Š๊ณ  1C ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†”๋ฃจ์…˜์˜ ์ฝ”๋“œ์—์„œ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ์ œํ’ˆ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ 1C ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์—(์˜ˆ: ๋ฌด์—ญ ๊ด€๋ฆฌ์™€ ํšŒ๊ณ„ ๊ฐ„) ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ 1C ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ 1C:Enterprise ํ”Œ๋žซํผ์˜ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์„œ๋ฒ„ ๋“ฑ์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์—์„œ๋Š” 1C ์„ค์น˜์˜ "์ธก๋ฉด"์— ์œ„์น˜ํ•œ ๋ณ„๋„์˜ ์ œํ’ˆ์œผ๋กœ SV๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ์˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” SV๋ฅผ ๋ณ„๋„์˜ ์ œํ’ˆ์œผ๋กœ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ๊ธฐ์—…์—์„œ๋Š” ์„œ๋ฒ„ ๋กœ์ปฌ ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฒ„ํ—ค๋“œ ๋น„์šฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‹น์‚ฌ ํด๋ผ์šฐ๋“œ(wss://1cdialog.com)์— ์„ค์น˜ํ•œ CB ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ๊ณ ๊ฐ์€ ์‹œ์„ค์— ์ž์ฒด CB ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํด๋ผ์šฐ๋“œ SaaS ์ œํ’ˆ์—์„œ๋„ ์œ ์‚ฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 1c์‹ ์„ ํ•œ โ€“ ์–‘์‚ฐํ˜• ์ œํ’ˆ์œผ๋กœ ์ƒ์‚ฐ๋˜์–ด ๊ณ ๊ฐ์‚ฌ ํ˜„์žฅ์— ์„ค์น˜๋˜๋ฉฐ, ๋‹น์‚ฌ ํด๋ผ์šฐ๋“œ์—๋„ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. https://1cfresh.com/.

์‹ ์ฒญ

๋กœ๋“œ ๋ฐ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๋ถ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹Œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์•ž์— ๋‘๊ณ  ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์—์„œ ๋…ธ๋“œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Hazelcast์—์„œ ๊ฒŒ์‹œ/๊ตฌ๋…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์€ ์›น์†Œ์ผ“์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ์— ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์บ์‹œ

์šฐ๋ฆฌ๋Š” Redis, Hazelcast ๋ฐ Ehcache ์ค‘์—์„œ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. 2015๋…„์ด์—์š”. Redis๋Š” ๋ฐฉ๊ธˆ ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค(๋„ˆ๋ฌด ์ƒˆ๋กญ๊ณ  ๋ฌด์„ญ์Šต๋‹ˆ๋‹ค). Sentinel์—๋Š” ๋งŽ์€ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Ehcache๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์กฐ๋ฆฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค(์ด ๊ธฐ๋Šฅ์€ ๋‚˜์ค‘์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค). ์šฐ๋ฆฌ๋Š” Hazelcast 3.4๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Hazelcast๋Š” ์ƒ์ž์—์„œ ๊บผ๋‚ด์–ด ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์กฐ๋ฆฝ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋…ธ๋“œ ๋ชจ๋“œ์—์„œ๋Š” ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์บ์‹œ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ๋คํ”„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋ฏ€๋กœ ์œ ์ผํ•œ ๋…ธ๋“œ๋ฅผ ์žƒ์œผ๋ฉด ๋ฐ์ดํ„ฐ๋„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•˜๋Š” ์—ฌ๋Ÿฌ Hazelcast๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์บ์‹œ๋ฅผ ๋ฐฑ์—…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ํ—ค์ด์ฆ์บ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ €์žฅ. ๋งค๋ฒˆ ์„ธ์…˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์„ธ์…˜์„ Hazelcast์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์€๋‹‰์ฒ˜. ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์„ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ์บ์‹œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ƒˆ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ์— ๋„ฃ์œผ์„ธ์š”.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Hazelcast ์ฃผ์ œ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋…ธ๋“œ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ ์ž ๊ธˆ. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณ ์œ  ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ๋ก ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค(1C ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ ์‹ฑ๊ธ€ํ†ค ํ† ๋ก ).

conversationKeyChecker.check("ะ‘ะ•ะะ—ะžะšะžะ›ะžะะšะ");

      doInClusterLock("ะ‘ะ•ะะ—ะžะšะžะ›ะžะะšะ", () -> {

          conversationKeyChecker.check("ะ‘ะ•ะะ—ะžะšะžะ›ะžะะšะ");

          createChannel("ะ‘ะ•ะะ—ะžะšะžะ›ะžะะšะ");
      });

์ฑ„๋„์ด ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž๋ฌผ์‡ ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ž ๊ธˆ์„ ํš๋“ํ•œ ํ›„ ์ž ๊ธˆ์„ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทธ ์ˆœ๊ฐ„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋„ ํ™•์ธํ•˜์—ฌ ๋™์ผํ•œ ํ† ๋ก ์„ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ๋˜๋Š” ์ผ๋ฐ˜ Java ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž ๊ธ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด - ์†๋„๊ฐ€ ๋Š๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•ˆํƒ€๊น์ง€๋งŒ, ํ—ค์ด์ฆ์บ์ŠคํŠธ๋ฅผ ํ†ตํ•ด - ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋‹น์‹ ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DBMS ์„ ํƒ

์šฐ๋ฆฌ๋Š” PostgreSQL์„ ์‚ฌ์šฉํ•˜๊ณ  ์ด DBMS ๊ฐœ๋ฐœ์ž์™€ ํ˜‘๋ ฅํ•œ ๊ด‘๋ฒ”์œ„ํ•˜๊ณ  ์„ฑ๊ณต์ ์ธ ๊ฒฝํ—˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ๋กœ๋Š” ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. XL, XC, ์‹œํˆฌ์Šค, ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™•์žฅ๋˜๋Š” NoSQL์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” NoSQL์„ ๋ฉ”์ธ ์Šคํ† ๋ฆฌ์ง€๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ์ด์ „์— ์ž‘์—…ํ•˜์ง€ ์•Š์•˜๋˜ ํ—ค์ด์ฆ์บ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ด๋Š” ์ƒค๋”ฉ. ์•„์‹œ๋‹ค์‹œํ”ผ ์ƒค๋”ฉ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ„๋„์˜ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ๋ถ€๋ถ„์„ ๋ณ„๋„์˜ ์„œ๋ฒ„์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒค๋”ฉ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ํ…Œ์ด๋ธ”์„ ๋‹ค์–‘ํ•œ ๋น„์œจ๋กœ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ A์— ๋งŽ์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ…Œ์ด๋ธ”์˜ ์ผ๋ถ€๋ฅผ ์„œ๋ฒ„ B๋กœ ์ด๋™ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ๋‹จ์ˆœํžˆ ์กฐ๊ธฐ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๋น„๋ช…์„ ์ง€๋ฅด๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์ค‘ ํ…Œ๋„ŒํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ œํ•œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์›น์‚ฌ์ดํŠธ์—์„œ ๋‹ค์ค‘ ํ…Œ๋„ŒํŠธ์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์”จํˆฌ์Šค ๋ฐ์ดํ„ฐ.

SV๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ตฌ๋…์ž์˜ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ERP ๋˜๋Š” ํšŒ๊ณ„์™€ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ์„ค์น˜์ž…๋‹ˆ๋‹ค. ๊ฐ€์ž…์ž๋Š” ์ž์‹ ์„ ๋Œ€์‹ ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด SV ์„œ๋ฒ„์— ๋“ฑ๋ก๋œ ์กฐ์ง ๋˜๋Š” ๊ฐœ์ธ์ž…๋‹ˆ๋‹ค. ๊ตฌ๋…์ž๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์„œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋…์ž๋Š” ์šฐ๋ฆฌ ์‹œ์Šคํ…œ์˜ ํ…Œ๋„ŒํŠธ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ž…์ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ์  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ž…์ž๊ฐ€ ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ์ƒ์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ๊ฒƒ์„ ํ™•์ธํ•˜๋ฉด ์ด๋ฅผ ๋ณ„๋„์˜ ๋ฌผ๋ฆฌ์  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(๋˜๋Š” ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฐ€์ž…์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด์™€ ํ•จ๊ป˜ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์ด ์ €์žฅ๋˜๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

1C: Enterprise: Java, PostgreSQL, Hazelcast๋ฅผ ์œ„ํ•œ ๊ณ ๋ถ€ํ•˜ ํ™•์žฅ ๊ฐ€๋Šฅ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ 

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”(๋ฐ ๊ธฐํƒ€ ์ž์ฃผ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ)์„ ์บ์‹œ์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋…์ž์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ด๋ฅผ ๋‚ด๋ถ€ ํŒŒํ‹ฐ์…˜์œผ๋กœ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” pg_pathman.

์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๋ฅผ ์žƒ๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๋ณต์ œ๋ณธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ์‹ ๋ฐ ๋น„๋™๊ธฐ์‹ ๋ณต์ œ๋ณธ์„ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์†์‹ค๋œ ๊ฒฝ์šฐ์—๋„ ์•ˆ์ „์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ์†์‹ค์€ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ•ด๋‹น ๋™๊ธฐ ๋ณต์ œ๋ณธ์ด ๋™์‹œ์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋™๊ธฐ ๋ณต์ œ๋ณธ์ด ์†์‹ค๋˜๋ฉด ๋น„๋™๊ธฐ ๋ณต์ œ๋ณธ์€ ๋™๊ธฐ ๋ณต์ œ๋ณธ์ด ๋ฉ๋‹ˆ๋‹ค.
์ฃผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์†์‹ค๋˜๋ฉด ๋™๊ธฐ ๋ณต์ œ๋ณธ์€ ์ฃผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋˜๊ณ , ๋น„๋™๊ธฐ ๋ณต์ œ๋ณธ์€ ๋™๊ธฐ ๋ณต์ œ๋ณธ์ด ๋ฉ๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰์„ ์œ„ํ•œ Elasticsearch

๋ฌด์—‡๋ณด๋‹ค๋„ SV๋Š” ๋ฉ”์‹ ์ €์ด๊ธฐ๋„ ํ•˜๋ฏ€๋กœ ๋ถ€์ •ํ™•ํ•œ ์ผ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜•ํƒœ๋ฅผ ๊ณ ๋ คํ•œ ๋น ๋ฅด๊ณ  ํŽธ๋ฆฌํ•˜๋ฉฐ ์œ ์—ฐํ•œ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜์ง€ ์•Š๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฌด๋ฃŒ ๊ฒ€์ƒ‰ ์—”์ง„ Elasticsearch๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฃจ์„ผ. ๋˜ํ•œ Elasticsearch๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ(๋งˆ์Šคํ„ฐ โ€“ ๋ฐ์ดํ„ฐ โ€“ ๋ฐ์ดํ„ฐ)์— ๋ฐฐํฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

github์—์„œ ์šฐ๋ฆฌ๋Š” ์ฐพ์•˜์Šต๋‹ˆ๋‹ค ๋Ÿฌ์‹œ์•„์–ด ํ˜•ํƒœํ•™ ํ”Œ๋Ÿฌ๊ทธ์ธ Elasticsearch์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”. Elasticsearch ์ธ๋ฑ์Šค์—๋Š” ๋‹จ์–ด ์–ด๊ทผ(ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ฒฐ์ •ํ•จ)๊ณผ N-๊ทธ๋žจ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰ํ•  ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด N-gram ์ค‘์—์„œ ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์— ์ €์žฅ๋˜๋ฉด "texts"๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋‹ค์Œ N-gram์œผ๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค.

[๊ทธ๋“ค, tek, tex, text, texts, ek, ex, ext, texts, ks, kst, ksty, st, sty, you],

๊ทธ๋ฆฌ๊ณ  "text"๋ผ๋Š” ๋‹จ์–ด์˜ ์–ด๊ทผ๋„ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์–ด์˜ ์‹œ์ž‘, ์ค‘๊ฐ„, ๋์—์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฐ ๊ทธ๋ฆผ

1C: Enterprise: Java, PostgreSQL, Hazelcast๋ฅผ ์œ„ํ•œ ๊ณ ๋ถ€ํ•˜ ํ™•์žฅ ๊ฐ€๋Šฅ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ 
๊ธฐ์‚ฌ ์‹œ์ž‘ ๋ถ€๋ถ„๋ถ€ํ„ฐ ๊ทธ๋ฆผ์„ ๋ฐ˜๋ณตํ•˜๋˜ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ์ธํ„ฐ๋„ท์— ๋…ธ์ถœ๋œ ๋ฐธ๋Ÿฐ์„œ; ์šฐ๋ฆฌ๋Š” nginx๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌด์—‡์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋Š” Hazelcast๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์›น ์†Œ์ผ“์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด ๊ทธ๋ฌผ์ฝ”.
  • Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Java 8๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋ฒˆ๋“ค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. OSGi. ๊ณ„ํš์—๋Š” Java 10์œผ๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ๋ชจ๋“ˆ๋กœ์˜ ์ „ํ™˜์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ

SV๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ œํ’ˆ์˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋กœ๋“œ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

๊ฐ SV ๋ฆด๋ฆฌ์Šค์—๋Š” ๋กœ๋“œ ํ…Œ์ŠคํŠธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ๋Š” ๋ฉฐ์น  ๋™์•ˆ ์ง„ํ–‰๋˜์—ˆ์œผ๋ฉฐ ์„œ๋น„์Šค ์žฅ์• ๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์š” ์ž‘์—…์— ๋Œ€ํ•œ ์‘๋‹ต ์‹œ๊ฐ„์ด ํŽธ์•ˆํ•œ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • ์ด์ „ ๋ฒ„์ „ ๋Œ€๋น„ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ 10%๋ฅผ ๋„˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์›๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์—์„œ ๊ฐ€์žฅ ํ™œ๋™์ ์ธ ๊ตฌ๋…์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ๊ทธ ์ˆซ์ž์— 5(๋ฉ”์‹œ์ง€ ์ˆ˜, ํ† ๋ก  ์ˆ˜, ์‚ฌ์šฉ์ž ์ˆ˜)๋ฅผ ๊ณฑํ•˜๊ณ  ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉ ์‹œ์Šคํ…œ์˜ ๋กœ๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ
  2. ์—ฐ๊ฒฐ๋งŒ
  3. ๊ฐ€์ž…์ž ๋“ฑ๋ก

์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ ์ค‘์— ์šฐ๋ฆฌ๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ, ํ† ๋ก  ์ƒ์„ฑ, ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก ์ˆ˜์‹  ๋“ฑ์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์˜ ์ž‘์—…(์ฝ์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์“ฐ๊ธฐ) ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด ์†”๋ฃจ์…˜(๋‹ค๋ฅธ ๊ตฌ์„ฑ์˜ ํŒจํ‚ค์ง€ ์ „์†ก, ๊ฒฝ๊ณ  ์ฒ˜๋ฆฌ)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ์˜ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ
    • ์ฝ์ง€ ์•Š์€ ํ† ๋ก ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค
    • ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์„ ๊ฐ€๋Šฅ์„ฑ์ด 50%
    • ๋ฌธ์ž๋ฅผ ๋ณด๋‚ผ ๊ฐ€๋Šฅ์„ฑ์ด 50%
    • ๋‹ค์Œ ์‚ฌ์šฉ์ž:
      • ์ƒˆ๋กœ์šด ํ† ๋ก ์„ ๋งŒ๋“ค ํ™•๋ฅ ์€ 20%์ž…๋‹ˆ๋‹ค.
      • ์ž„์˜์˜ ํ† ๋ก ์„ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      • ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค
      • ๋ฉ”์‹œ์ง€, ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์š”์ฒญ
      • ์ด ํ† ๋ก ์—์„œ ๋ฌด์ž‘์œ„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” XNUMX๊ฐœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • ํ† ๋ก ์„ ๋– ๋‚œ๋‹ค
      • 20ํšŒ ๋ฐ˜๋ณต
      • ๋กœ๊ทธ์•„์›ƒํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

    • ์ฑ—๋ด‡์ด ์‹œ์Šคํ…œ์— ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์˜ ๋ฉ”์‹œ์ง•์„ ์—๋ฎฌ๋ ˆ์ด์…˜).
      • ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์ฑ„๋„์„ ๋งŒ๋“ค ํ™•๋ฅ ์ด 50%์ž…๋‹ˆ๋‹ค(ํŠน๋ณ„ ํ† ๋ก ).
      • 50%๋Š” ๊ธฐ์กด ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๋ฅผ ์“ธ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

"์—ฐ๊ฒฐ ์ „์šฉ" ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋‚˜ํƒ€๋‚œ ๋ฐ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์— ์—ฐ๊ฒฐํ–ˆ์ง€๋งŒ ์•„์ง ์ฐธ์—ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ ์‚ฌ์šฉ์ž๋Š” ์•„์นจ 09์‹œ์— ์ปดํ“จํ„ฐ๋ฅผ ์ผœ๊ณ  ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•œ ํ›„ ์นจ๋ฌต์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ๋žŒ๋“ค์€ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ๋‹ค์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์œ ์ผํ•œ ํŒจํ‚ค์ง€๋Š” PING/PONG์ด์ง€๋งŒ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋“ค์€ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?). ์ด ํ…Œ์ŠคํŠธ๋Š” 00๋ถ„ ๋งŒ์— ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์— ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋Š” ์ƒํ™ฉ์„ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ดˆ์ ์€ ์ •ํ™•ํžˆ ์ด ์ฒซ ๋ฒˆ์งธ ์ž…๋ ฅ์— ๋งž์ถฐ์ ธ ์žˆ์œผ๋ฏ€๋กœ ์‹คํŒจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์‚ฌ๋žŒ์ด ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ ๋–จ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์œ ๊ฒƒ์„ ์ƒ๊ฐํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค).

๊ตฌ๋…์ž ๋“ฑ๋ก ์Šคํฌ๋ฆฝํŠธ๋Š” ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ๋ฅผ ์‹ค์‹œํ•œ ๊ฒฐ๊ณผ ํ†ต์‹  ์ค‘์— ์‹œ์Šคํ…œ์ด ๋Š๋ ค์ง€์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์šฉ์ž๋“ค์ด ์™”๊ณ  ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์ธํ•ด ๋“ฑ๋ก์ด ์‹คํŒจํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋“ฑ๋กํ•  ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ / dev / random, ์ด๋Š” ์‹œ์Šคํ…œ์˜ ์—”ํŠธ๋กœํ”ผ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ถฉ๋ถ„ํ•œ ์—”ํŠธ๋กœํ”ผ๋ฅผ ์ถ•์ ํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ๊ณ  ์ƒˆ๋กœ์šด SecureRandom์ด ์š”์ฒญ๋˜๋ฉด ์ˆ˜์‹ญ ์ดˆ ๋™์•ˆ ์ •์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋œ ์•ˆ์ „ํ•œ /dev/urandom์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ , ์—”ํŠธ๋กœํ”ผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŠน์ˆ˜ ๋ณด๋“œ๋ฅผ ์„ค์น˜ํ•˜๊ณ , ๋ฏธ๋ฆฌ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ’€์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ’€ ๊ด€๋ จ ๋ฌธ์ œ๋Š” ์ผ์‹œ์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋‚˜, ์ดํ›„ ์‹ ๊ทœ ๊ฐ€์ž…์ž ๋“ฑ๋ก์„ ์œ„ํ•ด ๋ณ„๋„์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ถ€ํ•˜ ์ƒ์„ฑ๊ธฐ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JMeter๋ฅผ. ์›น์†Œ์ผ“์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋ฏ€๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. "jmeter websocket" ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. BlazeMeter์˜ ๊ธฐ์‚ฌ, ์ถ”์ฒœํ•˜๋Š” ๊ฒƒ Maciej Zaleski์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ.

๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค.

์ง„์ง€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•œ ์งํ›„์— ์šฐ๋ฆฌ๋Š” JMeter์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์‹œ์ž‘๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ณ„๋„์˜ ํฐ ์ด์•ผ๊ธฐ๋กœ, ๋ณ„ 176๊ฐœ์™€ github์— 132๊ฐœ์˜ ํฌํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์ž ์ž์‹ ์€ 2015๋…„ ์ดํ›„๋กœ ์ด๋ฅผ ์•ฝ์†ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” 2015๋…„์— ์ด๋ฅผ ๋ฐ›์•„๋“ค์˜€์ง€๋งŒ ์˜์‹ฌ์„ ์ผ์œผํ‚ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค), ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ github ๋ฌธ์ œ, ๋‹ซํžˆ์ง€ ์•Š์€ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ 7๊ฐœ.
์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ ํ† ๋ก ์— ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค.

  1. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ผ๋ฐ˜ LinkedList๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. NPE ๋Ÿฐํƒ€์ž„์—. ์ด ๋ฌธ์ œ๋Š” ConcurrentLinkedDeque๋กœ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋™๊ธฐํ™”๋œ ๋ธ”๋ก์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์Šค์Šค๋กœ ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ์—ฐ๊ฒฐ ํ•ด์ œ ์‹œ ์—ฐ๊ฒฐ ์ •๋ณด๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์Œ(https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋“œ(์ƒ˜ํ”Œ ์ข…๋ฃŒ ์‹œ websocket์ด ๋‹ซํžˆ์ง€ ์•Š์•˜์ง€๋งŒ ๋‚˜์ค‘์— ๊ณ„ํš์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ)์—์„œ๋Š” ์‘๋‹ต ํŒจํ„ด์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

์ด๊ฒƒ์€ github์— ์žˆ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•œ ์ผ:

  1. ๊ฐ€์ ธ์˜ด ํฌํฌ ์—˜๋ฆฌ๋ž€ ์ฝ”๊ฐ„ (@elyrank) โ€“ ๋ฌธ์ œ 1๊ณผ 3์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ 2
  3. ๋ถ€๋‘๋ฅผ 9.2.14์—์„œ 9.3.12๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
  4. ThreadLocal์—์„œ SimpleDateFormat์„ ๋ž˜ํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค. SimpleDateFormat์€ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์•„ ๋Ÿฐํƒ€์ž„ ์‹œ NPE๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  5. ๋˜ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ˆ˜์ •(์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ์„ ๋•Œ ์—ฐ๊ฒฐ์ด ์ž˜๋ชป ๋‹ซํ˜”์Œ)

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ทธ๊ฒƒ์€ ํ๋ฅธ๋‹ค!

ํ•˜๋ฃจ๊ฐ€ ์•„๋‹ˆ๋ผ ์ดํ‹€ ๋งŒ์— ๊ธฐ์–ต๋ ฅ์ด ๋–จ์–ด์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚จ์€ ์‹œ๊ฐ„์ด ์ „ํ˜€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ ์€ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์ง€๋งŒ ์—์ด์ „ํŠธ๋Š” XNUMX๊ฐœ์˜€์Šต๋‹ˆ๋‹ค. ์ด ์ •๋„๋ฉด ์ ์–ด๋„ ์ผ์ฃผ์ผ์€ ์ถฉ๋ถ„ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ดํ‹€์ด ์ง€๋‚ฌ๋‹ค..

์ด์ œ Hazelcast์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์— ๋”ฐ๋ฅด๋ฉด ๋ฉฐ์น  ๊ฐ„์˜ ํ…Œ์ŠคํŠธ ํ›„ Hazelcast๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์–ผ๋งˆ ํ›„ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋ฌด๋„ˆ์ง€๊ณ  ๋…ธ๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ํ•˜๋‚˜์”ฉ ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค. JVisualVM์„ hazelcast์— ์—ฐ๊ฒฐํ•˜๊ณ  "rising saw"๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •๊ธฐ์ ์œผ๋กœ GC๋ฅผ ํ˜ธ์ถœํ–ˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์šธ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

1C: Enterprise: Java, PostgreSQL, Hazelcast๋ฅผ ์œ„ํ•œ ๊ณ ๋ถ€ํ•˜ ํ™•์žฅ ๊ฐ€๋Šฅ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ 

Hazelcast 3.4์—์„œ๋Š” map/multiMap(map.destroy())์„ ์‚ญ์ œํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

github.com/hazelcast/hazelcast/issues/6317
github.com/hazelcast/hazelcast/issues/4888

ํ˜„์žฌ๋Š” 3.5์—์„œ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋์ง€๋งŒ ๋‹น์‹œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋๋‹ค. ์šฐ๋ฆฌ๋Š” ๋™์  ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด multiMap์„ ์ƒ์„ฑํ•˜๊ณ  ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public void join(Authentication auth, String sub) {
    MultiMap<UUID, Authentication> sessions = instance.getMultiMap(sub);
    sessions.put(auth.getUserId(), auth);
}

public void leave(Authentication auth, String sub) {
    MultiMap<UUID, Authentication> sessions = instance.getMultiMap(sub);
    sessions.remove(auth.getUserId(), auth);

    if (sessions.size() == 0) {
        sessions.destroy();
    }
}

๋ณด๊ธฐ:

service.join(auth1, "ะะžะ’ะซะ•_ะกะžะžะ‘ะฉะ•ะะ˜ะฏ_ะ’_ะžะ‘ะกะฃะ–ะ”ะ•ะะ˜ะ˜_UUID1");
service.join(auth2, "ะะžะ’ะซะ•_ะกะžะžะ‘ะฉะ•ะะ˜ะฏ_ะ’_ะžะ‘ะกะฃะ–ะ”ะ•ะะ˜ะ˜_UUID1");

multiMap์€ ๊ฐ ๊ตฌ๋…๋งˆ๋‹ค ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Map์„ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. , ํ‚ค๋Š” ๊ตฌ๋… ์ด๋ฆ„์ด ๋˜๊ณ  ๊ฐ’์€ ์„ธ์…˜ ์‹๋ณ„์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ).

public void join(Authentication auth, String sub) {
    addValueToMap(sub, auth.getSessionId());
}

public void leave(Authentication auth, String sub) { 
    removeValueFromMap(sub, auth.getSessionId());
}

์ฐจํŠธ๊ฐ€ ์ข‹์•„์กŒ์Šต๋‹ˆ๋‹ค.

1C: Enterprise: Java, PostgreSQL, Hazelcast๋ฅผ ์œ„ํ•œ ๊ณ ๋ถ€ํ•˜ ํ™•์žฅ ๊ฐ€๋Šฅ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ 

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋˜ ๋ฌด์—‡์„ ๋ฐฐ์› ์Šต๋‹ˆ๊นŒ?

  1. JSR223์€ Groovy๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ปดํŒŒ์ผ ์บ์‹œ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋งํฌ.
  2. Jmeter-Plugins ๊ทธ๋ž˜ํ”„๋Š” ํ‘œ์ค€ ๊ทธ๋ž˜ํ”„๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋งํฌ.

Hazelcast์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ๊ฒฝํ—˜์— ๋Œ€ํ•ด

Hazelcast๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ์ƒˆ๋กœ์šด ์ œํ’ˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฒ„์ „ 3.4.1๋ถ€ํ„ฐ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ํ˜„์žฌ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์—์„œ๋Š” ๋ฒ„์ „ 3.9.2๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ Hazelcast์˜ ์ตœ์‹  ๋ฒ„์ „์€ 3.10์ž…๋‹ˆ๋‹ค).

ID ์ƒ์„ฑ

์šฐ๋ฆฌ๋Š” ์ •์ˆ˜ ์‹๋ณ„์ž๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์—”ํ„ฐํ‹ฐ๋ฅผ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ Long์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ˆœ์„œ๊ฐ€ ์ ํ•ฉํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ด๋ธ”์ด ์ƒค๋”ฉ๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. DB1์— ๋ฉ”์‹œ์ง€ ID=1์ด ์žˆ๊ณ  DB1์— ๋ฉ”์‹œ์ง€ ID=2์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด ID๋ฅผ Elasticsearch๋‚˜ Hazelcast์— ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. , ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์•…์˜ ์ƒํ™ฉ์€ ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฌํ•œ ๊ตฌ๋…์ž์—๊ฒŒ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ). ์—ฌ๋Ÿฌ ๊ฐœ์˜ AtomicLong์„ Hazelcast์— ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ์นด์šดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ ID๋ฅผ ์–ป๋Š” ์„ฑ๋Šฅ์€ incrementAndGet์— Hazelcast์— ๋Œ€ํ•œ ์š”์ฒญ ์‹œ๊ฐ„์„ ๋”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Hazelcast์—๋Š” FlakeIdGenerator๋ผ๋Š” ๋” ์ตœ์ ์˜ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํด๋ผ์ด์–ธํŠธ์— ์ ‘์†ํ•  ๋•Œ ID ๋ฒ”์œ„๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค(์˜ˆ: ์ฒซ ๋ฒˆ์งธ๋Š” 1~10, ๋‘ ๋ฒˆ์งธ๋Š” 000~10 ๋“ฑ). ์ด์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐœ๊ธ‰๋œ ๋ฒ”์œ„๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ์ž์ฒด์ ์œผ๋กœ ์ƒˆ ์‹๋ณ„์ž๋ฅผ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋ฐ Hazelcast ํด๋ผ์ด์–ธํŠธ)์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ์ƒˆ๋กœ์šด ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฑด๋„ˆ๋›ฐ๋Š” ๋“ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐœ๋ฐœ์ž๋Š” ID๊ฐ€ ์ •์ˆ˜์ธ ์ด์œ ๋ฅผ ์‹ค์ œ๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ‰๊ฐ€ํ•˜๊ณ  UUID๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , Twitter์ฒ˜๋Ÿผ ๋˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด Snowcast ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Hazelcast ์œ„์— Snowflake๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

github.com/noctarius/snowcast
github.com/twitter/snowflake

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋” ์ด์ƒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

TransactionalMap.replace

๋˜ ๋‹ค๋ฅธ ๋†€๋ผ์›€: TransactionalMap.replace๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Test
public void replaceInMap_putsAndGetsInsideTransaction() {

    hazelcastInstance.executeTransaction(context -> {
        HazelcastTransactionContextHolder.setContext(context);
        try {
            context.getMap("map").put("key", "oldValue");
            context.getMap("map").replace("key", "oldValue", "newValue");
            
            String value = (String) context.getMap("map").get("key");
            assertEquals("newValue", value);

            return null;
        } finally {
            HazelcastTransactionContextHolder.clearContext();
        }        
    });
}

Expected : newValue
Actual : oldValue

getForUpdate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ๋Œ€์ฒด ํ•ญ๋ชฉ์„ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

protected <K,V> boolean replaceInMap(String mapName, K key, V oldValue, V newValue) {
    TransactionalTaskContext context = HazelcastTransactionContextHolder.getContext();
    if (context != null) {
        log.trace("[CACHE] Replacing value in a transactional map");
        TransactionalMap<K, V> map = context.getMap(mapName);
        V value = map.getForUpdate(key);
        if (oldValue.equals(value)) {
            map.put(key, newValue);
            return true;
        }

        return false;
    }
    log.trace("[CACHE] Replacing value in a not transactional map");
    IMap<K, V> map = hazelcastInstance.getMap(mapName);
    return map.replace(key, oldValue, newValue);
}

์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŠธ๋žœ์žญ์…˜ ๋ฒ„์ „๋„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. IMap์ด ์ž‘๋™ํ•˜์ง€๋งŒ TransactionalMap์ด ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„ ์—†์ด ์ƒˆ JAR ์‚ฝ์ž…

๋จผ์ € ์šฐ๋ฆฌ๋Š” ์ˆ˜์—…์˜ ๊ฐ์ฒด๋ฅผ Hazelcast์— ๊ธฐ๋กํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Application ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฝ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ•˜๋‹ค:

IMap<UUID, Application> map = hazelcastInstance.getMap("application");
map.set(id, application);

์ฝ๊ธฐ :

IMap<UUID, Application> map = hazelcastInstance.getMap("application");
return map.get(id);

๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Hazelcast์— ์ƒ‰์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋‹ค์Œ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

map.addIndex("subscriberId", false);

๊ทธ๋ฆฌ๊ณ  ์ƒˆ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ClassNotFoundException์„ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. Hazelcast๋Š” ์ƒ‰์ธ์— ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชฐ๋ž๊ณ  ์ด ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋œ JAR์ด ์ œ๊ณต๋˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์ง€๋งŒ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์™„์ „ํžˆ ์ค‘์ง€ํ•˜์ง€ ์•Š๊ณ  JAR์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Hazelcast๋Š” ๋…ธ๋“œ๋ณ„ ์—…๋ฐ์ดํŠธ ์ค‘์— ์ƒˆ JAR์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ์ƒ‰์ธ ๊ฒ€์ƒ‰ ์—†์ด๋„ ์‚ด ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, Hazelcast๋ฅผ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ• ๊นŒ์š”? ์„ค๋งˆ. ์—ฌ๊ธฐ์„œ๋„ IMap๊ณผ TransactionalMap์˜ ๋™์ž‘์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. IMap์ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ TransactionalMap์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์•„์ด๋งต. ์šฐ๋ฆฌ๋Š” 5000๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์“ฐ๊ณ  ์ฝ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

@Test
void get5000() {
    IMap<UUID, Application> map = hazelcastInstance.getMap("application");
    UUID subscriberId = UUID.randomUUID();

    for (int i = 0; i < 5000; i++) {
        UUID id = UUID.randomUUID();
        String title = RandomStringUtils.random(5);
        Application application = new Application(id, title, subscriberId);
        
        map.set(id, application);
        Application retrieved = map.get(id);
        assertEquals(id, retrieved.getId());
    }
}

ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ClassNotFoundException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@Test
void get_transaction() {
    IMap<UUID, Application> map = hazelcastInstance.getMap("application_t");
    UUID subscriberId = UUID.randomUUID();
    UUID id = UUID.randomUUID();

    Application application = new Application(id, "qwer", subscriberId);
    map.set(id, application);
    
    Application retrievedOutside = map.get(id);
    assertEquals(id, retrievedOutside.getId());

    hazelcastInstance.executeTransaction(context -> {
        HazelcastTransactionContextHolder.setContext(context);
        try {
            TransactionalMap<UUID, Application> transactionalMap = context.getMap("application_t");
            Application retrievedInside = transactionalMap.get(id);

            assertEquals(id, retrievedInside.getId());
            return null;
        } finally {
            HazelcastTransactionContextHolder.clearContext();
        }
    });
}

3.8์—์„œ๋Š” ์‚ฌ์šฉ์ž ํด๋ž˜์Šค ๋ฐฐํฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์˜ JAR ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์™„์ „ํžˆ ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  Hazelcast์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Hazelcast๋Š” ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋‹ค์šดํƒ€์ž„ ์—†์ด ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด ์ œ์–ด๋ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒˆ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ๊ฐœ์ฒด๋ฅผ ์ž‘์„ฑํ•˜์ง€๋งŒ ์ด์ „ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„์ง ์ด๋Ÿฌํ•œ ํ•„๋“œ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ์ƒˆ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ƒˆ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์ด์ „ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘์„ฑํ•œ ๊ฐœ์ฒด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ๋‹จ์ˆœ์„ฑ์„ ์œ„ํ•ด ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

Hazelcast๋กœ XNUMX๋ฒˆ์˜ ์—ฌํ–‰ - ์ข‹์Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ XNUMX๋ฒˆ - ๋‚˜์จ

๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ•ญ์ƒ ๋‚ซ์ง€๋งŒ, ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ ˆ์ฝ”๋“œ๋„ ์ €์žฅํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ์บ์‹œํ• ์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๊ฐœ๋ฐœ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๊นŒ์ง€ ๋งก๊น๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ฝ”๋”ฉ๋˜๋ฉด PostgreSQL์˜ ๋ชจ๋“  ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋กœ๊น…์„ ํ™œ์„ฑํ™”ํ•˜๊ณ (log_min_duration_statement๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  20๋ถ„ ๋™์•ˆ ๋กœ๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ง‘๋œ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ pgFouine ๋ฐ pgBadger์™€ ๊ฐ™์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๋ถ„์„ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ์—์„œ๋Š” ์ฃผ๋กœ ๋Š๋ฆฌ๊ณ  ๋นˆ๋ฒˆํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋Š๋ฆฐ ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ์‹คํ–‰ ๊ณ„ํš(EXPLAIN)์„ ์ž‘์„ฑํ•˜๊ณ  ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์†ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋นˆ๋ฒˆํ•œ ์š”์ฒญ์€ ์บ์‹œ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฟผ๋ฆฌ๋‹น ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ "ํ”Œ๋žซ"์œผ๋กœ ์œ ์ง€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ฐฉ์ทจ

SV๋Š” ์˜จ๋ผ์ธ ์„œ๋น„์Šค๋กœ 2017๋…„ ๋ด„๋ถ€ํ„ฐ ์šด์˜์— ๋“ค์–ด๊ฐ”๊ณ , ๋ณ„๋„์˜ ์ƒํ’ˆ์œผ๋กœ SV๋Š” 2017๋…„ XNUMX์›”(๋‹น์‹œ ๋ฒ ํƒ€ ๋ฒ„์ „ ์ƒํƒœ) ์ถœ์‹œ๋๋‹ค.

XNUMX๋…„์ด ๋„˜๋Š” ์šด์˜ ๊ธฐ๊ฐ„ ๋™์•ˆ CB ์˜จ๋ผ์ธ ์„œ๋น„์Šค ์šด์˜์— ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ์˜จ๋ผ์ธ ์„œ๋น„์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์ž ๋น„์ธ , ๋‹ค์Œ์—์„œ ์ˆ˜์ง‘ ๋ฐ ๋ฐฐํฌ ๋Œ€๋‚˜๋ฌด.

SV ์„œ๋ฒ„ ๋ฐฐํฌํŒ์€ RPM, DEB, MSI์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Windows์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„, Hazelcast ๋ฐ Elasticsearch๋ฅผ ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ์— ์„ค์น˜ํ•˜๋Š” ๋‹จ์ผ EXE ํ˜•ํƒœ์˜ ๋‹จ์ผ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ด ์„ค์น˜ ๋ฒ„์ „์„ "๋ฐ๋ชจ" ๋ฒ„์ „์ด๋ผ๊ณ  ๋ถˆ๋ €์ง€๋งŒ ์ด์ œ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฐํฌ ์˜ต์…˜์ด๋ผ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€