Njani kwaye kutheni sibhale inkonzo ephezulu yomthwalo onyukayo we-1C: Ishishini: iJava, iPostgreSQL, iHazelcast

Kweli nqaku siza kuthetha ngendlela kwaye kutheni siphuhlise Inkqubo yokunxibelelana -isixhobo esihambisa ulwazi phakathi kwezicelo zabaxhasi kunye ne-1C: iiseva zeShishini - ukusuka ekusetheni umsebenzi ukuya ekucingeni ngolwakhiwo kunye neenkcukacha zokuphunyezwa.

INkqubo yeNtsebenziswano (emva koku ekubhekiselwa kuyo njenge-SV) yinkqubo yokuthunyelwa kwemiyalezo esasaziweyo, enokunyamezela iimpazamo nonikezelo oluqinisekisiweyo. I-SV yenzelwe njengenkonzo yomthwalo ophezulu kunye ne-scalability ephezulu, ekhoyo zombini njengenkonzo ye-intanethi (ebonelelwe ngu-1C) kwaye njengemveliso eveliswa ngobuninzi enokuthi ifakwe kwiindawo zakho zeseva.

I-SV isebenzisa indawo yokugcina esasaziweyo ihazelcast kunye ne-injini yokukhangela Elasticsearch. Siza kuthetha ngeJava kunye nendlela esiyenza ngayo i-PostgreSQL.
Njani kwaye kutheni sibhale inkonzo ephezulu yomthwalo onyukayo we-1C: Ishishini: iJava, iPostgreSQL, iHazelcast

Џџ ѕЃ ° °

Ukwenza kucace ukuba kutheni sidale iNkqubo yokuSebenza, ndiya kukuxelela kancinci malunga nendlela uphuhliso lwezicelo zoshishino kwi-1C isebenza ngayo.

Ukuqala nje, kancinci ngathi kwabo bangekayazi into esiyenzayo :) Senza i-1C:Iqonga lobugcisa beShishini. Iqonga libandakanya isixhobo sophuhliso lwesicelo seshishini, kunye nexesha lokuqhuba elivumela ukuba izicelo zoshishino ziqhube kwindawo ephambanayo.

Iparadigm yophuhliso lomthengi womncedisi

Izicelo zoshishino ezenziwe kwi-1C: Ishishini lisebenza kwinqanaba lesithathu umxhasi-umncedisi i-architecture "i-DBMS - iseva yesicelo - umxhasi". Ikhowudi yesicelo ebhalwe kuyo eyakhelwe-ngaphakathi 1C ulwimi, inokuphunyezwa kumncedisi wesicelo okanye kumxhasi. Wonke umsebenzi kunye nezinto zesicelo (ii-directory, amaxwebhu, njl.), kunye nokufunda nokubhala i-database, yenziwa kuphela kumncedisi. Ukusebenza kweefom kunye nojongano lomyalelo lukwaphunyezwa kumncedisi. Umxhasi wenza ukufumana, ukuvula nokubonisa iifom, "ukunxibelelana" nomsebenzisi (izilumkiso, imibuzo ...), izibalo ezincinci kwiifom ezifuna impendulo ekhawulezayo (umzekelo, ukuphindaphinda ixabiso ngobuninzi), ukusebenza kunye neefayile zendawo, ukusebenza ngezixhobo.

Kwikhowudi yesicelo, iiheader zeenkqubo kunye nemisebenzi kufuneka zibonise ngokucacileyo apho ikhowudi iya kusetyenziswa khona - usebenzisa &AtClient / &AtServer imiyalelo (&AtClient / &AtServer kuguqulelo lwesiNgesi lolwimi). Abaphuhlisi be-1C ngoku baya kundilungisa ngokuthi izikhokelo ziyinyani ngaphezu, kodwa kuthi oku akubalulekanga ngoku.

Ungafowunela ikhowudi yeseva kwikhowudi yomxhasi, kodwa awukwazi ukufowunela ikhowudi yomxhasi kwikhowudi yeseva. Lo ngumda osisiseko esiwenze ngenxa yezizathu ezininzi. Ngokukodwa, kuba ikhowudi yomncedisi kufuneka ibhalwe ngendlela yokuba iphumeze ngendlela efanayo nokuba ibizwa phi - ukusuka kumxhasi okanye kumncedisi. Kwaye kwimeko yokufowunela ikhowudi yomncedisi ukusuka kwenye ikhowudi yeseva, akukho mxhasi onjalo. Kwaye ngenxa yokuba ngexesha lokwenziwa kwekhowudi yomncedisi, umxhasi oyibizileyo unokuvala, aphume kwisicelo, kwaye umncedisi akasayi kuba naye nabani na wokufowuna.

Njani kwaye kutheni sibhale inkonzo ephezulu yomthwalo onyukayo we-1C: Ishishini: iJava, iPostgreSQL, iHazelcast
Ikhowudi ephethe unqakrazo lweqhosha: ukubiza inkqubo yomncedisi ukusuka kumxhasi kuya kusebenza, ukubiza inkqubo yomxhasi kumncedisi ayiyi

Oku kuthetha ukuba ukuba sifuna ukuthumela umyalezo othile ovela kumncedisi kwisicelo somthengi, umzekelo, ukuba isizukulwana sengxelo "yexesha elide" siphelile kwaye ingxelo inokujongwa, asinayo indlela enjalo. Kufuneka usebenzise amaqhinga, umzekelo, rhoqo uvotele umncedisi kwikhowudi yomxhasi. Kodwa le ndlela ilayisha inkqubo ngeefowuni ezingeyomfuneko, kwaye ngokubanzi ayibukeki intle kakhulu.

Kwaye kukho nemfuneko, umzekelo, xa umnxeba ufika SIP- xa ufowuna, yazisa isicelo somxhasi malunga nale nto ukuze ikwazi ukusebenzisa inombolo yomnxeba ukuze uyifumane kwi-database ye-counterparty kwaye ubonise ulwazi lomsebenzisi malunga nomntu obizayo. Okanye, umzekelo, xa umyalelo ufika kwindawo yokugcina impahla, yazisa isicelo somthengi womthengi malunga noku. Ngokubanzi, kukho iimeko ezininzi apho indlela enjalo iya kuba luncedo.

Imveliso ngokwayo

Yenza indlela yokuthumela imiyalezo. Ukukhawuleza, okuthembekileyo, kunye nokuhanjiswa okuqinisekisiweyo, kunye nokukwazi ukukhangela imiyalezo ngokulula. Ngokusekwe kwindlela, phumeza umthunywa (imiyalezo, iifowuni zevidiyo) ezisebenza ngaphakathi kwezicelo ze-1C.

Yila isixokelelwano ukuba sibekwe ngokuthe tye. Umthwalo onyukayo kufuneka ugutyungelwe ngokunyusa inani leendawo zokuhlala.

Ukuphunyezwa

Sagqiba ekubeni singabandakanyi inxalenye yomncedisi we-SV ngokuthe ngqo kwi-1C: Iqonga leShishini, kodwa ukuyiphumeza njengemveliso eyahlukileyo, i-API engabizwa ngayo kwikhowudi yezisombululo zesicelo se-1C. Oku kwenziwa ngenxa yezizathu ezininzi, eyona nto iphambili kukuba ndifuna ukwenza ukuba kwenzeke ukutshintshiselana ngemiyalezo phakathi kwezicelo ezahlukeneyo ze-1C (umzekelo, phakathi koLawulo lwezoRhwebo kunye ne-Accounting). Izicelo ezahlukeneyo ze-1C zinokusebenza kwiinguqulelo ezahlukeneyo ze-1C: Iqonga leShishini, libekwe kumaseva ahlukeneyo, njl. Kwiimeko ezinjalo, ukuphunyezwa kwe-SV njengemveliso eyahlukileyo ebekwe "ecaleni" lofakelo lwe-1C isisombululo esona sisombululo.

Ke, sagqiba ekubeni senze i-SV njengemveliso eyahlukileyo. Sicebisa ukuba iinkampani ezincinci zisebenzise iseva ye-CB esiyifakileyo kwilifu lethu (wss://1cdialog.com) ukunqanda iindleko eziphezulu ezinxulumene nofakelo lwasekhaya kunye noqwalaselo lomncedisi. Abathengi abakhulu banokukufumanisa kucetyiswa ukuba bafakele iseva yabo ye-CB kwiindawo zabo. Sisebenzise indlela efanayo kwimveliso yethu yelifu ye-SaaS 1cEntsha -iveliswa njengemveliso eveliswe ngobuninzi ukuze kufakwe kwiindawo zabathengi, kwaye ifakwe kwilifu lethu. https://1cfresh.com/.

Isicelo

Ukusabalalisa umthwalo kunye nokunyamezela impazamo, asiyi kuhambisa isicelo esinye seJava, kodwa ezininzi, kunye ne-balancer yomthwalo phambi kwabo. Ukuba ufuna ukudlulisa umyalezo kwi-node ukuya kwindawo, sebenzisa ukupapasha / ukubhalisa kwiHazelcast.

Unxibelelwano phakathi komxhasi kunye nomncedisi kusetyenziswa i-websocket. Ifanelekile kwiinkqubo zexesha langempela.

I-cache esasaziweyo

Sakhetha phakathi kweRedis, iHazelcast kunye ne-Ehcache. Ngu-2015. URedis usandula ukukhupha iqela elitsha (entsha kakhulu, eyoyikisayo), kukho iSentinel enezithintelo ezininzi. I-Ehcache ayiyazi indlela yokudibanisa kwiqela (oku kusebenza kwavela kamva). Sigqibe kwelokuba sizame ngeHazelcast 3.4.
I-Hazelcast idityaniswe kwiqela ngaphandle kwebhokisi. Kwimowudi ye-node enye, ayiloncedo kakhulu kwaye ingasetyenziselwa kuphela njenge-cache - ayiyazi indlela yokulahla idatha kwidiski, ukuba ulahlekelwa yi-node kuphela, ulahlekelwa yidatha. Sithumela iiHazelcasts ezininzi, phakathi kwazo sigcina idatha ebalulekileyo. Asiyixhasi i-cache - asiyikhathazi loo nto.

Kuthi, iHazelcast yile:

  • Ukugcinwa kweeseshoni zabasebenzisi. Kuthatha ixesha elide ukuya kwi-database yeseshoni rhoqo, ngoko sibeka zonke iiseshoni kwi-Hazelcast.
  • Cache. Ukuba ujonge iprofayile yomsebenzisi, jonga i-cache. Ubhale umyalezo omtsha- uwubeke kwindawo yokugcina.
  • Izihloko zonxibelelwano phakathi kweemeko zesicelo. I-node ivelisa isiganeko kwaye isibeke kwisihloko se-Hazelcast. Ezinye iindawo zesicelo ezibhaliselwe kwesi sihloko zifumana kwaye ziqhube umsitho.
  • Izitshixo zeqela. Umzekelo, sidala ingxoxo sisebenzisa isitshixo esisodwa (ingxoxo ye-singleton ngaphakathi kwedatha ye-1C):

conversationKeyChecker.check("БЕНЗОКОЛОНКА");

      doInClusterLock("БЕНЗОКОЛОНКА", () -> {

          conversationKeyChecker.check("БЕНЗОКОЛОНКА");

          createChannel("БЕНЗОКОЛОНКА");
      });

Sijongile ukuba akukho tshaneli. Sathatha iqhaga, sayijonga kwakhona, kwaye sayidala. Ukuba awujongi isitshixo emva kokuthatha isitshixo, kukho ithuba lokuba omnye umsonto ujongiwe ngelo xesha kwaye ngoku uza kuzama ukwenza ingxoxo efanayo - kodwa sele ikhona. Awukwazi ukutshixa usebenzisa i-Java Tshixo ehambelanayo okanye eqhelekileyo. Ngedathabheyisi-iyacotha, kwaye lusizi lwesiseko sedatha; ngeHazelcast-yiloo nto oyifunayo.

Ukukhetha i-DBMS

Sinamava abanzi kwaye ayimpumelelo esebenza kunye nePostgreSQL kunye nokusebenzisana nabaphuhlisi bale DBMS.

Akulula ngeqela lePostgreSQL-likhona XL, XC, Citus, kodwa ngokubanzi ezi ayizizo ii-NoSQL ezikhupha ibhokisi. Asizange sithathe i-NoSQL njengeyona ndawo yokugcina; Kwakwanele ukuba sithathe i-Hazelcast, esingazange sisebenze nayo ngaphambili.

Ukuba ufuna ukulinganisa i-database yobudlelwane, oko kuthetha ukwahlulahlula. Njengoko uyazi, nge-sharding sahlula i-database ibe ngamacandelo ahlukeneyo ukuze ngamnye kubo abekwe kwiseva eyahlukileyo.

Inguqulelo yokuqala yokwahlulwa kwethu ithathe amandla okusasaza itafile nganye yesicelo sethu kuzo zonke iiseva ezahlukeneyo ngokwemilinganiselo eyahlukeneyo. Kukho imiyalezo emininzi kumncedisi A - nceda, masisuse inxalenye yale theyibhile siye kwi-server B. Esi sigqibo sivele sakhala malunga nokulungiswa kwangaphambi kwexesha, ngoko ke siye sagqiba ekubeni sinciphise indlela yokuqesha abantu abaninzi.

Unokufunda malunga nabaqashi abaninzi, umzekelo, kwiwebhusayithi Idatha yeCitus.

I-SV ineengcamango zesicelo kunye nomrhumi. Isicelo kufakelo oluthile lwesicelo seshishini, njenge-ERP okanye i-Akhawuntingi, kunye nabasebenzisi bayo kunye neenkcukacha zeshishini. Umrhumi ngumbutho okanye umntu isicelo esibhaliswe egameni lakhe kwiseva ye-SV. Umrhumi unokuba nezicelo ezininzi ezibhalisiweyo, kwaye ezi zicelo zinokutshintshiselana ngemiyalezo enye kwenye. Umbhalisi waba ngumqeshi kwinkqubo yethu. Imiyalezo evela kubabhalisi abaninzi inokufumaneka kwisiseko sedatha esinye somzimba; ukuba sibona ukuba umrhumi uqalise ukuvelisa i-traffic eninzi, siyihambisa kwisiseko sedatha esahlukileyo (okanye nakwiseva yedatha eyahlukileyo).

Sinesiseko sedatha esisiseko apho itheyibhile yomzila igcinwa kunye nolwazi malunga nendawo yazo zonke iinkcukacha zababhalisi.

Njani kwaye kutheni sibhale inkonzo ephezulu yomthwalo onyukayo we-1C: Ishishini: iJava, iPostgreSQL, iHazelcast

Ukuthintela i-database ephambili ekubeni yi-bottleneck, sigcina itafile yomzila (kunye nezinye iinkcukacha ezifunekayo rhoqo) kwi-cache.

Ukuba i-database yombhalisi iqala ukucotha, siya kuyinqunqa ibe yizahlulo ngaphakathi. Kwezinye iiprojekthi esizisebenzisayo pg_pathman.

Kuba ukuphulukana nemiyalezo yabasebenzisi kubi, sigcina uvimba weenkcukacha zethu ngeekopi. Udibaniso lwe-synchronous kunye ne-asynchronous replicas ikuvumela ukuba uzikhusele kwimeko yokulahlekelwa kwesiseko sedatha. Ilahleko yomyalezo iyakwenzeka kuphela ukuba isiseko sedatha esisiseko kunye ne-synchronous replica yayo ayiphumelelanga ngaxeshanye.

Ukuba i-synchronous replica ilahlekile, i-asynchronous replica iba yi-synchronous.
Ukuba i-database engundoqo ilahlekile, i-synchronous replica iba yi-database eyintloko, kwaye i-asynchronous replica iba yi-synchronous replica.

Elasticsearch yokukhangela

Ekubeni, phakathi kwezinye izinto, i-SV iphinde ibe ngumthunywa, ifuna ukukhangela okukhawulezayo, okufanelekileyo kunye nokuguquguqukayo, kuthathela ingqalelo i-morphology, usebenzisa imilinganiselo engacacanga. Sigqibe kwelokuba singaphindi sivelise ivili kwaye sisebenzise injini yokukhangela yasimahla i-Elasticsearch, eyenziwe ngokusekwe kwithala leencwadi Lukene. Siphinde sisebenzise i-Elasticsearch kwi-cluster (master - data - data) ukuphelisa iingxaki xa kwenzeka ukungaphumeleli kweenode zesicelo.

Kwi-github sifumene I-plugin ye-morphology yaseRashiya ye-Elasticsearch kwaye uyisebenzise. Kwisalathiso se-Elasticsearch sigcina iingcambu zamagama (apho iplagin imisela) kunye ne-N-grams. Njengoko umsebenzisi engena isicatshulwa ukukhangela, sijonga umbhalo ochwetheziweyo phakathi kwe-N-grams. Xa ligcinwe kwisalathiso, igama elithi “texts” liya kwahlulwa libe zezi N-grams zilandelayo:

[ezo, tek, tex, text, texts, ek, ex, ext, texts, ks, kst, ksty, st, sty, wena],

Yaye ingcambu yegama elithi “umbhalo” nayo iya kugcinwa. Le ndlela ikuvumela ukuba ukhangele ekuqaleni, phakathi, kwaye ekupheleni kwegama.

Umfanekiso omkhulu

Njani kwaye kutheni sibhale inkonzo ephezulu yomthwalo onyukayo we-1C: Ishishini: iJava, iPostgreSQL, iHazelcast
Phinda umfanekiso ukususela ekuqaleni kwenqaku, kodwa ngeengcaciso:

  • I-Balancer evezwe kwi-Intanethi; sine nginx, ingaba nayiphi na.
  • Iimeko zesicelo seJava zinxibelelana omnye nomnye ngeHazelcast.
  • Ukusebenza ngesokethi yewebhu esiyisebenzisayo Unetty.
  • Usetyenziso lweJava lubhalwe kwiJava 8 kwaye luqulathe iinyanda OSGi. Izicwangciso zibandakanya ukufudukela kwiJava 10 kunye nokutshintshela kwiimodyuli.

Uphuhliso novavanyo

Kwinkqubo yokuphuhlisa nokuvavanya i-SV, siye sadibana nenani leempawu ezinomdla kwiimveliso esizisebenzisayo.

Uvavanyo lomthwalo kunye nokuvuza kwememori

Ukukhutshwa kokukhutshwa kwe-SV nganye kubandakanya ukuvavanywa komthwalo. Iba yimpumelelo xa:

  • Uvavanyo lusebenze iintsuku ezininzi kwaye akukho kusilela kwenkonzo
  • Ixesha lokuphendula kwimisebenzi ephambili alidlulanga kumda okhululekileyo
  • Ukuwohloka komsebenzi xa kuthelekiswa nenguqulelo yangaphambili akukho ngaphezu kwe-10%

Sigcwalisa i-database yovavanyo ngedatha - ukwenza oku, sifumana ulwazi malunga nombhalisi osebenzayo kakhulu kwi-server yokuvelisa, siphindaphinda amanani ayo nge-5 (inani lemiyalezo, iingxoxo, abasebenzisi) kwaye uvavanye ngaloo ndlela.

Senza uvavanyo lomthwalo wenkqubo yokunxibelelana ngolungelelwaniso oluthathu:

  1. uvavanyo loxinzelelo
  2. Uqhagamshelo kuphela
  3. Ubhaliso lwababhalisile

Ngexesha lovavanyo loxinzelelo, siqalisa amakhulu aliqela imisonto, kwaye balayisha inkqubo ngaphandle kokuyeka: ukubhala imiyalezo, ukudala iingxoxo, ukufumana uluhlu lwemiyalezo. Silinganisa izenzo zabasebenzisi abaqhelekileyo (fumana uluhlu lwemiyalezo yam engafundwanga, bhalela umntu) kunye nezisombululo zesoftware (ukuhambisa ipakethe yoqwalaselo olwahlukileyo, qhuba isilumkiso).

Umzekelo, nantsi into ebonakala ngathi yovavanyo loxinzelelo:

  • Umsebenzisi ungena
    • Cela iingxoxo zakho ezingafundwanga
    • I-50% ilindeleke ukuba ifunde imiyalezo
    • I-50% ilindeleke ukuba ithumele itekisi
    • Umsebenzisi olandelayo:
      • Unethuba le-20% lokudala ingxoxo entsha
      • Ngokuzenzekelayo ukhetha nayiphi na iingxoxo zayo
      • Ingena ngaphakathi
      • Icela imiyalezo, iiprofayili zabasebenzisi
      • Yenza imiyalezo emihlanu ebhekiswe kubasebenzisi abangaqhelekanga kule ngxoxo
      • Ushiya ingxoxo
      • Uphinda amaxesha angama-20
      • Iloga ngaphandle, ibuyela ekuqaleni kweskripthi

    • I-chatbot ingena kwinkqubo (ilinganisa imiyalezo esuka kwikhowudi yesicelo)
      • Unethuba le-50% lokudala itshaneli entsha yokutshintshiselana kwedatha (ingxoxo ekhethekileyo)
      • I-50% ilindeleke ukuba ibhale umyalezo kuwo nawaphi na amajelo akhoyo

Imeko "yoQhagamshelwano Kuphela" ivele ngesizathu. Kukho imeko: abasebenzisi baqhagamshele inkqubo, kodwa abakabandakanyekanga. Umsebenzisi ngamnye uvula ikhomputha ngo-09:00 kusasa, useka uqhagamshelwano kumncedisi kwaye uhlala ethule. Aba bafana bayingozi, baninzi kubo - iipakethi kuphela abanazo i-PING / PONG, kodwa bagcina uxhulumaniso kumncedisi (abakwazi ukuwugcina - kuthekani ukuba kukho umyalezo omtsha). Uvavanyo luvelisa kwakhona imeko apho inani elikhulu labasebenzisi abanjalo lizama ukungena kwinkqubo kwisiqingatha seyure. Kuyafana novavanyo loxinzelelo, kodwa ugxininiso lwalo luchanekile kweli galelo lokuqala - ukuze kungabikho ukungaphumeleli (umntu akasebenzisi inkqubo, kwaye sele ewa - kunzima ukucinga ngento embi kakhulu).

Isikripthi sobhaliso sobhaliso siqala ukusuka kuphehlelelo lokuqala. Senze uvavanyo loxinzelelo kwaye siqinisekile ukuba inkqubo ayicothanga ngexesha lembalelwano. Kodwa abasebenzisi beza kwaye ubhaliso lwaqala ukusilela ngenxa yexesha. Xa sibhalisa sasisebenzisa / dev / engahleliwe, enxulumene ne-entropy yenkqubo. Umncedisi khange abenaxesha lokuqokelela i-entropy eyaneleyo kwaye xa i-SecureRandom entsha iceliwe, yaqina amashumi emizuzwana. Kukho iindlela ezininzi zokuphuma kule meko, umzekelo: tshintshela kwi-dev / urandom ekhuselekileyo, faka ibhodi ekhethekileyo eyenza i-entropy, uvelise amanani angabonakaliyo kwangaphambili kwaye uwagcine echibini. Siye savala okwethutyana ingxaki nge-pool, kodwa ukusukela ngoko besiqhuba uvavanyo olwahlukileyo lokubhalisa ababhalisile abatsha.

Sisebenzisa njengejenereyitha yomthwalo JMeter. Andazi ukuba kusetyenzwa njani nge-websocket; ifuna iplagi. Eyokuqala kwiziphumo zophendlo zombuzo othi "jmeter websocket" zezi: amanqaku avela kwiBlazeMeter, ecebisayo iplagin nguMaciej Zaleski.

Kulapho sagqiba ekubeni siqale khona.

Phantse kwangoko emva kokuqalisa uvavanyo olunzulu, safumanisa ukuba i-JMeter yaqala ukuvuza inkumbulo.

Iplagi libali elikhulu elahlukileyo; eneenkwenkwezi eziyi-176, ineefolokhwe ze-132 kwi-github. Umbhali ngokwakhe akazange azibophelele kuyo ukususela ngo-2015 (sayithatha kwi-2015, ngoko ayizange iphakamise ukukrokra), imiba emininzi ye-github malunga nokuvuza kweememori, izicelo ze-7 ezingavalwanga.
Ukuba uthatha isigqibo sokwenza uvavanyo lomthwalo usebenzisa le plugin, nceda uqaphele ezi ngxoxo zilandelayo:

  1. Kwindawo enemisonto emininzi, kwasetyenziswa i-LinkedList eqhelekileyo, kwaye umphumo waba NPE ngexesha lokusebenza. Oku kungasonjululwa ngokutshintshela kwi-ConcurrentLinkedDeque okanye ngeebhloko ezilungelelanisiweyo. Sizikhethele ukhetho lokuqala (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Ukuvuza kwememori; xa uqhawula, ulwazi loqhagamshelwano alucinywa (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. Kwimo yokusakaza (xa i-websocket ingavalwanga ekupheleni kwesampuli, kodwa isetyenziswe kamva kwisicwangciso), iipatheni zokuphendula azisebenzi (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

Le yenye yezo zikwi-github. Into esiyenzileyo:

  1. Uthathile ifolokhwe Elyran Kogan (@elyrank) - ilungisa iingxaki ze-1 kunye ne-3
  2. Isonjululwe ingxaki yesi-2
  3. Ijethi ehlaziyiweyo ukusuka ku-9.2.14 ukuya ku-9.3.12
  4. Isongelwe iSimpleDateFormat kwiThreadLocal; I-SimpleDateFormat ayikhuselekanga ngomsonto, nto leyo ekhokelele kwi-NPE ngexesha lokusebenza
  5. Kulungiswe enye inkumbulo evuzayo (unxibelelwano luvalwe gwenxa xa luqhawulwe)

Ukanti iyaqukuqela!

Inkumbulo yaqala ukuphela hayi ngosuku, kodwa ezimbini. Kwakungekho xesha liseleyo, ngoko ke sagqiba kwelokuba siqalise imicu embalwa, kodwa kwiiarhente ezine. Oku bekufanele ukuba kwanele iveki ubuncinane.

Zigqithile iintsuku ezimbini...

Ngoku iHazelcast iphelelwa yinkumbulo. Izigodo zibonise ukuba emva kweentsuku ezimbalwa zovavanyo, uHazelcast waqala ukukhalaza malunga nokungabikho kwememori, kwaye emva kwexesha elithile iqela lahlukana, kwaye iinqununu zaqhubeka zifa nganye nganye. Siqhagamshele i-JVisualVM kwi-hazelcast kwaye sabona "isarha ephumayo" - ibihlala ibizwa ngokuba yiGC, kodwa ayikwazanga ukucima imemori.

Njani kwaye kutheni sibhale inkonzo ephezulu yomthwalo onyukayo we-1C: Ishishini: iJava, iPostgreSQL, iHazelcast

Kwavela ukuba kwi-hazelcast 3.4, xa ucima imephu / imephu emininzi (map.destroy ()), imemori ayikhululwa ngokupheleleyo:

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

I-bug ngoku ilungiswe ku-3.5, kodwa yayiyingxaki emva koko. Senze iimephu ezininzi ezintsha ezinamagama aguqukayo kwaye sazicima ngokwengqiqo yethu. Ikhowudi yayijonge ngolu hlobo:

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();
    }
}

Fowuna:

service.join(auth1, "НОВЫЕ_СООБЩЕНИЯ_В_ОБСУЖДЕНИИ_UUID1");
service.join(auth2, "НОВЫЕ_СООБЩЕНИЯ_В_ОБСУЖДЕНИИ_UUID1");

I-multiMap yenzelwe umrhumo ngamnye kwaye yacinywa xa ibingafuneki. Sigqibe ekubeni sizakuqala iMaphu , isitshixo siya kuba ligama lomrhumo, kwaye amaxabiso aya kuba ngabachongi beseshoni (apho unokufumana kuzo izichazi zabasebenzisi, ukuba kuyimfuneko).

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

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

Iitshathi ziphucukile.

Njani kwaye kutheni sibhale inkonzo ephezulu yomthwalo onyukayo we-1C: Ishishini: iJava, iPostgreSQL, iHazelcast

Yintoni enye esiyifundileyo malunga nokuvavanywa komthwalo?

  1. I-JSR223 kufuneka ibhalwe kwi-groovy kwaye ibandakanye i-cache yokuqokelela-ikhawuleza kakhulu. Imbekiselo.
  2. Iigrafu ze-Jmeter-Plugins kulula ukuyiqonda kunezo eziqhelekileyo. Imbekiselo.

Malunga namava ethu neHazelcast

I-Hazelcast yayiyimveliso entsha kuthi, saqala ukusebenza nayo kwi-version 3.4.1, ngoku iseva yethu yokuvelisa i-version 3.9.2 (ngexesha lokubhala, inguqulo yakamuva ye-Hazelcast yi-3.10).

Ukuveliswa kwesazisi

Siqale ngezichongi ezipheleleyo. Masicinge ukuba sifuna elinye ixesha elide lequmrhu elitsha. Ukulandelelana kwidathabheyisi ayifanelekanga, iitafile zibandakanyeka kwi-sharding - kuvela ukuba kukho i-ID yomyalezo = 1 kwi-DB1 kunye ne-ID yomyalezo = 1 kwi-DB2, awukwazi ukubeka le ID kwi-Elasticsearch, okanye kwi-Hazelcast , kodwa eyona nto imbi kakhulu ukuba ufuna ukudibanisa idatha esuka kwiinkcukacha ezimbini zibe enye (umzekelo, ukugqiba ukuba enye isiseko sedatha yanele kwaba babhalisi). Unokongeza ii-AtomicLong ezininzi kwi-Hazelcast kwaye ugcine ikhawuntara apho, emva koko ukusebenza kokufumana isazisi esitsha kukunyukaAndGet kunye nexesha lesicelo kwi-Hazelcast. Kodwa iHazelcast inento ilunge ngakumbi-iFlakeIdGenerator. Xa uqhagamshelana nomxhasi ngamnye, banikwa uluhlu lwe-ID, umzekelo, owokuqala - ukusuka kwi-1 ukuya kwi-10, okwesibini - ukusuka kwi-000 ukuya kwi-10, njalo njalo. Ngoku umxhasi unokukhupha izichongi ezintsha ngokwakhe de uluhlu olukhutshelweyo luphele. Isebenza ngokukhawuleza, kodwa xa uqala kwakhona isicelo (kunye nomxhasi weHazelcast) ulandelelwano olutsha luqala - kungoko ukutsiba, njl. Ukongeza, abaphuhlisi abaqondi kakuhle ukuba kutheni ii-ID ziphelele, kodwa azingqinelani. Silinganise yonke into kwaye satshintshela kwii-UUIDs.

Ngendlela, kwabo bafuna ukufana ne-Twitter, kukho ithala leencwadi le-Snowcast - oku kukuphunyezwa kwe-Snowflake phezulu kwe-Hazelcast. Ungayibukela apha:

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

Kodwa asikafiki kuyo kwakhona.

TransactionalMap.replace

Enye into eyothusayo: TransactionalMap.replace ayisebenzi. Nalu uvavanyo:

@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

Kwafuneka ndibhale indawo yam ndisebenzisa i-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);
}

Uvavanya kuphela izakhiwo zedatha eziqhelekileyo, kodwa kunye neenguqulelo zabo zentengiselwano. Kuyenzeka ukuba i-IMap isebenze, kodwa iTransactionalMap ayisekho.

Faka i-JAR entsha ngaphandle kwexesha lokuphumla

Okokuqala, sagqiba ekubeni sirekhode izinto zeeklasi zethu eHazelcast. Umzekelo, sineklasi yeSicelo, sifuna ukuyigcina kwaye siyifunde. Gcina:

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

Sifunda:

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

Yonke into iyasebenza. Emva koko siye sagqiba ekubeni sakhe isalathiso eHazelcast ukukhangela ngo:

map.addIndex("subscriberId", false);

Kwaye xa ubhala iziko elitsha, baqala ukufumana iClassNotFoundException. I-Hazelcast izamile ukongeza kwisalathiso, kodwa yayingazi nto malunga neklasi yethu kwaye yayifuna ukuba i-JAR enale klasi inikwe kuyo. Senze oko, yonke into yasebenza, kodwa kwavela ingxaki entsha: indlela yokuhlaziya i-JAR ngaphandle kokumisa ngokupheleleyo iqela? I-Hazelcast ayiyithathi i-JAR entsha ngexesha lohlaziyo lwe-node-by-node. Ngeli xesha sagqiba ekubeni siphile ngaphandle kokukhangela isalathisi. Emva kwayo yonke loo nto, ukuba usebenzisa iHazelcast njengevenkile yexabiso eliphambili, yonke into iya kusebenza? Hayi ncma. Apha kwakhona ukuziphatha kwe-IMap kunye neTransactionalMap yahlukile. Apho i-IMap ingakhathaliyo, iTransactionalMap iphosa impazamo.

IMap. Sibhala izinto ezingama-5000, sizifunde. Yonke into ilindelekile.

@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());
    }
}

Kodwa ayisebenzi kwintengiselwano, sifumana iClassNotFoundException:

@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();
        }
    });
}

Kwi-3.8, i-User Class Deployment mechanism yavela. Unokukhetha i-master node enye kwaye uhlaziye ifayile ye-JAR kuyo.

Ngoku siyitshintshe ngokupheleleyo indlela yethu: sizenzele ngokwethu kwi-JSON kwaye siyigcine eHazelcast. I-Hazelcast ayifuni ukwazi ubume beeklasi zethu, kwaye sinokuhlaziya ngaphandle kwexesha lokuphumla. Uguqulelo lwezinto zesizinda kulawulwa sisicelo. Iinguqulelo ezahlukeneyo zesicelo zinokusebenza ngexesha elinye, kwaye imeko inokwenzeka xa isicelo esitsha sibhala izinto ezinemihlaba emitsha, kodwa endala ayikazi malunga nale mihlaba. Kwaye kwangaxeshanye, isicelo esitsha sifunda izinto ezibhalwe sisicelo esidala esingenawo amasimi amatsha. Sijongana neemeko ezinjalo ngaphakathi kwesicelo, kodwa ukwenza lula asitshintshi okanye sicima amasimi, sandisa kuphela iiklasi ngokongeza iindawo ezintsha.

Siqinisekisa njani ukusebenza okuphezulu

Iihambo ezine ukuya eHazelcast - zilungile, ezimbini kwisiseko sedatha - zimbi

Ukuya kwi-cache yedatha ihlala ingcono kunokuya kwi-database, kodwa awufuni ukugcina iirekhodi ezingasetyenziswanga nokuba. Sishiya isigqibo malunga nokuba yeyiphi i-cache kude kube kwinqanaba lokugqibela lophuhliso. Xa umsebenzi omtsha ufakwe ikhowudi, sivula ukungena kuyo yonke imibuzo kwi-PostgreSQL (log_min_duration_statement ukuya ku-0) kwaye siqhube uvavanyo lomthwalo wemizuzu ye-20. Ukusebenzisa iilogi eziqokelelweyo, izinto eziluncedo ezifana ne-pgFouine kunye ne-pgBadger inokwakha iingxelo zokuhlalutya. Kwiingxelo, sijonge ikakhulu imibuzo ecothayo kwaye rhoqo. Kwimibuzo ecothayo, sakha isicwangciso sophumezo (CHAZA) kwaye sivavanye ukuba loo mbuzo unokukhawuleziswa. Izicelo zarhoqo zedatha yegalelo elifanayo zingena kakuhle kwi-cache. Sizama ukugcina imibuzo "flat", itheyibhile enye ngombuzo ngamnye.

Ukusebenza

I-SV njengenkonzo ye-intanethi yafakwa ekusebenzeni entwasahlobo ka-2017, kwaye njengemveliso eyahlukileyo, i-SV yakhululwa ngoNovemba 2017 (ngelo xesha kwi-beta version status).

Ngaphezulu konyaka wokusebenza, akuzange kubekho iingxaki ezinzulu ekusebenzeni kwenkonzo ye-intanethi ye-CB. Sibeka iliso kwinkonzo ye-intanethi nge Zabbix, qokelela kwaye usasaze ukusuka Bamboo.

Unikezelo lweseva ye-SV lunikezelwa ngohlobo lweepakethe zalapha: RPM, DEB, MSI. Ukongeza kwiWindows sibonelela ngesifakeli esinye ngohlobo lwe-EXE enye efaka iseva, iHazelcast kunye ne-Elasticsearch kumatshini omnye. Siqale sabhekisa kolu guqulelo lofakelo njengenguqulelo “yedemo”, kodwa ngoku kuye kwacaca ukuba le yeyona ndlela idumileyo yokusasaza.

umthombo: www.habr.com

Yongeza izimvo