์ฐ๋ฆฌ๋ ์๋งค ๋คํธ์ํฌ์ ๊ธฐ์ ๊ฐ๋ฐ ๋ถ์์
๋๋ค. ์ด๋ ๋ ๊ฒฝ์์ง์ MSSQL๊ณผ ํจ๊ป Apache Ignite๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ท๋ชจ ๊ณ์ฐ ์๋๋ฅผ ๋์ด๋ ์์
์ ์ค์ ํ๊ณ ์๋ฆ๋ค์ด ๊ทธ๋ฆผ๊ณผ Java ์ฝ๋ ์์ ๊ฐ ํฌํจ๋ ์น ์ฌ์ดํธ๋ฅผ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๋๋ ์ฆ์ ์ฌ์ดํธ๋ฅผ ์ข์ํ์ต๋๋ค.
1. ๋ฌธ์ ์ง์
๋ฌธ์ ์ ๋ณธ์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. SalesPoint ํ๋งค ์ง์ ๋๋ ํ ๋ฆฌ์ Sku(์ฌ๊ณ ์ ์ง ๋จ์) ์ ํ ๋๋ ํ ๋ฆฌ๊ฐ ์์ต๋๋ค. POS(Point of Sale)์๋ '์ํ' ๋ฐ '๋ํ' ๊ฐ์ ๊ฐ๋ '๋งค์ฅ ์ ํ' ์์ฑ์ด ์์ต๋๋ค. ๊ฐ ํ๋งค์ ์ ์ด์ํธ๋จผํธ(ํ๋งค์์ ์ ์ํ๋ชฉ๋ก)๊ฐ ์ฐ๊ฒฐ๋์ด(DBMS์์ ๋ก๋ฉ), ์ง์ ์ผ๋ก๋ถํฐ ์ง์ ์ํ์ด
๊ตฌ์์์ ์ ์ธ๋๊ฑฐ๋ ๊ตฌ์์ ์ถ๊ฐ๋์์ต๋๋ค.
๋ถํ ๋ POS ์บ์๋ฅผ ๊ตฌ์ฑํ๊ณ ํ ๋ฌ ์ ์ ์ฐ๊ฒฐ๋ ์ ํ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ ํฌ ์์คํ ๊ณผ์ ํธํ์ฑ์ ์ํด์๋ Ignite ํด๋ผ์ด์ธํธ ๋ ธ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ์์์ ์ง๊ณ(์์ ์ ํ, ์ ํ ์ฝ๋, ๋ ์ง, ํ๋งค_ํฌ์ธํธ_์)๋ฅผ ๊ณ์ฐํ๊ณ ์ด๋ฅผ ๋ค์ DBMS์ ์ ๋ก๋ํด์ผ ํฉ๋๋ค.
2. ๋ฌธํ ์ฐ๊ตฌ
์์ง ๊ฒฝํ์ด ์์ด์ ๋๋ก ์์์ ์ถค์ ์ถ๊ธฐ ์์ํ์ด์. ์ฆ, ์ถํ๋ฌผ ๊ฒํ ์์ ๋์จ ๊ฒ์ ๋๋ค.
๊ธฐ์ฌ 2016
๋๊ด์ ์ผ๋ก ์ฝ์ํฉ๋๋ค. โ๊ณง ๋ฐ๋ก ์คํ๋ ๊ฒ์
๋๋ค!โ ๋ ๊ฐ์ Apache Ignite Essentials ๋น๋์ค๋ฅผ ์์ฒญํ๋ฉด์ ํ๊ฒฝ ๋ณ์ ์ค์ ์ ํ์
ํ๊ณ ์์ง๋ง ํน์ ์์
์๋ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์์ต๋๋ค. ํ์ค ํ์ผ โexample-ignite.xmlโ์ ์ฌ์ฉํ์ฌ ๋ช
๋ น์ค์์ Ignite๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์คํํ์ฌ ์ฒซ ๋ฒ์งธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ์ต๋๋ค.
๋ ์์ธํ ์ฝ์ด๋ณด๋ ์์ ์์๋ ์ฆ์ AffinityKey(์ด์ ์ SQL ์ฟผ๋ฆฌ๋ฅผ ํตํด ์์ฑ๋จ)๋ฅผ ์ฌ์ฉํ๊ณ ์ ๋นํ BinaryObject๋ ์ฌ์ฉํฉ๋๋ค.
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary();
์ฝ๋ค
์ ๊ฒฝ์ฐ์ ๋ง๊ฒ Compute ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ๋ง๋ค๊ณ ์์ต๋๋ค. MSSQL์์ POS ๋๋ ํ ๋ฆฌ์ ๊ธฐ๋ณธ ํค๋ [id] [int] NOT NULL๋ก ์ ์๋ฉ๋๋ค. ๋น์ ๋ฅผ ํตํด ์บ์๋ฅผ ์์ฑํฉ๋๋ค.
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")
XML ๊ตฌ์ฑ์์ ์บ์๊ฐ ๋ถํ ๋์์์ ๋ํ๋ ๋๋ค.
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache"/>
<property name="cacheMode" value="PARTITIONED"/>
</bean>
ํ๋งค ์์ ๋ณ ๋ถํ ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ salesPointCache ๋ ์ฝ๋์ ๋ํด ๊ฐ ํด๋ฌ์คํฐ ๋ ธ๋์ ํ์ํ ์ง๊ณ๊ฐ ๊ตฌ์ถ๋ ํ ํด๋ผ์ด์ธํธ ๋ ธ๋๊ฐ ์ต์ข ํฉ๊ณ๋ฅผ ์ํํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
ํํ ๋ฆฌ์ผ์ ์ฝ๊ณ ์์ด์
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}
์ง๊ณ ๋ฐ ์ ๋ก๋ ๋ ผ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ์์ ์คํํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ๊ฐ๋ฐ ์๋ฒ์์ ๋ก์ปฌ๋ก ์๋ํฉ๋๋ค.
๋ ๊ฐ์ CentOs ํ ์คํธ ์๋ฒ๋ฅผ ์์ํ๊ณ default-config.xml์ IP ์ฃผ์๋ฅผ ์ง์ ํ๊ณ ๊ฐ๊ฐ์์ ์คํํฉ๋๋ค.
./bin/ignite.sh config/default-config.xml
๋ Ignite ๋ ธ๋๊ฐ ๋ชจ๋ ์คํ ์ค์ด๋ฉฐ ์๋ก๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ xml ๊ตฌ์ฑ์ ํ์ํ ์ฃผ์๋ฅผ ์ง์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๊ณ ์ธ ๋ฒ์งธ ๋ ธ๋๊ฐ ํ ํด๋ก์ง์ ์ถ๊ฐ๋๋ฉฐ ์ฆ์ ๋ ๊ฐ์ ๋ ธ๋๊ฐ ๋ค์ ์์ฑ๋ฉ๋๋ค. ๋ก๊ทธ์๋ "ClassNotFoundException: model.SalesPoint" ์ค์ด ํ์๋ฉ๋๋ค.
SalesPoint sp=salesPointCache.get(spId);
StackOverflow์ ๋ฐ๋ฅด๋ฉด ์ค๋ฅ์ ์์ธ์ CentOs ์๋ฒ์ ์ฌ์ฉ์ ์ ์ SalesPoint ํด๋์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋์ฐฉํ์ต๋๋ค. "๊ฐ ๋ ธ๋์ Java ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ฐฐํฌํ ํ์๊ฐ ์์ต๋๋ค" ๋ฑ์ ์ด๋ป์ต๋๊น? ์๋๋ฉด "๊ทํ์ Java ์ฝ๋"๊ฐ SalesPoint์ ๊ดํ ๊ฒ์ด ์๋๊ฐ์?
์๋ง๋ ๋ญ๊ฐ๋ฅผ ๋์ณค์ ๊ฒ์ ๋๋ค. ๋ค์ ๊ฒ์์ ์์ํ๊ณ , ์ฝ๊ณ , ๋ค์ ๊ฒ์ํฉ๋๋ค. ์ ์ ํ, ๋๋ ๊ทธ ์ฃผ์ ์ ๊ดํ ๋ชจ๋ ๊ฒ์ ์ฝ์๊ณ ๋ ์ด์ ์๋ก์ด ๊ฒ์ด ์๋ค๋ ๋๋์ ๋ฐ์์ต๋๋ค. ๊ฒ์์ ํ๋ ์ค ํฅ๋ฏธ๋ก์ด ๋๊ธ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.
๋ ๋ค๋ฅธ ๊ถ์ ์๋ ์๊ฒฌ:
ํ๋ธ๋ ์ ๊ดํ ๊ธฐ์ฌ
That's it. Start (..) node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.
์ค์ ๋ก ๊ทธ๊ฒ ๋ค์ ๋๋ค. ์ฌ๊ธฐ์ ์ ์ด ์ ๋นํ ๋ฐ์ด๋๋ฆฌ ํ์์ด ๋์ค๋์ง ๋ฐํ์ก์ต๋๋ค!
3.์ฑ๊ธ๋ณ
Denis๋ ๋ด ๊ฐ์ธ ํ๊ฐ์์ XNUMX์๋ฅผ ์ฐจ์งํ์ต๋๋ค. IMHO๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ํํ ๋ฆฌ์ผ ์ค ๊ฐ์ฅ ์ ์ฉํ ํํ ๋ฆฌ์ผ์
๋๋ค. ๊ทธ์
๋์ผํ ๋ฐฉ์์ผ๋ก ์ํํ์ฌ ๋ช ๋ น์ค ์ธ์์ ๋ฐ๋ผ "๋ฐ์ดํฐ ๋ ธ๋" ๋๋ "ํด๋ผ์ด์ธํธ ๋ ธ๋"๋ฅผ ์์ํ๋ ๋จ์ผ jar ํ์ผ์ ์ป์ต๋๋ค. ์ด์ ๋ธ๋ฆฌ๊ฐ ์์๋๊ณ ์๋ํฉ๋๋ค. ์ ๋ก ๋ฐฐํฌ๊ฐ ํจ๋ฐฐํ์ต๋๋ค.
๋ฉ๊ฐ๋ฐ์ดํธ์ ํ ์คํธ ๋ฐ์ดํฐ์์ ์์ญ ๊ธฐ๊ฐ๋ฐ์ดํธ์ ์ ํฌ ๋ฐ์ดํฐ๋ก์ ์ ํ์ ๋ฐ์ด๋๋ฆฌ ํ์์ด ์กด์ฌํ๋ ์ด์ ๊ฐ ์์์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๋ ธ๋์ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ์ต์ ํํ๋ ๊ฒ์ด ํ์ํ๊ณ , ์ฌ๊ธฐ์ BinaryObject๊ฐ ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค.
4. ๊ฒฐ๋ก
Apache Ignite ํ๋ก์ ํธ ๋ฌธ์์ ๋ชจํธํจ์ ๋ํ ์ฒซ ๋ฒ์งธ ๋น๋์ ๊ณต์ ํ ๊ฒ์ผ๋ก ํ๋ช ๋์์ผ๋ฉฐ 2016๋ ์ดํ ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค. ์ด๋ณด์๊ฐ ์น ์ฌ์ดํธ ๋ฐ/๋๋ ์ ์ฅ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ ํ๋กํ ํ์ ์ ์กฐ๋ฆฝํ๋ ๊ฒ์ ์ฝ์ง ์์ต๋๋ค.
์๋ฃ๋ ์์
๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด Zero ๋ฐฐํฌ๊ฐ ์๋ํ์ง๋ง ์์คํ
์์ค์์๋ง ์๋ํ๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ต๋๋ค. BinaryObject๋ ์๊ฒฉ ํด๋ฌ์คํฐ ๋
ธ๋๊ฐ ์ฌ์ฉ์ ์ ์ ํด๋์ค์ ์๋ํ๋๋ก ๊ฐ๋ฅด์น๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ ๋ก ๋ฐฐํฌ - ๋ด๋ถ ๋ฉ์ปค๋์ฆ
Apache Ignite๋ ์์ฒด์ ์ผ๋ก ํด๋ฌ์คํฐ ์ ์ฒด์ ์์คํ
๊ฐ์ฒด๋ฅผ ๋ฐฐํฌํฉ๋๋ค.
๋ด ๊ฒฝํ์ด ์๋ก์ด Apache Ignite ์ฌ์ฉ์์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ถ์ฒ : habr.com