ProHoster > Блог > Kev tswj hwm > Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast
Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast
Hauv tsab xov xwm no peb yuav tham txog yuav ua li cas thiab vim li cas peb thiaj li tsim Kev sib tham System - lub tshuab uas hloov cov ntaub ntawv ntawm cov neeg siv khoom siv thiab 1C: Kev lag luam servers - los ntawm kev teeb tsa txoj haujlwm rau kev xav los ntawm cov qauv tsim thiab kev siv cov ntsiab lus.
Qhov Kev Sib Tham Sib Tham (tom qab no hu ua SV) yog ib qho kev xa tawm tsis raug cai nrog kev lees paub kev xa khoom. SV yog tsim los ua kev pabcuam siab nrog kev ua haujlwm siab, muaj ob qho tib si raws li kev pabcuam online (muab los ntawm 1C) thiab ua cov khoom tsim tawm loj uas tuaj yeem xa mus rau koj tus kheej cov chaw pabcuam.
SV siv cov khoom faib hazelcast thiab nrhiav cav Elasticsearch. Peb tseem yuav tham txog Java thiab yuav ua li cas peb horizontally scale PostgreSQL.
Nqe lus ntawm qhov teeb meem
Txhawm rau kom paub meej tias vim li cas peb thiaj tsim Kev Sib Tham Sib Tham, Kuv yuav qhia koj me ntsis txog kev txhim kho kev lag luam hauv 1C ua haujlwm li cas.
Pib nrog, me ntsis txog peb rau cov neeg uas tseem tsis tau paub tias peb ua dab tsi :) Peb tab tom ua 1C: Kev Lag Luam thev naus laus zis platform. Lub platform muaj xws li kev lag luam daim ntawv thov kev txhim kho cov cuab yeej, nrog rau lub sijhawm ua haujlwm uas tso cai rau cov ntawv thov kev lag luam khiav hauv qhov chaw hla kev.
Client-server txoj kev loj hlob paradigm
Cov ntawv thov kev lag luam tsim los ntawm 1C: Kev lag luam ua haujlwm hauv peb theem neeg siv-server architecture "DBMS - daim ntawv thov server - neeg siv". Daim ntawv thov code sau rau hauv built-in 1C lus, tuaj yeem ua tiav ntawm daim ntawv thov server lossis ntawm tus neeg siv khoom. Txhua yam ua haujlwm nrog cov khoom siv (cov ntawv qhia, cov ntaub ntawv, thiab lwm yam), nrog rau kev nyeem thiab sau cov ntaub ntawv, tsuas yog ua rau ntawm lub server. Lub functionality ntawm cov ntaub ntawv thiab hais kom ua interface kuj yog siv nyob rau hauv lub server. Tus neeg siv khoom tau txais, qhib thiab nthuav tawm cov ntaub ntawv, "kev sib txuas lus" nrog tus neeg siv (cov lus ceeb toom, cov lus nug ...), kev suav me me hauv cov ntawv uas xav tau cov lus teb ceev (piv txwv li, muab tus nqi sib npaug ntawm qhov ntau), ua haujlwm nrog cov ntaub ntawv hauv zos, ua haujlwm nrog cov khoom siv.
Nyob rau hauv daim ntawv thov code, lub headers ntawm cov txheej txheem thiab kev ua hauj lwm yuav tsum qhia meej tias qhov twg code yuav raug tua - siv lub &AtClient / &AtServer cov lus qhia (&AtClient / &AtServer hauv lus Askiv version ntawm hom lus). 1C cov neeg tsim tawm tam sim no yuav kho kuv los ntawm kev hais tias cov lus qhia tiag tiag ntau tshaj, tab sis rau peb qhov no tsis tseem ceeb tam sim no.
Koj tuaj yeem hu rau server code los ntawm tus neeg siv code, tab sis koj tsis tuaj yeem hu tus neeg siv khoom los ntawm tus lej server. Qhov no yog qhov kev txwv tseem ceeb uas peb tau ua rau ntau qhov laj thawj. Tshwj xeeb, vim hais tias tus neeg rau zaub mov code yuav tsum tau sau nyob rau hauv xws li ib txoj kev uas nws executes tib txoj kev txawm nyob qhov twg nws yog hu ua - los ntawm tus neeg siv los yog los ntawm lub server. Thiab nyob rau hauv cov ntaub ntawv ntawm kev hu rau server code los ntawm lwm tus neeg rau zaub mov code, tsis muaj tus neeg siv li ntawd. Thiab vim hais tias thaum lub sij hawm ua tiav ntawm tus neeg rau zaub mov code, tus neeg siv hu nws tuaj yeem kaw, tawm hauv daim ntawv thov, thiab lub server yuav tsis muaj leej twg hu.
Code uas tuav lub pob nyem: hu rau tus txheej txheem server los ntawm tus neeg siv yuav ua haujlwm, hu rau tus neeg siv khoom tus txheej txheem los ntawm tus neeg rau zaub mov yuav tsis
Qhov no txhais tau hais tias yog tias peb xav xa qee cov lus los ntawm cov neeg rau zaub mov mus rau daim ntawv thov tus neeg siv khoom, piv txwv li, tias tiam ntawm daim ntawv tshaj tawm "ntev" tau ua tiav thiab daim ntawv tshaj tawm tuaj yeem pom, peb tsis muaj txoj hauv kev zoo li no. Koj yuav tsum siv dag zog, piv txwv li, ib ntus tshawb xyuas tus neeg rau zaub mov los ntawm tus neeg siv khoom. Tab sis qhov no mus kom ze loads lub kaw lus nrog kev hu tsis tsim nyog, thiab feem ntau tsis zoo nkauj heev.
Thiab tseem muaj qhov xav tau, piv txwv li, thaum hu xov tooj tuaj txog SIP- Thaum hu xov tooj, ceeb toom rau tus neeg siv daim ntawv thov txog qhov no kom nws tuaj yeem siv tus neeg hu xov tooj kom pom nws hauv cov ntaub ntawv sib koom tes thiab qhia cov neeg siv cov ntaub ntawv hais txog kev hu xov tooj. Los yog, piv txwv li, thaum ib qho kev txiav txim tuaj txog ntawm lub tsev khaws khoom, ceeb toom rau tus neeg siv khoom daim ntawv thov txog qhov no. Feem ntau, muaj ntau qhov xwm txheej zoo li no yuav muaj txiaj ntsig zoo.
Kev tsim khoom nws tus kheej
Tsim ib lub tshuab xa xov. Fast, txhim khu kev qha, nrog guaranteed tus me nyuam, nrog lub peev xwm mus flexibly tshawb rau cov lus. Raws li cov txheej txheem, siv tus xa xov (cov lus, hu xov tooj) khiav hauv 1C daim ntawv thov.
Tsim qhov system kom horizontally scalable. Qhov nce load yuav tsum tau them los ntawm kev nce tus naj npawb ntawm cov nodes.
Kev siv
Peb txiav txim siab tsis koom ua ke cov neeg rau zaub mov ntawm SV ncaj qha rau hauv 1C: Kev Lag Luam platform, tab sis los siv nws ua cov khoom sib cais, API uas tuaj yeem raug hu los ntawm cov cai ntawm 1C daim ntawv thov kev daws teeb meem. Qhov no tau ua tiav rau ntau qhov laj thawj, qhov tseem ceeb yog qhov kuv xav kom nws tuaj yeem sib pauv lus ntawm 1C daim ntawv thov sib txawv (piv txwv li, ntawm Kev Tswj Lag Luam thiab Kev Lag Luam). Cov ntawv thov sib txawv 1C tuaj yeem khiav ntawm ntau qhov sib txawv ntawm 1C: Kev lag luam platform, nyob ntawm cov servers sib txawv, thiab lwm yam. Hauv cov xwm txheej zoo li no, kev siv SV raws li cov khoom sib cais nyob hauv "sab" ntawm 1C kev teeb tsa yog qhov kev daws teeb meem zoo.
Yog li, peb txiav txim siab los ua SV ua ib qho khoom sib cais. Peb pom zoo kom cov tuam txhab me siv CB server uas peb tau teeb tsa hauv peb huab (wss: // 1cdialog.com) kom tsis txhob muaj cov nqi siv nyiaj siv ua haujlwm nrog kev teeb tsa hauv zos thiab teeb tsa ntawm lub server. Cov neeg siv khoom loj tuaj yeem pom tias nws tsim nyog rau nruab lawv tus kheej CB server ntawm lawv cov chaw. Peb siv txoj hauv kev zoo sib xws hauv peb cov khoom lag luam huab SaaS 1c Fresh - Nws yog tsim los ua cov khoom tsim tawm loj rau kev teeb tsa ntawm cov neeg siv khoom qhov chaw, thiab tseem tau muab tso rau hauv peb cov huab https://1cfresh.com/.
Peb tau txheeb xyuas tias tsis muaj channel. Peb muab lub xauv, kuaj nws dua, thiab tsim nws. Yog tias koj tsis txheeb xyuas lub xauv tom qab siv lub xauv, ces muaj lub caij nyoog uas lwm cov xov kuj tau tshawb xyuas lub sijhawm ntawd thiab tam sim no yuav sim tsim tib qhov kev sib tham - tab sis nws twb muaj lawm. Koj tsis tuaj yeem xauv siv synchronized lossis tsis tu ncua java Lock. Los ntawm cov ntaub ntawv - nws qeeb, thiab nws yog kev hlub rau cov ntaub ntawv; los ntawm Hazelcast - qhov ntawd yog qhov koj xav tau.
Xaiv DBMS
Peb muaj kev paub dhau los thiab ua tiav ua haujlwm nrog PostgreSQL thiab koom tes nrog cov tsim tawm ntawm DBMS no.
Nws tsis yooj yim nrog PostgreSQL pawg - muaj XL, XC, Citus, tab sis feem ntau cov no tsis yog NoSQLs uas teev tawm ntawm lub thawv. Peb tsis tau txiav txim siab NoSQL ua qhov tseem ceeb cia; nws txaus uas peb coj Hazelcast, uas peb tsis tau ua haujlwm nrog ua ntej.
Yog hais tias koj xav tau scale ib relational database, nws txhais tau tias kev sib faib. Raws li koj paub, nrog sharding peb faib cov ntaub ntawv rau hauv nyias qhov chaw kom lawv txhua tus tuaj yeem muab tso rau hauv ib lub server cais.
Thawj version ntawm peb sharding xav tias muaj peev xwm faib txhua lub rooj ntawm peb daim ntawv thov hla cov servers sib txawv hauv qhov sib txawv. Muaj ntau cov lus ntawm tus neeg rau zaub mov A - thov, cia peb txav ib feem ntawm lub rooj no mus rau tus neeg rau zaub mov B. Qhov kev txiav txim siab no tsuas yog qw txog kev ua kom zoo ntxov ntxov, yog li peb txiav txim siab txwv peb tus kheej mus rau ntau tus neeg xauj tsev mus kom ze.
Koj tuaj yeem nyeem txog ntau tus neeg xauj tsev, piv txwv li, ntawm lub vev xaib Citus Data.
SV muaj cov ntsiab lus ntawm daim ntawv thov thiab cov neeg siv khoom. Ib daim ntawv thov yog kev teeb tsa tshwj xeeb ntawm daim ntawv thov kev lag luam, xws li ERP lossis Accounting, nrog nws cov neeg siv thiab cov ntaub ntawv lag luam. Ib tus neeg siv khoom yog ib lub koom haum lossis ib tus neeg uas nws sawv cev rau daim ntawv thov tau sau npe hauv SV server. Cov neeg siv khoom tuaj yeem muaj ntau daim ntawv thov sau npe, thiab cov ntawv thov no tuaj yeem sib pauv lus sib tham. Cov neeg siv khoom tau dhau los ua tus neeg xauj tsev hauv peb qhov system. Cov lus los ntawm ntau tus neeg siv khoom tuaj yeem nyob hauv ib lub cev database; Yog tias peb pom tias tus neeg siv khoom tau pib tsim ntau lub tsheb, peb txav nws mus rau qhov chaw sib cais ntawm lub cev (lossis txawm tias cais cov neeg siv khoom database).
Peb muaj cov ntaub ntawv tseem ceeb uas lub rooj routing khaws cia nrog cov ntaub ntawv hais txog qhov chaw ntawm txhua tus neeg siv khoom databases.
Txhawm rau tiv thaiv cov ntaub ntawv tseem ceeb los ntawm kev ua lub hauv paus, peb khaws lub rooj sib tham (thiab lwm yam ntaub ntawv xav tau ntau zaus) hauv ib lub cache.
Txij li thaum poob cov neeg siv cov lus tsis zoo, peb khaws peb cov ntaub ntawv nrog cov ntawv luam tawm. Kev sib xyaw ua ke ntawm synchronous thiab asynchronous replicas tso cai rau koj los xyuas koj tus kheej thaum poob ntawm lub ntsiab database. Cov lus poob tsuas yog tshwm sim yog tias cov ntaub ntawv tseem ceeb thiab nws cov ntaub ntawv synchronous ua tsis tiav ib txhij.
Yog hais tias lub synchronous replica ploj lawm, lub asynchronous replica yuav synchronous.
Yog hais tias lub ntsiab database ploj lawm, lub synchronous replica ua lub ntsiab database, thiab lub asynchronous replica ua ib tug synchronous replica.
Elasticsearch rau kev tshawb nrhiav
Txij li thaum, ntawm lwm yam, SV kuj yog ib tug tub txib, nws yuav tsum tau ib tug ceev, yooj yim thiab saj zawg zog nrhiav, coj mus rau hauv tus account morphology, siv imprecise ntais ntawv. Peb txiav txim siab tsis rov tsim lub log thiab siv lub tshuab tshawb nrhiav dawb Elasticsearch, tsim los ntawm lub tsev qiv ntawv Lucene. Peb kuj siv Elasticsearch hauv ib pawg (tus tswv - cov ntaub ntawv - cov ntaub ntawv) txhawm rau tshem tawm cov teeb meem thaum tsis ua haujlwm ntawm daim ntawv thov nodes.
Hauv github peb pom Lavxias teb sab morphology plugin rau Elasticsearch thiab siv nws. Hauv Elasticsearch index peb khaws cov lus hauv paus (uas lub plugin txiav txim siab) thiab N-grams. Raws li tus neeg siv nkag mus rau cov ntawv nyeem, peb nrhiav cov ntawv ntaus ntawv ntawm N-grams. Thaum khaws cia rau qhov ntsuas, lo lus "cov ntawv" yuav muab faib ua N-grams hauv qab no:
Thiab lub hauv paus ntawm lo lus "ntawv" tseem yuav khaws cia. Txoj hauv kev no tso cai rau koj los tshawb nrhiav thaum pib, nruab nrab, thiab thaum kawg ntawm lo lus.
Daim duab loj
Rov ua daim duab los ntawm qhov pib ntawm tsab xov xwm, tab sis nrog cov lus piav qhia:
Cov kab mob tam sim no tau kho hauv 3.5, tab sis nws yog ib qho teeb meem rov qab los. Peb tsim tshiab multiMaps nrog cov npe dynamic thiab tshem tawm raws li peb cov logic. Lub code ntsia ib yam dab tsi zoo li no:
public void join(Authentication auth, String sub) {
addValueToMap(sub, auth.getSessionId());
}
public void leave(Authentication auth, String sub) {
removeValueFromMap(sub, auth.getSessionId());
}
Cov kab kos tau txhim kho.
Dab tsi ntxiv peb tau kawm txog kev kuaj load?
JSR223 yuav tsum tau sau nyob rau hauv groovy thiab suav nrog muab tso ua ke cache - nws sai dua. txuas.
Jmeter-Plugins graphs yooj yim to taub dua li cov qauv. txuas.
Hais txog peb qhov kev paub nrog Hazelcast
Hazelcast yog ib yam khoom tshiab rau peb, peb pib ua hauj lwm nrog nws los ntawm version 3.4.1, tam sim no peb cov neeg rau zaub mov tsim tau khiav version 3.9.2 (thaum lub sijhawm sau ntawv, qhov tseeb version ntawm Hazelcast yog 3.10).
ID tiam
Peb pib nrog integer identifiers. Cia peb xav txog tias peb xav tau lwm Qhov Ntev rau ib qho chaw tshiab. Ib ntus hauv cov ntaub ntawv tsis tsim nyog, cov ntxhuav tau koom nrog hauv kev sib faib - nws hloov tawm tias muaj cov lus ID = 1 hauv DB1 thiab cov lus ID = 1 hauv DB2, koj tsis tuaj yeem tso tus ID no hauv Elasticsearch, lossis hauv Hazelcast. , tab sis qhov phem tshaj plaws yog tias koj xav muab cov ntaub ntawv los ntawm ob lub databases rau hauv ib qho (piv txwv li, txiav txim siab tias ib qho database txaus rau cov neeg siv khoom no). Koj tuaj yeem ntxiv ob peb AtomicLongs rau Hazelcast thiab khaws lub txee rau ntawd, tom qab ntawd qhov kev ua tau zoo ntawm kev tau txais tus ID tshiab yog nce ntxivAndGet ntxiv rau lub sijhawm thov rau Hazelcast. Tab sis Hazelcast muaj qee yam zoo dua - FlakeIdGenerator. Thaum hu rau txhua tus neeg siv khoom, lawv tau muab tus ID ntau, piv txwv li, thawj tus - los ntawm 1 txog 10, qhov thib ob - los ntawm 000 txog 10, thiab lwm yam. Tam sim no tus neeg siv khoom tuaj yeem tshaj tawm cov cim tshiab ntawm nws tus kheej kom txog thaum qhov ntau yam muab rau nws xaus. Nws ua haujlwm sai, tab sis thaum koj rov pib dua daim ntawv thov (thiab Hazelcast tus neeg siv), ib ntu tshiab pib - yog li qhov hla, thiab lwm yam. Tsis tas li ntawd, cov neeg tsim khoom tsis tshua nkag siab tias vim li cas cov IDs yog cov lej, tab sis tsis sib xws. Peb ntsuas txhua yam thiab hloov mus rau UUIDs.
Los ntawm txoj kev, rau cov neeg uas xav ua zoo li Twitter, muaj xws li lub tsev qiv ntawv Snowcast - qhov no yog ib qho kev siv ntawm Snowflake saum Hazelcast. Koj tuaj yeem saib nws ntawm no:
Kuv yuav tsum sau kuv tus kheej hloov siv 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);
}
Txhua yam ua haujlwm. Tom qab ntawd peb txiav txim siab los tsim qhov Performance index hauv Hazelcast los tshawb nrhiav los ntawm:
map.addIndex("subscriberId", false);
Thiab thaum sau ib qhov chaw tshiab, lawv pib tau txais ClassNotFoundException. Hazelcast sim ntxiv rau qhov ntsuas, tab sis tsis paub dab tsi txog peb cov chav kawm thiab xav tau JAR nrog cov chav kawm no kom muab rau nws. Peb ua li ntawd, txhua yam ua haujlwm, tab sis qhov teeb meem tshiab tshwm sim: yuav ua li cas hloov kho JAR yam tsis muaj kev txwv tag nrho? Hazelcast tsis tuaj yeem nqa JAR tshiab thaum lub sijhawm hloov kho node-by-node. Lub sijhawm no peb txiav txim siab tias peb tuaj yeem nyob yam tsis muaj kev tshawb nrhiav. Tom qab tag nrho, yog tias koj siv Hazelcast ua lub khw tseem ceeb, ces txhua yam yuav ua haujlwm? Tsis yog tiag. Ntawm no dua tus cwj pwm ntawm IMap thiab TransactionalMap txawv. Qhov twg IMap tsis quav ntsej, TransactionalMap cuam tshuam qhov yuam kev.