์ด ๊ธ์์๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐํ ๋ฐฉ๋ฒ๊ณผ ์ด์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
์ํธ ์์ฉ ์์คํ (์ดํ SV)์ ์ ๋ฌ์ด ๋ณด์ฅ๋๋ ๋ถ์ฐ๋ ๋ด๊ฒฐํจ์ฑ ๋ฉ์์ง ์์คํ ์ ๋๋ค. SV๋ ์จ๋ผ์ธ ์๋น์ค(1C์์ ์ ๊ณต)์ ์์ฒด ์๋ฒ ์์ค์ ๋ฐฐํฌํ ์ ์๋ ๋๋ ์์ฐ ์ ํ์ผ๋ก ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ ๋์ ํ์ฅ์ฑ์ ๊ฐ์ถ ๊ณ ๋ถํ ์๋น์ค๋ก ์ค๊ณ๋์์ต๋๋ค.
SV๋ ๋ถ์ฐ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ฌธ์ ์ฑ๋ช
์ํธ ์์ฉ ์์คํ ์ ๋ง๋ ์ด์ ๋ฅผ ๋ช ํํํ๊ธฐ ์ํด 1C์์ ๋น์ฆ๋์ค ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์กฐ๊ธ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ฐ์ , ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ ์์ง ๋ชจ๋ฅด๋ ๋ถ๋ค์ ์ํด ์ฐ๋ฆฌ์ ๋ํด ์กฐ๊ธ ์๊ฐํ๊ฒ ์ต๋๋ค. :) ์ฐ๋ฆฌ๋ 1C:Enterprise ๊ธฐ์ ํ๋ซํผ์ ๋ง๋ค๊ณ ์์ต๋๋ค. ํ๋ซํผ์๋ ๋น์ฆ๋์ค ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๋๊ตฌ๋ ๋ฌผ๋ก ๋น์ฆ๋์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๋ก์ค ํ๋ซํผ ํ๊ฒฝ์์ ์คํํ ์ ์๋ ๋ฐํ์๋ ํฌํจ๋์ด ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ๋ฐ ํจ๋ฌ๋ค์
1C:Enterprise์์ ์์ฑ๋ ๋น์ฆ๋์ค ์ ํ๋ฆฌ์ผ์ด์
์ XNUMX๋จ๊ณ๋ก ์๋ํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์์ ํ๋ก์์ ์ ํจ์์ ํค๋๋ &AtClient / &AtServer ์ง์๋ฌธ(์์ด ๋ฒ์ ์ ์ธ์ด์์๋ &AtClient / &AtServer)์ ์ฌ์ฉํ์ฌ ์ฝ๋๊ฐ ์คํ๋ ์์น๋ฅผ ๋ช
์์ ์ผ๋ก ๋ํ๋ด์ผ ํฉ๋๋ค. 1C ๊ฐ๋ฐ์๋ ์ด์ ์ง์๋ฌธ์ด ์ค์ ๋ก
ํด๋ผ์ด์ธํธ ์ฝ๋์์ ์๋ฒ ์ฝ๋๋ฅผ ํธ์ถํ ์ ์์ง๋ง ์๋ฒ ์ฝ๋์์ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ํธ์ถํ ์๋ ์์ต๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์ธํด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๊ทผ๋ณธ์ ์ธ ์ ํ ์ฌํญ์ ๋๋ค. ํนํ, ์๋ฒ ์ฝ๋๋ ํด๋ผ์ด์ธํธ์์๋ ์๋ฒ์์๋ ํธ์ถ๋๋ ์์น์ ๊ด๊ณ์์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ์คํ๋๋๋ก ์์ฑ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์๋ฒ ์ฝ๋์์ ์๋ฒ ์ฝ๋๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฌํ ํด๋ผ์ด์ธํธ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฒ ์ฝ๋๋ฅผ ์คํํ๋ ๋์ ์ด๋ฅผ ํธ์ถํ ํด๋ผ์ด์ธํธ๊ฐ ๋ซํ๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ์ ์์ผ๋ฉฐ ์๋ฒ๋ ๋ ์ด์ ํธ์ถํ ์ฌ๋์ด ์๊ฒ ๋ฉ๋๋ค.
๋ฒํผ ํด๋ฆญ์ ์ฒ๋ฆฌํ๋ ์ฝ๋: ํด๋ผ์ด์ธํธ์์ ์๋ฒ ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ฉด ์๋ํ์ง๋ง ์๋ฒ์์ ํด๋ผ์ด์ธํธ ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
์ด๋ ์๋ฅผ ๋ค์ด "์ฅ๊ธฐ ์คํ" ๋ณด๊ณ ์ ์์ฑ์ด ์๋ฃ๋์ด ๋ณด๊ณ ์๋ฅผ ๋ณผ ์ ์๋ค๋ ๋ฉ์์ง๋ฅผ ์๋ฒ์์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ณด๋ด๋ ค๋ ๊ฒฝ์ฐ ๊ทธ๋ฌํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํด๋ผ์ด์ธํธ ์ฝ๋์์ ์๋ฒ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํด๋งํ๋ ๋ฑ์ ํธ๋ฆญ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ถํ์ํ ํธ์ถ๋ก ์์คํ ์ ๋ก๋ํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ค์ง ์ฐ์ํด ๋ณด์ด์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฅผ ๋ค์ด ์ ํ๊ฐ ์์ ๋์๋ ํ์ํฉ๋๋ค.
์์ฐ ๊ทธ ์์ฒด
๋ฉ์์ง ๋ฉ์ปค๋์ฆ์ ๋ง๋ญ๋๋ค. ๋น ๋ฅด๊ณ ์์ ์ ์ด๋ฉฐ ์ ๋ฌ์ด ๋ณด์ฅ๋๊ณ ๋ฉ์์ง๋ฅผ ์ ์ฐํ๊ฒ ๊ฒ์ํ ์ ์์ต๋๋ค. ๋ฉ์ปค๋์ฆ์ ๊ธฐ๋ฐ์ผ๋ก 1C ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์คํ๋๋ ๋ฉ์ ์ (๋ฉ์์ง, ํ์ ํตํ)๋ฅผ ๊ตฌํํฉ๋๋ค.
์ํ ํ์ฅ์ด ๊ฐ๋ฅํ๋๋ก ์์คํ ์ ์ค๊ณํฉ๋๋ค. ์ฆ๊ฐํ๋ ๋ถํ๋ ๋ ธ๋ ์๋ฅผ ๋๋ ค์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
ะ ะตะฐะปะธะทะฐัะธั
์ฐ๋ฆฌ๋ SV์ ์๋ฒ ๋ถ๋ถ์ 1C:Enterprise ํ๋ซํผ์ ์ง์ ํตํฉํ์ง ์๊ณ 1C ์ ํ๋ฆฌ์ผ์ด์ ์๋ฃจ์ ์ ์ฝ๋์์ API๋ฅผ ํธ์ถํ ์ ์๋ ๋ณ๋์ ์ ํ์ผ๋ก ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์ํ๋์์ผ๋ฉฐ, ๊ทธ ์ค ๊ฐ์ฅ ํฐ ์ด์ ๋ ์๋ก ๋ค๋ฅธ 1C ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ์(์: ๋ฌด์ญ ๊ด๋ฆฌ์ ํ๊ณ ๊ฐ) ๋ฉ์์ง๋ฅผ ๊ตํํ ์ ์๋๋ก ํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค์ํ 1C ์์ฉ ํ๋ก๊ทธ๋จ์ 1C:Enterprise ํ๋ซํผ์ ๋ค์ํ ๋ฒ์ ์์ ์คํ๋ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ์๋ฒ ๋ฑ์ ์์นํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์กฐ๊ฑด์์๋ 1C ์ค์น์ "์ธก๋ฉด"์ ์์นํ ๋ณ๋์ ์ ํ์ผ๋ก SV๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ต์ ์ ์๋ฃจ์ ์ ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ SV๋ฅผ ๋ณ๋์ ์ ํ์ผ๋ก ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์๊ท๋ชจ ๊ธฐ์
์์๋ ์๋ฒ ๋ก์ปฌ ์ค์น ๋ฐ ๊ตฌ์ฑ๊ณผ ๊ด๋ จ๋ ์ค๋ฒํค๋ ๋น์ฉ์ ํผํ๊ธฐ ์ํด ๋น์ฌ ํด๋ผ์ฐ๋(wss://1cdialog.com)์ ์ค์นํ CB ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๊ท๋ชจ ๊ณ ๊ฐ์ ์์ค์ ์์ฒด CB ์๋ฒ๋ฅผ ์ค์นํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฐ๋ฆฌ๋ ํด๋ผ์ฐ๋ SaaS ์ ํ์์๋ ์ ์ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค.
์ ์ฒญ
๋ก๋ ๋ฐ ๋ด๊ฒฐํจ์ฑ์ ๋ถ์ฐํ๊ธฐ ์ํด ํ๋์ 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 ํด๋ฌ์คํฐ๋ก๋ ์ฝ์ง ์์ต๋๋ค.
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฅํด์ผ ํ๋ค๋ฉด ์ด๋
์ค๋ฉ์ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ ํ ์ด๋ธ์ ๋ค์ํ ๋น์จ๋ก ์ฌ๋ฌ ์๋ฒ์ ๋ฐฐํฌํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ ํ์ต๋๋ค. ์๋ฒ A์ ๋ง์ ๋ฉ์์ง๊ฐ ์์ต๋๋ค. ์ด ํ ์ด๋ธ์ ์ผ๋ถ๋ฅผ ์๋ฒ B๋ก ์ด๋ํ๊ฒ ์ต๋๋ค. ์ด ๊ฒฐ์ ์ ๋จ์ํ ์กฐ๊ธฐ ์ต์ ํ์ ๋ํ ๋น๋ช ์ ์ง๋ฅด๋ ๊ฒ์ด๋ฏ๋ก ์ฐ๋ฆฌ๋ ๋ค์ค ํ ๋ํธ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์๋ฅผ ๋ค์ด ์น์ฌ์ดํธ์์ ๋ค์ค ํ
๋ํธ์ ๋ํด ์ฝ์ ์ ์์ต๋๋ค.
SV๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ตฌ๋ ์์ ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ๋ฐ ๋น์ฆ๋์ค ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ERP ๋๋ ํ๊ณ์ ๊ฐ์ ๋น์ฆ๋์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์ค์น์ ๋๋ค. ๊ฐ์ ์๋ ์์ ์ ๋์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด SV ์๋ฒ์ ๋ฑ๋ก๋ ์กฐ์ง ๋๋ ๊ฐ์ธ์ ๋๋ค. ๊ตฌ๋ ์๋ ์ฌ๋ฌ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ ์ ์์ผ๋ฉฐ ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก ๋ฉ์์ง๋ฅผ ๊ตํํ ์ ์์ต๋๋ค. ๊ตฌ๋ ์๋ ์ฐ๋ฆฌ ์์คํ ์ ํ ๋ํธ๊ฐ ๋์์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ ์์ ๋ฉ์์ง๋ ํ๋์ ๋ฌผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์นํ ์ ์์ต๋๋ค. ๊ฐ์ ์๊ฐ ๋ง์ ํธ๋ํฝ์ ์์ฑํ๊ธฐ ์์ํ ๊ฒ์ ํ์ธํ๋ฉด ์ด๋ฅผ ๋ณ๋์ ๋ฌผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(๋๋ ๋ณ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ)๋ก ์ด๋ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฐ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์น์ ๋ํ ์ ๋ณด์ ํจ๊ป ๋ผ์ฐํ ํ ์ด๋ธ์ด ์ ์ฅ๋๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๋ชฉ ํ์์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ผ์ฐํ
ํ
์ด๋ธ(๋ฐ ๊ธฐํ ์์ฃผ ํ์ํ ๋ฐ์ดํฐ)์ ์บ์์ ๋ณด๊ดํฉ๋๋ค.
๊ตฌ๋
์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋๊ฐ ๋๋ ค์ง๊ธฐ ์์ํ๋ฉด ์ด๋ฅผ ๋ด๋ถ ํํฐ์
์ผ๋ก ์๋ผ๋
๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์๋
์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ์๋ ๊ฒ์ ์ข์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๋ณต์ ๋ณธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค. ๋๊ธฐ์ ๋ฐ ๋น๋๊ธฐ์ ๋ณต์ ๋ณธ์ ๊ฒฐํฉํ๋ฉด ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ค๋ ๊ฒฝ์ฐ์๋ ์์ ์ ํ๋ณดํ ์ ์์ต๋๋ค. ๋ฉ์์ง ์์ค์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํด๋น ๋๊ธฐ ๋ณต์ ๋ณธ์ด ๋์์ ์คํจํ๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค.
๋๊ธฐ ๋ณต์ ๋ณธ์ด ์์ค๋๋ฉด ๋น๋๊ธฐ ๋ณต์ ๋ณธ์ ๋๊ธฐ ๋ณต์ ๋ณธ์ด ๋ฉ๋๋ค.
์ฃผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ค๋๋ฉด ๋๊ธฐ ๋ณต์ ๋ณธ์ ์ฃผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋๊ณ , ๋น๋๊ธฐ ๋ณต์ ๋ณธ์ ๋๊ธฐ ๋ณต์ ๋ณธ์ด ๋ฉ๋๋ค.
๊ฒ์์ ์ํ Elasticsearch
๋ฌด์๋ณด๋ค๋ SV๋ ๋ฉ์ ์ ์ด๊ธฐ๋ ํ๋ฏ๋ก ๋ถ์ ํํ ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ ํํ๋ฅผ ๊ณ ๋ คํ ๋น ๋ฅด๊ณ ํธ๋ฆฌํ๋ฉฐ ์ ์ฐํ ๊ฒ์์ด ํ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช
ํ์ง ์๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๋ฌด๋ฃ ๊ฒ์ ์์ง Elasticsearch๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
github์์ ์ฐ๋ฆฌ๋ ์ฐพ์์ต๋๋ค
๊ทธ๋ฆฌ๊ณ "text"๋ผ๋ ๋จ์ด์ ์ด๊ทผ๋ ๋ณด์กด๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋จ์ด์ ์์, ์ค๊ฐ, ๋์์ ๊ฒ์ํ ์ ์์ต๋๋ค.
ํฐ ๊ทธ๋ฆผ
๊ธฐ์ฌ ์์ ๋ถ๋ถ๋ถํฐ ๊ทธ๋ฆผ์ ๋ฐ๋ณตํ๋ ์ค๋ช
์ ์ถ๊ฐํฉ๋๋ค.
- ์ธํฐ๋ท์ ๋ ธ์ถ๋ ๋ฐธ๋ฐ์; ์ฐ๋ฆฌ๋ nginx๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ฌด์์ด๋ ๋ ์ ์์ต๋๋ค.
- Java ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค๋ Hazelcast๋ฅผ ํตํด ์๋ก ํต์ ํฉ๋๋ค.
- ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์น ์์ผ์ผ๋ก ์์
ํ๋ ค๋ฉด
๊ทธ๋ฌผ์ฝ . - Java ์ ํ๋ฆฌ์ผ์ด์
์ Java 8๋ก ์์ฑ๋์์ผ๋ฉฐ ๋ฒ๋ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
OSGi . ๊ณํ์๋ Java 10์ผ๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ ๋ชจ๋๋ก์ ์ ํ์ด ํฌํจ๋ฉ๋๋ค.
๊ฐ๋ฐ ๋ฐ ํ ์คํธ
SV๋ฅผ ๊ฐ๋ฐํ๊ณ ํ ์คํธํ๋ ๊ณผ์ ์์ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ ํ์ ์ฌ๋ฌ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ก๋ ํ ์คํธ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋์
๊ฐ SV ๋ฆด๋ฆฌ์ค์๋ ๋ก๋ ํ ์คํธ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฑ๊ณตํฉ๋๋ค.
- ํ ์คํธ๋ ๋ฉฐ์น ๋์ ์งํ๋์์ผ๋ฉฐ ์๋น์ค ์ฅ์ ๋ ์์์ต๋๋ค.
- ์ฃผ์ ์์ ์ ๋ํ ์๋ต ์๊ฐ์ด ํธ์ํ ์๊ณ๊ฐ์ ์ด๊ณผํ์ง ์์์ต๋๋ค.
- ์ด์ ๋ฒ์ ๋๋น ์ฑ๋ฅ ์ ํ๊ฐ 10%๋ฅผ ๋์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ์ดํฐ๋ก ์ฑ์๋๋ค. ์ด๋ฅผ ์ํด ํ๋ก๋์ ์๋ฒ์์ ๊ฐ์ฅ ํ๋์ ์ธ ๊ตฌ๋ ์์ ๋ํ ์ ๋ณด๋ฅผ ์์ ํ๊ณ ๊ทธ ์ซ์์ 5(๋ฉ์์ง ์, ํ ๋ก ์, ์ฌ์ฉ์ ์)๋ฅผ ๊ณฑํ๊ณ ๊ทธ๋ฐ ์์ผ๋ก ํ ์คํธํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ธ ๊ฐ์ง ๊ตฌ์ฑ์ผ๋ก ์ํธ ์์ฉ ์์คํ ์ ๋ก๋ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
- ์คํธ๋ ์ค ํ ์คํธ
- ์ฐ๊ฒฐ๋ง
- ๊ฐ์ ์ ๋ฑ๋ก
์คํธ๋ ์ค ํ ์คํธ ์ค์ ์ฐ๋ฆฌ๋ ์๋ฐฑ ๊ฐ์ ์ค๋ ๋๋ฅผ ์์ํ๊ณ ๋ฉ์์ง ์์ฑ, ํ ๋ก ์์ฑ, ๋ฉ์์ง ๋ชฉ๋ก ์์ ๋ฑ์ ๋ฉ์ถ์ง ์๊ณ ์์คํ ์ ๋ก๋ํฉ๋๋ค. ์ผ๋ฐ ์ฌ์ฉ์์ ์์ (์ฝ์ง ์์ ๋ฉ์์ง ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ, ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ฐ๊ธฐ) ๋ฐ ์ํํธ์จ์ด ์๋ฃจ์ (๋ค๋ฅธ ๊ตฌ์ฑ์ ํจํค์ง ์ ์ก, ๊ฒฝ๊ณ ์ฒ๋ฆฌ)์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์คํธ๋ ์ค ํ ์คํธ์ ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ์ฉ์ ๋ก๊ทธ์ธ
- ์ฝ์ง ์์ ํ ๋ก ์ ์์ฒญํฉ๋๋ค
- ๋ฉ์์ง๋ฅผ ์ฝ์ ๊ฐ๋ฅ์ฑ์ด 50%
- ๋ฌธ์๋ฅผ ๋ณด๋ผ ๊ฐ๋ฅ์ฑ์ด 50%
- ๋ค์ ์ฌ์ฉ์:
- ์๋ก์ด ํ ๋ก ์ ๋ง๋ค ํ๋ฅ ์ 20%์ ๋๋ค.
- ์์์ ํ ๋ก ์ ๋ฌด์์๋ก ์ ํํฉ๋๋ค.
- ์์ผ๋ก ๋ค์ด๊ฐ๋ค
- ๋ฉ์์ง, ์ฌ์ฉ์ ํ๋กํ ์์ฒญ
- ์ด ํ ๋ก ์์ ๋ฌด์์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋๋ XNUMX๊ฐ์ ๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค.
- ํ ๋ก ์ ๋ ๋๋ค
- 20ํ ๋ฐ๋ณต
- ๋ก๊ทธ์์ํ๊ณ ์คํฌ๋ฆฝํธ ์ฒ์์ผ๋ก ๋์๊ฐ๋๋ค.
- ์ฑ๋ด์ด ์์คํ
์ ์ง์
ํฉ๋๋ค(์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์ ๋ฉ์์ง์ ์๋ฎฌ๋ ์ด์
).
- ๋ฐ์ดํฐ ๊ตํ์ ์ํ ์๋ก์ด ์ฑ๋์ ๋ง๋ค ํ๋ฅ ์ด 50%์ ๋๋ค(ํน๋ณ ํ ๋ก ).
- 50%๋ ๊ธฐ์กด ์ฑ๋์ ๋ฉ์์ง๋ฅผ ์ธ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
"์ฐ๊ฒฐ ์ ์ฉ" ์๋๋ฆฌ์ค๊ฐ ๋ํ๋ ๋ฐ์๋ ์ด์ ๊ฐ ์์ต๋๋ค. ์ํฉ์ด ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์์คํ ์ ์ฐ๊ฒฐํ์ง๋ง ์์ง ์ฐธ์ฌํ์ง ์์์ต๋๋ค. ๊ฐ ์ฌ์ฉ์๋ ์์นจ 09์์ ์ปดํจํฐ๋ฅผ ์ผ๊ณ ์๋ฒ์ ์ฐ๊ฒฐํ ํ ์นจ๋ฌต์ ์ ์งํฉ๋๋ค. ์ด ์ฌ๋๋ค์ ์ํํฉ๋๋ค. ๊ทธ๋ค ์ค ๋ค์๊ฐ ์์ต๋๋ค. ๊ทธ๋ค์ด ๊ฐ์ง๊ณ ์๋ ์ ์ผํ ํจํค์ง๋ PING/PONG์ด์ง๋ง ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ์ ์ ์งํฉ๋๋ค(๊ทธ๋ค์ ์ฐ๊ฒฐ์ ์ ์งํ ์ ์์ต๋๋ค. ์ ๋ฉ์์ง๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?). ์ด ํ ์คํธ๋ 00๋ถ ๋ง์ ๋ค์์ ์ฌ์ฉ์๊ฐ ์์คํ ์ ๋ก๊ทธ์ธ์ ์๋ํ๋ ์ํฉ์ ์ฌํํฉ๋๋ค. ์คํธ๋ ์ค ํ ์คํธ์ ์ ์ฌํ์ง๋ง ์ด์ ์ ์ ํํ ์ด ์ฒซ ๋ฒ์งธ ์ ๋ ฅ์ ๋ง์ถฐ์ ธ ์์ผ๋ฏ๋ก ์คํจ๊ฐ ์์ต๋๋ค(์ฌ๋์ด ์์คํ ์ ์ฌ์ฉํ์ง ์๊ณ ์ด๋ฏธ ๋จ์ด์ก๊ธฐ ๋๋ฌธ์ ๋ ๋์ ๊ฒ์ ์๊ฐํ๊ธฐ ์ด๋ ต์ต๋๋ค).
๊ตฌ๋
์ ๋ฑ๋ก ์คํฌ๋ฆฝํธ๋ ์ฒซ ๋ฒ์งธ ์คํ๋ถํฐ ์์๋ฉ๋๋ค. ์คํธ๋ ์ค ํ
์คํธ๋ฅผ ์ค์ํ ๊ฒฐ๊ณผ ํต์ ์ค์ ์์คํ
์ด ๋๋ ค์ง์ง ์๋์ง ํ์ธํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ฉ์๋ค์ด ์๊ณ ์๊ฐ ์ด๊ณผ๋ก ์ธํด ๋ฑ๋ก์ด ์คํจํ๊ธฐ ์์ํ์ต๋๋ค. ๋ฑ๋กํ ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ
์ฐ๋ฆฌ๋ ๋ถํ ์์ฑ๊ธฐ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์์ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ณณ์ ๋๋ค.
์ง์งํ ํ ์คํธ๋ฅผ ์์ํ ์งํ์ ์ฐ๋ฆฌ๋ JMeter์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์๋๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
ํ๋ฌ๊ทธ์ธ์ ๋ณ๋์ ํฐ ์ด์ผ๊ธฐ๋ก, ๋ณ 176๊ฐ์ github์ 132๊ฐ์ ํฌํฌ๊ฐ ์์ต๋๋ค. ์ ์ ์์ ์ 2015๋
์ดํ๋ก ์ด๋ฅผ ์ฝ์ํ์ง ์์์ต๋๋ค(์ฐ๋ฆฌ๋ 2015๋
์ ์ด๋ฅผ ๋ฐ์๋ค์์ง๋ง ์์ฌ์ ์ผ์ผํค์ง ์์์ต๋๋ค), ๋ฉ๋ชจ๋ฆฌ ๋์์ ๊ด๋ จ๋ ์ฌ๋ฌ github ๋ฌธ์ , ๋ซํ์ง ์์ ๋์ด์ค๊ธฐ ์์ฒญ 7๊ฐ.
์ด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ๋ถํ ํ
์คํธ๋ฅผ ์ํํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ๋ค์ ํ ๋ก ์ ์ฃผ์ํ์ญ์์ค.
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ผ๋ฐ LinkedList๋ฅผ ์ฌ์ฉํ์๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
NPE ๋ฐํ์์. ์ด ๋ฌธ์ ๋ ConcurrentLinkedDeque๋ก ์ ํํ๊ฑฐ๋ ๋๊ธฐํ๋ ๋ธ๋ก์ ํตํด ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ค์ค๋ก ์ฒซ ๋ฒ์งธ ์ต์ ์ ์ ํํ์ต๋๋ค.https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43 ). - ๋ฉ๋ชจ๋ฆฌ ๋์, ์ฐ๊ฒฐ ํด์ ์ ์ฐ๊ฒฐ ์ ๋ณด๊ฐ ์ญ์ ๋์ง ์์(
https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44 ). - ์คํธ๋ฆฌ๋ฐ ๋ชจ๋(์ํ ์ข
๋ฃ ์ websocket์ด ๋ซํ์ง ์์์ง๋ง ๋์ค์ ๊ณํ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ)์์๋ ์๋ต ํจํด์ด ์๋ํ์ง ์์ต๋๋ค(
https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19 ).
์ด๊ฒ์ github์ ์๋ ๊ฒ ์ค ํ๋์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ์ผ:
- ๊ฐ์ ธ์ด
ํฌํฌ ์๋ฆฌ๋ ์ฝ๊ฐ (@elyrank) โ ๋ฌธ์ 1๊ณผ 3์ ์์ ํฉ๋๋ค. - ํด๊ฒฐ๋ ๋ฌธ์ 2
- ๋ถ๋๋ฅผ 9.2.14์์ 9.3.12๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค.
- ThreadLocal์์ SimpleDateFormat์ ๋ํํ์ต๋๋ค. SimpleDateFormat์ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ์ง ์์ ๋ฐํ์ ์ NPE๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๋ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ (์ฐ๊ฒฐ์ด ๋์ด์ก์ ๋ ์ฐ๊ฒฐ์ด ์๋ชป ๋ซํ์)
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ทธ๊ฒ์ ํ๋ฅธ๋ค!
ํ๋ฃจ๊ฐ ์๋๋ผ ์ดํ ๋ง์ ๊ธฐ์ต๋ ฅ์ด ๋จ์ด์ง๊ธฐ ์์ํ์ต๋๋ค. ๋จ์ ์๊ฐ์ด ์ ํ ์์๊ธฐ ๋๋ฌธ์ ๋ ์ ์ ์์ ์ค๋ ๋๋ฅผ ์คํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ง๋ง ์์ด์ ํธ๋ XNUMX๊ฐ์์ต๋๋ค. ์ด ์ ๋๋ฉด ์ ์ด๋ ์ผ์ฃผ์ผ์ ์ถฉ๋ถํ์ ๊ฒ์ ๋๋ค.
์ดํ์ด ์ง๋ฌ๋ค..
์ด์ Hazelcast์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ก์ต๋๋ค. ๋ก๊ทธ์ ๋ฐ๋ฅด๋ฉด ๋ฉฐ์น ๊ฐ์ ํ ์คํธ ํ Hazelcast๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ๋ํด ๋ถํํ๊ธฐ ์์ํ๊ณ ์ผ๋ง ํ ํด๋ฌ์คํฐ๊ฐ ๋ฌด๋์ง๊ณ ๋ ธ๋๊ฐ ๊ณ์ํด์ ํ๋์ฉ ์ฃฝ์์ต๋๋ค. JVisualVM์ hazelcast์ ์ฐ๊ฒฐํ๊ณ "rising saw"๋ฅผ ๋ณด์์ต๋๋ค. ์ด๋ ์ ๊ธฐ์ ์ผ๋ก GC๋ฅผ ํธ์ถํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ธ ์ ์์์ต๋๋ค.
Hazelcast 3.4์์๋ map/multiMap(map.destroy())์ ์ญ์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ํ ํด์ ๋์ง ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
ํ์ฌ๋ 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());
}
์ฐจํธ๊ฐ ์ข์์ก์ต๋๋ค.
๋ถํ ํ ์คํธ์ ๋ํด ๋ ๋ฌด์์ ๋ฐฐ์ ์ต๋๊น?
- JSR223์ Groovy๋ก ์์ฑ๋์ด์ผ ํ๋ฉฐ ์ปดํ์ผ ์บ์๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. ํจ์ฌ ๋น ๋ฆ
๋๋ค.
๋งํฌ . - 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๋ฅผ ๊ตฌํํ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ๋ณผ ์ ์์ต๋๋ค:
ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ ์ด์ ๊ทธ๊ฒ์ ๋ํด ๋ค๋ฃจ์ง ์์์ต๋๋ค.
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