ืืืืืจ ืื ื ืืืจ ืขื ืืื ืืืื ืืชืคืชืื ื
ืืขืจืืช ืืืื ืืจืืงืฆืื (ืืืื: SV) ืืื ืืขืจืืช ืืืืขืืช ืืืืืจืช, ืกืืืื ืืช ืืชืงืืืช ืขื ืืกืืจื ืืืืืืช. SV ืืชืืื ื ืืฉืืจืืช ืืขืืืก ืืืื ืขื ืืืจืืืืช ืืืืื, ืืืื ืื ืืฉืืจืืช ืืงืืื (ืืกืืคืง ืขื ืืื 1C) ืืื ืืืืฆืจ ืืืืฆืืจ ืืืื ื ืฉื ืืชื ืืคืจืืก ืืืชืงื ื ืืฉืจืช ืฉืืื.
SV ืืฉืชืืฉ ืืืืกืื ืืืืืจ
ืืฆืืจืช ืืืขืื
ืืื ืืืืืืจ ืืืืข ืืฆืจื ื ืืช ืืขืจืืช ืืืื ืืจืืงืฆืื, ืืกืคืจ ืืื ืืขื ืขื ืืื ืขืืื ืืคืืชืื ืฉื ืืคืืืงืฆืืืช ืขืกืงืืืช ื-1C.
ืืชืืจ ืืชืืื, ืงืฆืช ืขืืื ื ืืื ืฉืขืืืื ืื ืืืืข ืื ืื ืื ื ืขืืฉืื :) ืื ืื ื ืืืืฆืจืื ืืช ืืคืืืคืืจืื ืืืื ืืืืืืช 1C:Enterprise. ืืคืืืคืืจืื ืืืืืช ืืื ืืคืืชืื ืืคืืืงืฆืืืช ืขืกืงืืืช, ืืื ืืื ืจืืฆื ืืืืคืฉืจ ืืืคืืืงืฆืืืช ืขืกืงืืืช ืืคืขืื ืืกืืืื ืืืฆืช ืคืืืคืืจืืืช.
ืคืจืืืืืช ืคืืชืื ืฉืจืช-ืืงืื
ืืคืืืงืฆืืืช ืขืกืงืืืช ืฉื ืืฆืจื ื-1C:Enterprise ืคืืขืืืช ืืฉืืืฉ ืจืืืช
ืืงืื ืืคืืืงืฆืื, ืืืชืจืืช ืื ืืืื ืืืคืื ืงืฆืืืช ืืืืืืช ืืฆืืื ืืืคืืจืฉ ืืืื ืืงืื ืืืืฆืข - ืืืืฆืขืืช ืื ืืืืช &AtClient / &AtServer (&AtClient / &AtServer ืืืจืกื ืืื ืืืืช ืฉื ืืฉืคื). ืืคืชืื 1C ืืชืงื ื ืืืชื ืืขืช ืืืืืจื ืฉืืื ืืืืช ืื ืืืขืฉื
ืืชื ืืืื ืืงืจืื ืืงืื ืฉืจืช ืืงืื ืืงืื, ืืื ืืชื ืื ืืืื ืืงืจืื ืืงืื ืืงืื ืืงืื ืฉืจืช. ืืืื ืืืืื ืืกืืกืืช ืฉืขืฉืื ื ืืืกืคืจ ืกืืืืช. ืืคืจื, ืืืืืื ืฉืงืื ืืฉืจืช ืืืื ืืืืืชื ืืฆืืจื ืืื ืฉืืื ืืชืืฆืข ืืืืชื ืืืคื ืื ืืฉื ื ืืืื ืืื ื ืงืจื - ืืืืงืื ืื ืืืฉืจืช. ืืืืงืจื ืฉื ืงืจืืืช ืงืื ืฉืจืช ืืงืื ืฉืจืช ืืืจ, ืืื ืืงืื ืืืื. ืืืืืืื ืฉืืืืื ืืืฆืืข ืงืื ืืฉืจืช, ืืืงืื ืฉืืชืงืฉืจ ืืืื ืืืื ืืื ืืกืืืจ, ืืฆืืช ืืืืคืืืงืฆืื, ืืืฉืจืช ืืืจ ืื ืืืื ืืื ืืืชืงืฉืจ.
ืงืื ืฉืืืคื ืืืืืฆืช ืืคืชืืจ: ืงืจืืื ืืืืื ืฉืจืช ืืืืงืื ืืขืืื, ืงืจืืื ืืืืื ืืงืื ืืืฉืจืช ืื ืชืขืืื
ืื ืืืืจ ืฉืื ืื ืื ื ืจืืฆืื ืืฉืืื ืืืืขื ืืืฉืื ืืืฉืจืช ืืืคืืืงืฆืืืช ืืืงืื, ืืืฉื, ืฉืืคืงืช ืืื "ืืจืื" ืืกืชืืื ืื ืืชื ืืฆืคืืช ืืืื, ืืื ืื ื ืฉืืื ืืื. ืืชื ืฆืจืื ืืืฉืชืืฉ ืืืจืืงืื, ืืืฉื, ืืขืช ืืขืช ืกืงืจ ืืช ืืฉืจืช ืืงืื ืืืงืื. ืืื ืืืฉื ืื ืืขืืืกื ืืช ืืืขืจืืช ืืฉืืืืช ืืืืชืจืืช, ืืืืจื ืืื ืื ื ืจืืืช ืืืื ืืืช ืืืืืื.
ืืืฉ ืื ืฆืืจื, ืืืฉื, ืืฉืืืืขื ืฉืืืช ืืืคืื
ืืืคืงื ืขืฆืื
ืฆืืจ ืื ืื ืื ืืขืืจืช ืืืืขืืช. ืืืืจ, ืืืื, ืขื ืืฉืืื ืืืืื, ืขื ืืืืืช ืืืคืืฉ ืืืืฉ ืฉื ืืืืขืืช. ืืืชืืกืก ืขื ืืื ืื ืื, ืืืืืข ืืกื ื'ืจ (ืืืืขืืช, ืฉืืืืช ืืืืื) ืืคืืขื ืืชืื ืืืฉืืื 1C.
ืชืื ื ืืช ืืืขืจืืช ืื ืฉืชืืื ื ืืชื ืช ืืืจืืื ืืืคืงืืช. ืืฉ ืืืกืืช ืืช ืืขืืืก ืืืืืจ ืขื ืืื ืืืืืช ืืกืคืจ ืืฆืืชืื.
ะ ะตะฐะปะธะทะฐัะธั
ืืืืื ื ืื ืืฉืื ืืช ืืืง ืืฉืจืช ืฉื SV ืืฉืืจืืช ืืคืืืคืืจืืช 1C:Enterprise, ืืื ืืืืฉื ืืืชื ืืืืฆืจ ื ืคืจื, ืฉื ืืชื ืืงืจืื ื-API ืฉืื ืืืงืื ืฉื ืคืชืจืื ืืช ืืคืืืงืฆืืืช 1C. ืื ื ืขืฉื ืืืกืคืจ ืกืืืืช, ืฉืืขืืงืจืืช ืฉืืื ืืืืชื ืฉืจืฆืืชื ืืืคืฉืจ ืืืืืืฃ ืืืืขืืช ืืื ืืคืืืงืฆืืืช 1C ืฉืื ืืช (ืืืฉื ืืื Trade Management ืืืฉืืื ืืืช). ืืคืืืงืฆืืืช 1C ืฉืื ืืช ืืืืืืช ืืคืขืื ืขื ืืจืกืืืช ืฉืื ืืช ืฉื ืคืืืคืืจืืช 1C:Enterprise, ืืืืืช ืืืืงืืืช ืืฉืจืชืื ืฉืื ืื ืืื'. ืืชื ืืื ืืืื, ืืืฉืื SV ืืืืฆืจ ื ืคืจื ืืืืืงื "ืืฆื" ืฉื ืืชืงื ืืช 1C ืืื ืืคืชืจืื ืืืืคืืืืื.
ืื ืืืืื ื ืืืฆืืจ SV ืืืืฆืจ ื ืคืจื. ืื ื ืืืืืฆืื ืืืืจืืช ืงืื ืืช ืืืฉืชืืฉ ืืฉืจืช ื-CB ืฉืืชืงื ื ืืขื ื ืฉืื ื (wss://1cdialog.com) ืืื ืืืืื ืข ืืืขืืืืืช ืืชืงืืจืืช ืืงืฉืืจืืช ืืืชืงื ื ืืงืืืืช ืืชืฆืืจื ืฉื ืืฉืจืช. ืืงืืืืช ืืืืืื ืขืฉืืืื ืืืฆืื ืฉืืืืืฅ ืืืชืงืื ืฉืจืช CB ืืฉืืื ืืืชืงื ืื ืฉืืื. ืืฉืชืืฉื ื ืืืืฉื ืืืื ืืืืฆืจ SaaS ืืขื ื ืฉืื ื
ืืืฉืื
ืืื ืืืคืืฅ ืืช ืกืืืืืช ืืขืืืก ืืืชืงืืืช, ื ืคืจืืก ืื ืืืฉืื Java ืืื, ืืื ืืื, ืขื ืืืื ืขืืืกืื ืืคื ืืื. ืื ืืชื ืฆืจืื ืืืขืืืจ ืืืืขื ืืฆืืืช ืืฆืืืช, ืืฉืชืืฉ ื-publish/subscribe ื-Hazelcast.
ืืชืงืฉืืจืช ืืื ืืืงืื ืืฉืจืช ืืื ืืืืฆืขืืช websocket. ืื ืืชืืื ืืืื ืืืขืจืืืช ืืืื ืืืช.
ืืืืื ืืืืืจ
ืืืจื ื ืืื Redis, Hazelcast ื-Ehcache. ืื 2015. Redis ืืืืืง ืืืฆืืื ืืฉืืื ืืืฉ (ืืืฉ ืืื, ืืคืืื), ืืฉ Sentinel ืขื ืืจืื ืืืืืืช. Ehcache ืื ืืืืข ืืื ืืืจืืื ืืืฉืืื (ืคืื ืงืฆืืื ืืืืช ืื ืืืคืืขื ืืืืืจ ืืืชืจ). ืืืืื ื ืื ืกืืช ืืช ืื ืขื Hazelcast 3.4.
Hazelcast ืืืจืื ืืืฉืืื ืืชืื ืืงืืคืกื. ืืืฆื ืฆืืืช ืืืื, ืืื ืื ืืืื ืฉืืืืฉื ืืืืื ืืฉืืฉ ืจืง ืืืืืื - ืืื ืื ืืืืข ืืื ืืืจืืง ื ืชืื ืื ืืืืกืง, ืื ืืชื ืืืื ืืช ืืฆืืืช ืืืืื, ืืชื ืืืื ืืช ืื ืชืื ืื. ืื ื ืคืืจืกืื ืืกืคืจ Hazelcasts, ืืื ืืื ืื ื ืืืืื ื ืชืื ืื ืงืจืืืืื. ืื ืื ื ืื ืืืืื ืืช ืืืืืื - ืื ืื ืืคืจืืข ืื ื.
ืขืืืจื ื, Hazelcast ืืื:
- ืืืกืื ืืคืขืืืช ืืฉืชืืฉ. ืืืงื ืืจืื ืืื ืืืืื ืก ืืืกื ืื ืชืื ืื ืืกืฉื ืืื ืคืขื, ืื ืฉืื ื ืืช ืื ืืคืขืืืช ื-Hazelcast.
- ืืืืื. ืื ืืชื ืืืคืฉ ืคืจืืคืื ืืฉืชืืฉ, ืืืืง ืืช ืืืืืื. ืืชื ืืืืขื ืืืฉื - ืืื ืก ืืืชื ืืืืืื.
- ื ืืฉืืื ืืชืงืฉืืจืช ืืื ืืืคืขื ืืืฉืืืื. ืืฆืืืช ืืืฆืจ ืืืจืืข ืืืฆืื ืืืชื ืื ืืฉื Hazelcast. ืฆืืชื ืืืฉืืืื ืืืจืื ืืจืฉืืืื ืื ืืฉื ืื ืืงืืืื ืืืขืืืื ืืช ืืืืจืืข.
- ืื ืขืืื ืืฉืืื. ืืืืืื, ืื ื ืืืฆืจืื ืืืื ืืืืฆืขืืช ืืคืชื ืืืืืื (ืืืื ืืืื ืืืกื ืื ืชืื ืื ืฉื 1C):
conversationKeyChecker.check("ะะะะะะะะะะะะ");
doInClusterLock("ะะะะะะะะะะะะ", () -> {
conversationKeyChecker.check("ะะะะะะะะะะะะ");
createChannel("ะะะะะะะะะะะะ");
});
ืืืงื ื ืฉืืื ืขืจืืฅ. ืืงืื ื ืืช ืืื ืขืื, ืืืงื ื ืืืชื ืฉืื ืืืฆืจื ื ืืืชื. ืื ืื ืชืืืืง ืืช ืืื ืขืื ืืืืจ ืฉืืงืืช ืืช ืืื ืขืื, ืื ืืฉ ืกืืืื ืฉืื ืฉืจืฉืืจ ืืืจ ืืืง ืืืืชื ืจืืข ืืขืืฉืื ืื ืกื ืืืฆืืจ ืืช ืืืชื ืืืื - ืืื ืืื ืืืจ ืงืืื. ืื ื ืืชื ืื ืขืื ืืืืฆืขืืช ื ืขืืืช java ืืกืื ืืจื ืช ืื ืจืืืื. ืืจื ืืกื ืื ืชืื ืื - ืื ืืืื, ืืืื ืขื ืืกื ืื ืชืื ืื; ืืจื Hazelcast - ืื ืื ืฉืืชื ืฆืจืื.
ืืืืจืช DBMS
ืืฉ ืื ื ื ืืกืืื ืจื ืืืืฆืื ืืขืืืื ืขื PostgreSQL ืืฉืืชืืฃ ืคืขืืื ืขื ืืคืชืื ื-DBMS ืืื.
ืื ืื ืงื ืขื ืืฉืืื PostgreSQL - ืืฉ
ืื ืืชื ืฆืจืื ืืฉื ืืช ืงื ื ืืืื ืฉื ืืกื ื ืชืื ืื ืืืกื, ืื ืืืืจ
ืืืจืกื ืืจืืฉืื ื ืฉื ืืจืกืืก ืฉืื ื ืื ืืื ืืช ืืืืืืช ืืืคืืฅ ืื ืืืช ืืืืืืืืช ืฉื ืืืคืืืงืฆืื ืฉืื ื ืขื ืคื ื ืฉืจืชืื ืฉืื ืื ืืคืจืืคืืจืฆืืืช ืฉืื ืืช. ืืฉ ืืจืื ืืืืขืืช ืืฉืจืช A - ืืืงืฉื, ืืื ื ืขืืืจ ืืืง ืืืืืื ืืื ืืฉืจืช B. ืืืืืื ืืื ืคืฉืื ืฆืจืื ืขื ืืืคืืืืืืฆืื ืืืงืืืช, ืื ืืืืื ื ืืืืืื ืืช ืขืฆืื ื ืืืืฉื ืฉื ืจืืืื ืืืืจืื.
ืขื ืจืืืื ืืืืจืื ืชืืืื ืืงืจืื ืืืฉื ืืืชืจ
ื-SV ืืฉ ืืช ืืืืฉืืื ืฉื ืืคืืืงืฆืื ืืื ืื. ืืคืืืงืฆืื ืืื ืืชืงื ื ืกืคืฆืืคืืช ืฉื ืืคืืืงืฆืื ืขืกืงืืช, ืืืื ERP ืื Accounting, ืขื ืืืฉืชืืฉืื ืืื ืชืื ืื ืืขืกืงืืื ืฉืื. ืื ืื ืืื ืืจืืื ืื ืืื ืฉืืืคืืืงืฆืื ืจืฉืืื ืืืขืื ืืฉืจืช SV. ืืื ืื ืืืืืื ืืืืืช ืืกืคืจ ืืคืืืงืฆืืืช ืจืฉืืืืช, ืืืืฉืืืื ืืื ืืืืืื ืืืืืืฃ ืืืืขืืช ืืื ืืื. ืืื ืื ืืคื ืืฉืืืจ ืืืขืจืืช ืฉืื ื. ื ืืชื ืืืชืจ ืืืืขืืช ืืืกืคืจ ืื ืืืื ืืืกื ื ืชืื ืื ืคืืื ืืื; ืื ืื ื ืจืืืื ืฉืื ืื ืืชืืื ืืืืฆืจ ืชื ืืขื ืจืื, ื ืขืืืจ ืืืชื ืืืกื ื ืชืื ืื ืคืืื ื ืคืจื (ืื ืืคืืื ืืฉืจืช ืืกื ื ืชืื ืื ื ืคืจื).
ืืฉ ืื ื ืืกื ื ืชืื ืื ืจืืฉื ืฉืื ืืืืืกื ืช ืืืืช ื ืืชืื ืขื ืืืืข ืขื ืืืงืืื ืฉื ืื ืืกืื ืื ืชืื ืื ืฉื ืืื ืืืื.
ืืื ืืื ืืข ืืืกื ืื ืชืื ืื ืืจืืฉื ืืืืืช ืฆืืืืจ ืืงืืืง, ืื ื ืฉืืืจืื ืืช ืืืืช ืื ืืชืื (ืื ืชืื ืื ืืืจืื ืื ืืืฆืื ืืขืชืื ืงืจืืืืช) ืืืืืื.
ืื ืืกืืก ืื ืชืื ืื ืฉื ืืื ืื ืืชืืื ืืืื, ื ืืชืื ืืืชื ืืืืืฆืืช ืืคื ืื. ืืคืจืืืงืืื ืืืจืื ืฉืื ื ืืฉืชืืฉืื ืืื
ืืืืืื ืฉืืืืื ืืืืขืืช ืืฉืชืืฉ ืื ืจืข, ืื ื ืืชืืืงืื ืืช ืืกืื ืื ืชืื ืื ืฉืื ื ืขื ืืขืชืงืื. ืืฉืืืื ืฉื ืืขืชืงืื ืกืื ืืจืื ืืื ืื-ืกืื ืืจืื ืืื ืืืคืฉืจ ืื ืืืื ืืช ืขืฆืื ืืืงืจื ืฉื ืืืืื ืืกื ืื ืชืื ืื ืืจืืฉื. ืืืืื ืืืืขื ืืชืจืืฉ ืจืง ืื ืืกื ืื ืชืื ืื ืืจืืฉื ืืืขืืชืง ืืกืื ืืจืื ื ืฉืื ืืืืฉืื ืื-ืืื ืืช.
ืื ืืขืชืง ืกืื ืืจืื ื ืืืื, ืืืขืชืง ืืืกืื ืืจืื ื ืืืคื ืืกืื ืืจืื ื.
ืื ืืกื ืื ืชืื ืื ืืจืืฉื ืืื, ืืขืชืง ืืกืื ืืจืื ื ืืืคื ืืืกื ืื ืชืื ืื ืืจืืฉื, ืืืขืืชืง ืืืกืื ืืจืื ื ืืืคื ืืขืชืง ืกืื ืืจืื ื.
Elasticsearch ืืืืคืืฉ
ืืืืืื ืฉืืื ืืืชืจ ืื SV ืืื ืฉืืื, ืืื ืืฆืจืื ืืืคืืฉ ืืืืจ, ื ืื ืืืืืฉ, ืชืื ืืชืืฉืืืช ืืืืจืคืืืืืื, ืชืื ืฉืืืืฉ ืืืชืืืืช ืื ืืืืืงืืช. ืืืืื ื ืื ืืืืฆืื ืืช ืืืืื ืืืืฉ ืืืืฉืชืืฉ ืืื ืืข ืืืืคืืฉ ืืืื ืื Elasticsearch, ืฉื ืืฆืจ ืขื ืืกืืก ืืกืคืจืืื
ื-github ืืฆืื ื
ืืื ืฉืืจืฉ ืืืืื "ืืงืกื" ืืืฉืืจ. ืืืฉื ืื ืืืคืฉืจืช ืื ืืืคืฉ ืืชืืืืช ืืืืื, ืืืืฆืข ืืืกืืฃ ืืืืื.
ืืชืืื ื ืืืืืื
ืืืจื ืขื ืืชืืื ื ืืชืืืืช ืืืืืจ, ืื ืขื ืืกืืจืื:
- ืืืื ืฉื ืืฉืฃ ืืืื ืืจื ื; ืืฉ ืื ื nginx, ืื ืืืื ืืืืืช ืื ืืื.
- ืืืคืขื ืืืฉืืื Java ืืชืงืฉืจืื ืื ืขื ืื ืืืืฆืขืืช Hazelcast.
- ืืขืืืื ืขื ืฉืงืข ืืื ืืจื ื ืฉืื ื ืืฉืชืืฉืื ืื
Netty . - ืืคืืืงืฆืืืช Java ืืชืืื ื-Java 8 ืืืืจืืืช ืืืืืืืช
OSGi . ืืชืืื ืืืช ืืืืืืช ืืขืืจ ื-Java 10 ืืืขืืจ ืืืืืืืื.
ืคืืชืื ืืืืืงืืช
ืืชืืืื ืืคืืชืื ืืืืืืงื ืฉื ื-SV, ื ืชืงืื ื ืืืกืคืจ ืชืืื ืืช ืืขื ืืื ืืช ืฉื ืืืืฆืจืื ืฉืื ื ืืฉืชืืฉืื ืืื.
ืืืืงืช ืขืืืกืื ืืืืืคืืช ืืืืจืื
ืืฉืืจืืจ ืฉื ืื ืืืืืจืช SV ืืจืื ืืืืืงืช ืขืืืก. ืื ืืฆืืื ืืืฉืจ:
- ืืืืืงื ืขืืื ืืกืคืจ ืืืื ืืื ืืื ืชืงืืืช ืฉืืจืืช
- ืืื ืืชืืืื ืืคืขืืืืช ืืคืชื ืื ืขืื ืขื ืกืฃ ื ืื
- ืืจืขื ืืืืฆืืขืื ืืืฉืืืื ืืืจืกื ืืงืืืืช ืืื ืื ืืืชืจ ื-10%
ืื ื ืืืืืื ืืช ืืืืจ ืืืืืงืืช ืื ืชืื ืื - ืืฉื ืื ืื ื ืืงืืืื ืืืืข ืขื ืืื ืื ืืคืขืื ืืืืชืจ ืืฉืจืช ืืืคืงื, ืืืคืืืื ืืช ืืกืคืจืื ื-5 (ืืกืคืจ ืืืืืขืืช, ืืืืื ืื, ืืืฉืชืืฉืื) ืืืืืงืื ืืืช ืื.
ืื ื ืืืฆืขืื ืืืืงืืช ืขืืืก ืฉื ืืขืจืืช ืืืื ืืจืืงืฆืื ืืฉืืืฉ ืชืฆืืจืืช:
- ืืืื ืืืืฅ
- ืืืืืจืื ืืืื
- ืจืืฉืื ืื ืื
ืืืืื ืืืื ืืืืืฅ ืื ืื ื ืืฉืืงืื ืืื ืืืืช ืฉืจืฉืืจืื, ืืื ืืืขื ืื ืืช ืืืขืจืืช ืืื ืืคืกืงื: ืืชืืืช ืืืืขืืช, ืืฆืืจืช ืืืื ืื, ืงืืืช ืจืฉืืืช ืืืืขืืช. ืื ื ืืืืื ืคืขืืืืช ืฉื ืืฉืชืืฉืื ืจืืืืื (ืงืื ืจืฉืืื ืฉื ืืืืขืืช ืฉืื ื ืงืจืื, ืืชืื ืืืืฉืื) ืืคืชืจืื ืืช ืชืืื ื (ืืฉืืจ ืืืืื ืืชืฆืืจื ืืืจืช, ืืขืื ืืชืจืื).
ืืืืืื, ืื ื ืจืื ืืืง ืืืืื ืืืืืฅ:
- ืืฉืชืืฉ ืืชืืืจ
- ืืืงืฉ ืืช ืืืืื ืื ืฉืื ื ืงืจืื
- ืกืืืจืืช ืฉื 50% ืืงืจืื ืืืืขืืช
- ืกืืืจืืช ืฉื 50% ืืฉืืื ืืืืขืืช ืืงืกื
- ืืืฉืชืืฉ ืืื:
- ืืฉ ืกืืืื ืฉื 20% ืืืฆืืจ ืืืื ืืืฉ
- ืืืืจ ืืืงืจืื ืื ืืื ืืืืืื ืื ืฉืื
- ื ืื ืก ืคื ืืื
- ืืืงืฉ ืืืืขืืช, ืคืจืืคืืื ืืฉืชืืฉืื
- ืืืฆืจ ืืืฉ ืืืืขืืช ืืืืคื ืืช ืืืฉืชืืฉืื ืืงืจืืืื ืืืืืื ืืื
- ืืฉืืืจ ืืืื
- ืืืืจ 20 ืคืขืืื
- ืืชื ืชืง, ืืืืจ ืืชืืืืช ืืกืงืจืืคื
- ืฆ'ืื ืืื ื ืื ืก ืืืขืจืืช (ืืืื ืืืืขืืช ืืงืื ืืคืืืงืฆืื)
- ืืฉ ืกืืืื ืฉื 50% ืืืฆืืจ ืขืจืืฅ ืืืฉ ืืืืืคืช ื ืชืื ืื (ืืืื ืืืืื)
- ืกืืืจืืช ืฉื 50% ืืืชืื ืืืืขื ืืื ืืื ืืืขืจืืฆืื ืืงืืืืื
ืืชืจืืืฉ "ืืืืืจืื ืืืื" ืืืคืืข ืืกืืื ืืืฉืื. ืืฉ ืืฆื: ืืฉืชืืฉืื ืืืืจื ืืช ืืืขืจืืช, ืืื ืขืืืื ืื ืืกืชืืื. ืื ืืฉืชืืฉ ืืืืืง ืืช ืืืืฉื ืืฉืขื 09:00 ืืืืงืจ, ืืืฆืจ ืืืืืจ ืืฉืจืช ืืฉืืชืง. ืืืืจ'ื ืืืื ืืกืืื ืื, ืืฉ ืืจืื ืืื - ืืืืืืืช ืืืืืืืช ืฉืืฉ ืืื ืื PING/PONG, ืืื ืื ืฉืืืจืื ืขื ืืืืืืจ ืืฉืจืช (ืื ืื ืืืืืื ืืฉืืืจ ืขื ืื - ืื ืื ืืฉ ืืืืขื ืืืฉื). ืืืืืงื ืืฉืืืจืช ืืฆื ืฉืื ืืกืคืจ ืจื ืฉื ืืฉืชืืฉืื ืืืื ืื ืกืื ืืืืื ืก ืืืขืจืืช ืชืื ืืฆื ืฉืขื. ืื ืืืื ืืืืื ืืืืฅ, ืืื ืืืืงืื ืฉืื ืืื ืืืืงื ืืงืื ืืจืืฉืื ืืื - ืืื ืฉืื ืืืื ืืฉืืื (ืืื ืื ืืฉืชืืฉ ืืืขืจืืช, ืืืื ืืืจ ื ืืคืืช - ืงืฉื ืืืฉืื ืขื ืืฉืื ืืืชืจ ืืจืืข).
ืกืงืจืืคื ืจืืฉืื ืืื ืื ืืชืืื ืืืืฉืงื ืืจืืฉืื ื. ืขืจืื ื ืืืื ืืืืฅ ืืืืื ื ืืืืืื ืฉืืืขืจืืช ืื ืืืื ืืืืื ืืืชืืชืืืช. ืืื ืืฉืชืืฉืื ืืืืขื ืืืจืืฉืื ืืชืืื ืืืืืฉื ืขืงื ืคืกืง ืืื. ืืขืช ืืืจืฉืื ืืฉืชืืฉื ื
ืื ื ืืฉืชืืฉืื ืืืืืื ืขืืืกืื
ืฉื ืืืืื ื ืืืชืืื.
ืืืขื ืืื ืืืืจ ืืชืืืช ืืืืงืืช ืจืฆืื ืืืช, ืืืืื ื ืฉ-JMeter ืืื ืืืืืฃ ืืืืจืื.
ืืชืืกืฃ ืืื ืกืืคืืจ ืืืื ื ืคืจื; ืขื 176 ืืืืืื, ืืฉ ืื 132 ืืืืืืช ื-github. ืืืืชื ืขืฆืื ืื ืืชืืืื ืืื ืืื 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
- ืขืืืฃ SimpleDateFormat ื-ThreadLocal; SimpleDateFormat ืืื ื ืืืื ืืฉืจืฉืืจ, ืื ืฉืืืืื ื-NPE ืืืื ืจืืฆื
- ืชืืงื ืืืืคืช ืืืืจืื ื ืืกืคืช (ืืืืืืจ ื ืกืืจ ืืฆืืจื ืฉืืืื ืืขืช ื ืืชืืง)
ืืืื ืืืช ืื ืืืจื!
ืืืืืจืื ืืชืืื ืืืืืืจ ืื ืชืื ืืื, ืืื ืชืื ืืืืืื. ืืืฉ ืื ื ืฉืืจ ืืื, ืื ืืืืื ื ืืืฉืืง ืคืืืช ืฉืจืฉืืจืื, ืืื ืขื ืืจืืขื ืกืืื ืื. ืื ืืื ืืืืจ ืืืกืคืืง ืืคืืืช ืืฉืืืข.
ืขืืจื ืืืืืื...
ืขืืฉืื ื-Hazelcast ื ืืืจ ืืืืืจืื. ืืืืื ืื ืืจืื ืฉืืืจื ืืื ืืืื ืฉื ืืืืงืืช, Hazelcast ืืืื ืืืชืืื ื ืขื ืืืกืจ ืืืืจืื, ืืืืืจ ืืื ืื ืืืฉืืื ืืชืคืจืง, ืืืฆืืชืื ืืืฉืืื ืืืืช ืืื ืืืจ ืื. ืืืืจื ื ืืช JVisualVM ื-hazelcast ืืจืืื ื "ืืกืืจ ืขืืื" - ืื ื ืงืจื ืืืืคื ืงืืืข GC, ืืื ืื ืืฆืืื ืื ืงืืช ืืช ืืืืืจืื.
ืืชืืจืจ ืฉื-hazelcast 3.4, ืืขืช ืืืืงืช ืืคื / multiMap (map.destroy()), ืืืืืจืื ืืื ื ืืฉืืืจืจ ืืืืืืื:
ืืืื ืชืืงื ืืขืช ื-3.5, ืืื ืื ืืืืชื ืืขืื ืื. ืืฆืจื ื ืืืืื ืืคืืช ืืืฉืืช ืขื ืฉืืืช ืืื ืืืื ืืืืงื ื ืืืชื ืืคื ืืืืืืื ืฉืื ื. ืืงืื ื ืจืื ืืขืจื ืื:
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 ืฆืจืื ืืืืืชื ืืืจืืื ืืืืืื ืืืืื ืงืืืคืืืฆืื - ืื ืืจืื ืืืชืจ ืืืืจ.
ืงืฉืจ . - ืงื ืืืชืจ ืืืืื ืืจืคืื ืฉื Jmeter-Plugins ืืืฉืจ ืกืื ืืจืืืื.
ืงืฉืจ .
ืขื ืื ืืกืืื ืฉืื ื ืขื Hazelcast
Hazelcast ืืื ืืืฆืจ ืืืฉ ืขืืืจื ื, ืืชืืื ื ืืขืืื ืืืชื ืืืจืกื 3.4.1, ืืขืช ืฉืจืช ืืืืฆืืจ ืฉืื ื ืคืืขื ืืืจืกื 3.9.2 (ืืืื ืืชืืืช ืฉืืจืืช ืืื ืืืจืกื ืืขืืื ืืช ืืืืชืจ ืฉื Hazelcast ืืื 3.10).
ืืคืงืช ืชืขืืืืช ืืืืช
ืืชืืื ื ืขื ืืืืื ืฉืืืื. ืืืื ื ืืืืื ืฉืื ืื ื ืฆืจืืืื ืขืื ืืื ื ืืืฉืืช ืืืฉื. ืจืฆืฃ ืืืกืืก ืื ืชืื ืื ืื ืืชืืื, ืืืืืืืช ืืขืืจืืืช ืืจืกืืกืื - ืืกืชืืจ ืฉืืฉ ืืืืขื ID=1 ื-DB1 ืืืืืขื ID=1 ื-DB2, ืื ืืคืฉืจ ืืฉืื ืืช ื-ID ืืื ื- Elasticsearch, ืืื ืื ื-Hazelcast , ืืื ืืืืจ ืืืจืืข ืืืืชืจ ืืื ืื ืืชื ืจืืฆื ืืฉืื ืืช ืื ืชืื ืื ืืฉื ื ืืกืื ื ืชืื ืื ืืืื (ืืืืืื, ืืืืืื ืฉืืกื ื ืชืื ืื ืืื ืืกืคืืง ืืื ืืืื ืืืื). ืืชื ืืืื ืืืืกืืฃ ืืกืคืจ AtomicLongs ื-Hazelcast ืืืฉืืืจ ืืช ืืืื ื ืฉื, ืืื ืืืืฆืืขืื ืฉื ืืฉืืช ืืืื ืืืฉ ืื incrementAndGet ืืชืืกืคืช ืืืื ืืืงืฉื ื-Hazelcast. ืืื ื-Hazelcast ืืฉ ืืฉืื ืืืคืืืืื ืืืชืจ - FlakeIdGenerator. ืืืฆืืจืช ืงืฉืจ ืขื ืื ืืงืื, ืื ืืงืืืื ืืืื ืชืขืืืช ืืืืช, ืืืฉื, ืืจืืฉืื - ื-1 ืขื 10, ืืฉื ื - ื-000 ืขื 10 ืืื ืืืื. ืืขืช ืืืงืื ืืืื ืืื ืคืืง ืืืืื ืืืฉืื ืืขืฆืื ืขื ืฉืืืืื ืฉืืื ืคืง ืื ืืกืชืืื. ืื ืขืืื ืืืจ, ืืื ืืฉืืคืขืืืื ืืืืฉ ืืช ืืืคืืืงืฆืื (ืืืช ืืืงืื Hazelcast), ืืชืืื ืจืฆืฃ ืืืฉ - ืืืืื ืืืืืืืื ืืื'. ืื ืืกืฃ, ืืคืชืืื ืื ืืืฉ ืืืื ืื ืืื ืืืืืื ืื ืืกืคืจืื ืฉืืืื, ืืื ืื ืื ืื ืื ืขืงืืืื. ืฉืงืื ื ืืื ืืขืืจื ื ื-UUID.
ืืื, ืืื ืฉืจืืฆื ืืืืืช ืืื ืืืืืืจ, ืืฉ ืกืคืจืืืช Snowcast ืืื - ืื ืืืฉืื ืฉื Snowflake ืขื ืืื Hazelcast. ืืชื ืืืื ืืฆืคืืช ืื ืืื:
ืืื ืื ืืืขื ื ืืื ืืืชืจ.
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 ืืืฉ ืืื ืืื ืืฉืืชื
ืจืืฉืืช, ืืืืื ื ืืืงืืื ืืืืืืงืืื ืฉื ืืฉืืขืืจืื ืฉืื ื ืืืืืืงืกื. ืืืืืื, ืืฉ ืื ื ืืืืงื 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 ืืืจืง ืฉืืืื.
IMap. ืื ืื ื ืืืชืืื 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 ืื ืฆืจืื ืืืขืช ืืช ืืื ื ืืฉืืขืืจืื ืฉืื ื, ืืื ืื ื ืืืืืื ืืขืืื ืืื ืืื ืืฉืืชื. ืืืจืกืืืช ืฉื ืืืืืืงืื ืืืืืื ื ืฉืืืช ืขื ืืื ืืืคืืืงืฆืื. ืืจืกืืืช ืฉืื ืืช ืฉื ืืืคืืืงืฆืื ืืืืืืช ืืจืืฅ ืื-ืืื ืืช, ืืืชืื ืืฆื ืฉืื ืืืคืืืงืฆืื ืืืืฉื ืืืชืืช ืืืืืืงืืื ืขื ืฉืืืช ืืืฉืื, ืื ืืืฉื ื ืขืืืื ืื ืืืืขืช ืขื ืฉืืืช ืืื. ืืืืงืืื, ืืืคืืืงืฆืื ืืืืฉื ืงืืจืืช ืืืืืืงืืื ืฉื ืืชืื ืขื ืืื ืืืคืืืงืฆืื ืืืฉื ื ืฉืืื ืืื ืฉืืืช ืืืฉืื. ืื ื ืืืคืืื ืืืฆืืื ืืืื ืืชืื ืืืคืืืงืฆืื, ืื ืืฉื ืืคืฉืืืช ืืื ื ื ืืฉื ืื ืื ืืืืงืื ืฉืืืช, ืื ื ืจืง ืืจืืืืื ืืช ืืืืืงืืช ืขื ืืื ืืืกืคืช ืฉืืืช ืืืฉืื.
ืืืฆื ืื ื ืืืืืืื ืืืฆืืขืื ืืืืืื
ืืจืืข ื ืกืืขืืช ืืืืืืงืกื - ืืื, ืฉืชืืื ืืืืืจ - ืจืข
ืืขืืจ ืืืืืื ืขืืืจ ื ืชืื ืื ืืื ืชืืื ืืื ืืืชืจ ืืืฉืจ ืืขืืจ ืืืกื ืื ืชืื ืื, ืืื ืืชื ืื ืื ืจืืฆื ืืืืกื ืจืฉืืืืช ืฉืืื ื ืืฉืืืืฉ. ืื ืื ื ืืฉืืืจืื ืืช ืืืืืื ืืืื ืื ืืืืืื ืขื ืืฉืื ืืืืจืื ืฉื ืืคืืชืื. ืืืฉืจ ืืคืื ืงืฆืืื ืืืืช ืืืืฉื ืืงืืืืช, ืื ื ืืคืขืืืื ืจืืฉืื ืฉื ืื ืืฉืืืืชืืช ื-PostgreSQL (log_min_duration_statement ื-0) ืืืจืืฆืื ืืืืงืืช ืขืืืก ืืืฉื 20 ืืงืืช. ืืืืฆืขืืช ืืืืื ืื ืฉื ืืกืคื, ืืื ืขืืจ ืืื pgFouine ื-pgBadger ืืืืืื ืืื ืืช ืืืืืช ืื ืืืืืื. ืืืืืืช, ืื ื ืืืคืฉืื ืืขืืงืจ ืฉืืืืชืืช ืืืืืืช ืืชืืืคืืช. ืขืืืจ ืฉืืืืชืืช ืืืืืืช, ืื ื ืืื ืื ืชืืื ืืช ืืืฆืืข (EXPLAIN) ืืืขืจืืืื ืืื ื ืืชื ืืืืืฅ ืฉืืืืชื ืืื. ืืงืฉืืช ืชืืืคืืช ืขืืืจ ืืืชื ื ืชืื ื ืงืื ืืฉืชืืืื ืืืื ืืืืืื. ืื ื ืื ืกืื ืืฉืืืจ ืฉืืืืชืืช "ืฉืืืช", ืืืื ืืืช ืืื ืฉืืืืชื.
ื ืืฆืื
SV ืืฉืืจืืช ืืงืืื ืืืคืขื ืืืืื 2017, ืืืืืฆืจ ื ืคืจื, SV ืฉืืืจืจ ืื ืืืืืจ 2017 (ืืืืชื ืชืงืืคื ืืกืืืืก ืืจืกืช ืืื).
ืืืฉื ืืืชืจ ืืฉื ื ืฉื ืคืขืืืืช ืื ืืื ืืขืืืช ืจืฆืื ืืืช ืืชืคืขืื ืืฉืืจืืช ืืืงืืื ืฉื CB. ืื ื ืขืืงืืื ืืืจ ืืฉืืจืืช ืืืงืืื ืืืืฆืขืืช
ืืคืฆืช ืฉืจืช SV ืืกืืคืงืช ืืฆืืจื ืฉื ืืืืืืช ืืงืืจืืืช: RPM, DEB, MSI. ืื ืืกืฃ ืขืืืจ Windows ืื ื ืืกืคืงืื ืืชืงืื ืืืื ืืฆืืจื ืฉื EXE ืืืื ืฉืืชืงืื ืืช ืืฉืจืช, Hazelcast ื- Elasticsearch ืขื ืืืื ื ืืืช. ืืชืืืื ืืชืืืืกื ื ืืืจืกื ืื ืฉื ืืืชืงื ื ืืืจืกืช "ืืืืื", ืื ืืขืช ืืชืืจืจ ืื ืืืื ืืคืฉืจืืช ืืคืจืืกื ืืคืืคืืืจืืช ืืืืชืจ.
ืืงืืจ: www.habr.com