Sei uye nei takanyora yakakwira-mutoro scalable sevhisi ye1C: Enterprise: Java, PostgreSQL, Hazelcast

Muchinyorwa chino tichataura pamusoro pekuti sei uye nei takagadzira Kudyidzana System -muchina unoendesa ruzivo pakati pemashandisirwo evatengi uye 1C:Enterprise maseva - kubva kumisikidza basa kuenda pakufunga kuburikidza nekuvaka uye kuita ruzivo.

Iyo Interaction System (inozonzi SV) inzira yakagoverwa, inoshivirira meseji ine vimbiso yekutumira. SV yakagadzirirwa sevhisi yepamusoro-soro ine yakakwira scalability, inowanikwa zvese sevhisi yepamhepo (yakapihwa ne1C) uye seyakagadzirwa-yakagadzirwa chigadzirwa chinogona kuisirwa pane yako wega server zvivakwa.

SV inoshandisa kuchengetedza kwakagoverwa hazelcast uye injini yekutsvaga Elasticsearch. Tichazotaurawo nezveJava uye nemabatiro atinoita kuyera PostgreSQL.
Sei uye nei takanyora yakakwira-mutoro scalable sevhisi ye1C: Enterprise: Java, PostgreSQL, Hazelcast

Kugadzirwa kwedambudziko

Kuti zvijeke kuti sei takagadzira Interaction System, ini ndichakuudza zvishoma nezve kuvandudzwa kwebhizinesi maapplication mu1C inoshanda.

Kutanga, zvishoma nezvedu kune avo vasati vaziva zvatinoita :) Tiri kugadzira iyo 1C:Enterprise tekinoroji chikuva. Iyi puratifomu inosanganisira chishandiso chekusimudzira bhizinesi rekushandisa, pamwe chete nenguva yekumhanya inobvumira bhizinesi kunyorera kuti rifambe munzvimbo yakachinjika.

Mutengi-server yekuvandudza paradigm

Bhizinesi maapplication akagadzirwa pa1C: Bhizinesi rinoshanda mune matatu-nhanho client-server architecture "DBMS - application server - client". Kodhi yekushandisa yakanyorwa mukati yakavakirwa-mukati 1C mutauro, inogona kuurayiwa pane application server kana pane mutengi. Yese inoshanda nezvinhu zvekushandisa (dhairekitori, magwaro, nezvimwewo), pamwe nekuverenga nekunyora dhatabhesi, inoitwa chete pane sevha. Iko kushanda kwemafomu uye yekuraira interface kunoitwa zvakare pane server. Mutengi anoita kugamuchira, kuvhura uye kuratidza mafomu, "kutaurirana" nemushandisi (yambiro, mibvunzo ...), kuverenga kudiki mumafomu anoda mhinduro nekukurumidza (semuenzaniso, kuwedzera mutengo nehuwandu), kushanda nemafaira emunharaunda, kushanda nemidziyo.

Mune kodhi yekushandisa, misoro yemaitirwo nemabasa inofanirwa kuratidza pachena kuti kodhi ichaitwa kupi - uchishandisa iyo &AtClient / &AtServer mirairo (&AtClient / &AtServer mushanduro yeChirungu yemutauro). Vagadziri ve1C vanozondigadzirisa nekutaura kuti mirairo ndeyechokwadi kupfuura, asi kwatiri izvi hazvina kukosha iye zvino.

Iwe unogona kufonera sevha kodhi kubva kune mutengi kodhi, asi haugone kufonera kodhi yemutengi kubva kune server kodhi. Uku ndiko kudzikisira kwatakaita nekuda kwezvikonzero zvakawanda. Kunyanya, nekuti server kodhi inofanirwa kunyorwa nenzira yekuti inoita nenzira imwechete zvisinei kuti inodaidzwa kupi - kubva kumutengi kana kubva kune server. Uye kana iri nyaya yekufonera server kodhi kubva kune imwe sevha kodhi, hapana mutengi akadaro. Uye nekuti panguva yekuitwa kwesevha kodhi, mutengi akaidaidza anogona kuvhara, kubuda muapp, uye sevha haichazove nemunhu wekufona.

Sei uye nei takanyora yakakwira-mutoro scalable sevhisi ye1C: Enterprise: Java, PostgreSQL, Hazelcast
Kodhi inobata bhatani kudzvanya: kudaidza sevha nzira kubva kumutengi ichashanda, kudana maitiro emutengi kubva kuseva hazviite

Izvi zvinoreva kuti kana isu tichida kutumira imwe meseji kubva kuseva kuenda kune mutengi application, semuenzaniso, kuti chizvarwa che "refu-runomhanya" mushumo wapera uye mushumo unogona kutariswa, isu hatina nzira yakadaro. Iwe unofanirwa kushandisa maitiro, semuenzaniso, nguva nenguva vhota sevha kubva kune kodhi yemutengi. Asi nzira iyi inoremedza sisitimu nekufona kusingakoshi, uye kazhinji haina kutaridzika zvakanyanya.

Uye panewo kudiwa, semuenzaniso, kana foni yasvika sveta- Paunenge uchifona, zivisa mutengi application nezve izvi kuitira kuti ashandise nhamba yeanofona kuti aiwane mudhipatimendi remumwe uye kuratidza ruzivo rwemushandisi nezvemumwe wekufona. Kana, semuenzaniso, kana odha yasvika panzvimbo inochengeterwa zvinhu, zivisa mutengi chikumbiro chemutengi nezve izvi. Kazhinji, pane dzakawanda zviitiko apo nzira yakadaro inogona kubatsira.

Kugadzirwa pachako

Gadzira nzira yekutumira mameseji. Inokurumidza, yakavimbika, ine yakavimbiswa kutumirwa, nekugona kuchinjika kutsvaga mameseji. Zvichienderana nemashini, shandisa mutumwa (mameseji, vhidhiyo mafoni) anomhanya mukati me1C application.

Gadzira sisitimu kuti ive yakatwasuka. Mutoro unowedzera unofanirwa kuvharwa nekuwedzera nhamba yemanodhi.

Kutevedzera

Isu takasarudza kusabatanidza sevha chikamu cheSV zvakananga mu1C: Bhizinesi papuratifomu, asi kuti tiite sechigadzirwa chakasiyana, iyo API yayo inogona kudanwa kubva kukodhi ye1C application mhinduro. Izvi zvakaitwa nekuda kwezvikonzero zvakati, chikuru chaive chekuti ndaida kuita kuti zvikwanise kuchinjana mameseji pakati peakasiyana 1C zvikumbiro (semuenzaniso, pakati peTrade Management uye Accounting). Yakasiyana 1C mashandisirwo anogona kumhanya pane akasiyana vhezheni ye1C: Enterprise chikuva, kuwanikwa pamaseva akasiyana, nezvimwe. Mumamiriro ezvinhu akadaro, kuiswa kweSV sechigadzirwa chakasiyana chiri "padivi" che1C yekumisikidza ndiyo mhinduro yakakwana.

Saka, takasarudza kugadzira SV sechigadzirwa chakasiyana. Isu tinokurudzira kuti makambani madiki ashandise sevha yeCB yatakaisa mugore redu (wss://1cdialog.com) kudzivirira mutengo wepamusoro une chekuita nekuiswa kwenzvimbo uye kumisikidzwa kweseva. Vatengi vakakura vanogona kuwana zvine mutsindo kuisa yavo CB server panzvimbo dzavo. Isu takashandisa nzira yakafanana mune yedu gore SaaS chigadzirwa 1cFresh - inogadzirwa seyakagadzirwa-yakagadzirwa chigadzirwa kuti igadzirwe panzvimbo dzevatengi, uye zvakare inoiswa mugore redu. https://1cfresh.com/.

Kushanda

Kuti tigovane mutoro uye kukanganisa kushivirira, isu hatizoendesa kwete imwe Java application, asi yakati wandei, ine muyero wemutoro pamberi pavo. Kana iwe uchida kuendesa meseji kubva kunode kuenda kune node, shandisa kuburitsa / kunyorera muHazelcast.

Kukurukurirana pakati pemutengi neserver kuri kuburikidza newebhu. Yakanyatsokodzera kune chaiyo-nguva masisitimu.

Yakagoverwa cache

Isu takasarudza pakati peRedis, Hazelcast neEhcache. Ndi2015. Redis ichangoburitsa sumbu nyowani (yakanyanya nyowani, inotyisa), kune Sentinel ine zvakawanda zvinorambidzwa. Ehcache haizive kuungana kuita sumbu (ichi chiitiko chakazoonekwa gare gare). Takafunga kuzviedza neHazelcast 3.4.
Hazelcast inounganidzwa kuita sumbu kunze kwebhokisi. Mune imwechete node mode, haina kunyanya kubatsira uye inogona kungoshandiswa se cache - haizive nzira yekurasa data kune dhisiki, kana iwe ukarasikirwa chete node, iwe unorasikirwa nedata. Isu tinotumira akati wandei maHazelcasts, pakati pawo isu tinochengetedza data yakakosha. Isu hatitsigire cache - isu hatinetseke nazvo.

Kwatiri, Hazelcast ndeye:

  • Kuchengetwa kwezvikamu zvevashandisi. Zvinotora nguva yakareba kuenda kune dhatabhesi yechikamu nguva dzese, saka tinoisa ese masesheni muHazelcast.
  • Cache. Kana iwe uchitsvaga chimiro chemushandisi, tarisa cache. Akanyora meseji nyowani - isa mu cache.
  • Misoro yekukurukurirana pakati pezviitiko zvekushandisa. Iyo node inogadzira chiitiko uye inoiisa mumusoro weHazelcast. Mamwe maapplication node akanyoreswa kune iyi musoro gamuchira uye kugadzirisa chiitiko.
  • Cluster Locks. Semuyenzaniso, isu tinogadzira nhaurirano tichishandisa yakasarudzika kiyi (kutaurirana kune imwe chete mukati meiyo 1C dhatabhesi):

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

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

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

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

Takatarisa kuti hapana channel. Takatora kukiya, tikaitarisa zvakare, uye tikaigadzira. Kana ukasatarisa kukiyiwa mushure mekutora kiyi, saka pane mukana wekuti imwe tambo yakatariswawo panguva iyoyo uye ikozvino ichaedza kugadzira iyo nhaurirano imwechete - asi yatovepo. Iwe haugone kukiya uchishandisa yakawiriraniswa kana yakajairwa java Lock. Kuburikidza nedhatabhesi - inononoka, uye itsitsi kune dhatabhesi; kuburikidza neHazelcast - ndizvo zvaunoda.

Kusarudza DBMS

Tine ruzivo rwakakura uye rwakabudirira kushanda nePostgreSQL uye nekubatana nevagadziri veiyi DBMS.

Hazvisi nyore nePostgreSQL cluster - iripo XL, XC, Citus, asi kazhinji aya haasi maNoSQL anokwira kunze kwebhokisi. Isu hatina kuona NoSQL seyo huru yekuchengetera; zvaive zvakakwana kuti takatora Hazelcast, yatakanga tisina kushanda nayo kare.

Kana iwe uchida kuyera dhatabhesi rehukama, zvinoreva sharding. Sezvaunoziva, ne sharding tinoparadzanisa dhatabhesi muzvikamu zvakasiyana kuitira kuti imwe neimwe yadzo iiswe pane imwe sevha.

Yekutanga vhezheni yesharding yedu yakafungidzira kugona kugovera yega yega matafura echishandiso chedu pamaseva akasiyana muzvikamu zvakasiyana. Pane mameseji akawanda paserver A - ndapota, ngatifambise chikamu chetafura iyi kune server B. Iyi sarudzo yakangopopota nezve premature optimization, saka takasarudza kuzviganhurira kune akawanda-anoroja maitiro.

Iwe unogona kuverenga pamusoro pevazhinji-vanoroja, semuenzaniso, pawebhusaiti Citus Data.

SV ine pfungwa dzekushandisa uye munyoreri. Chikumbiro kuisirwa kwacho kwebhizinesi application, senge ERP kana Accounting, nevashandisi vayo uye data rebhizinesi. Munyoreri isangano kana munhu anomiririra iyo application yakanyoreswa muSV server. Munyoreri anogona kuve akati wandei akanyoreswa, uye aya maapplication anogona kuchinjana mameseji nemumwe. Munyoreri akava muroja muhurongwa hwedu. Mameseji kubva kune akati wandei vanyoreri anogona kuwanikwa mune imwe yenyama dhatabhesi; kana tikaona kuti munyoreri atanga kugadzira traffic yakawanda, tinoiendesa kune yakaparadzana yenyama dhatabhesi (kana kunyange yakaparadzana dhatabhesi server).

Isu tine dhatabhesi huru apo tafura yenzira inochengetwa ine ruzivo nezve nzvimbo yevose vanonyoresa dhatabhesi.

Sei uye nei takanyora yakakwira-mutoro scalable sevhisi ye1C: Enterprise: Java, PostgreSQL, Hazelcast

Kuti tidzivise dhatabhesi huru kubva pakuva bhodhoro, tinochengeta tafura yekufambisa (uye imwe data inowanzodiwa) mune cache.

Kana dhatabhesi yemunyoreri ikatanga kudzikira, tinoicheka kuita zvikamu mukati. Pane mamwe mapurojekiti atinoshandisa pg_pathman.

Sezvo kurasikirwa nemameseji emushandisi kwakaipa, isu tinochengetedza dhatabhesi yedu ine replicas. Iko kusanganiswa kweiyo synchronous uye asynchronous replicas inokutendera iwe kuti uzvichengete iwe pachako kana uchinge warasikirwa neiyo huru dhatabhesi. Kurasikirwa kwemeseji kunongoitika chete kana iyo yekutanga dhatabhesi uye yayo synchronous replica ikatadza panguva imwe chete.

Kana chifananidzi chekuenzanisa chikarasika, iyo asynchronous replica inova yakaenzana.
Kana iyo huru dhatabhesi yakarasika, iyo synchronous replica inova iyo huru dhatabhesi, uye iyo asynchronous replica inova inofananidzwa replica.

Elasticsearch yekutsvaga

Sezvo, pakati pezvimwe zvinhu, SV iriwo mutumwa, inoda kutsvaga nekukurumidza, kuri nyore uye kuchinjika, uchifunga nezve morphology, uchishandisa machisi asina kujeka. Isu takasarudza kusadzosera vhiri uye kushandisa yemahara yekutsvaga injini Elasticsearch, yakagadzirwa zvichibva paraibhurari Lucene. Isu tinotumirawo Elasticsearch musumbu (tenzi - data - data) kubvisa matambudziko kana paine kutadza kwekushandisa node.

Pa github takawana Russian morphology plugin yeElasticsearch uye ishandise. MuElasticsearch index tinochengeta midzi yezwi (inotemerwa neplugin) uye N-giramu. Sezvo mushandisi anopinda mavara kuti atsvage, isu tinotsvaga mavara akataipa pakati peN-grams. Kana yachengetwa kune index, izwi rekuti "zvinyorwa" richakamurwa kuita maN-giramu anotevera:

[izvo, tek, tex, zvinyorwa, zvinyorwa, ek, ex, ext, zvinyorwa, ks, kst, ksty, st, sty, iwe],

Uye mudzi weshoko rokuti “rugwaro” uchachengetwawo. Iyi nzira inokubvumira kutsvaga pakutanga, pakati, uye pakuguma kwezwi.

Mufananidzo mukuru

Sei uye nei takanyora yakakwira-mutoro scalable sevhisi ye1C: Enterprise: Java, PostgreSQL, Hazelcast
Dzokorora mufananidzo kubva pakutanga kwechinyorwa, asi netsananguro:

  • Balancer yakafumurwa paInternet; tine nginx, inogona kuva chero.
  • Java application zviitiko zvinotaurirana nemumwe kuburikidza neHazelcast.
  • Kushanda newebhu socket yatinoshandisa Netty.
  • Iyo Java application yakanyorwa muJava 8 uye ine masumbu OSGi. Zvirongwa izvi zvinosanganisira kutamira kuJava 10 uye shanduko kumamodule.

Kubudirira uye kuedza

Mukugadzirisa uye kuyedza iyo SV, takawana akati wandei anonakidza maficha ezvigadzirwa zvatinoshandisa.

Kuyedzwa kwemutoro uye kudonha kwendangariro

Kuburitswa kwekuburitswa kweSV yega yega kunosanganisira kuyedzwa kwemutoro. Inobudirira kana:

  • Muedzo wakashanda kwemazuva akati kuti uye pakanga pasina kukundikana kwebasa
  • Nguva yekupindura yemabasa akakosha haina kudarika chikumbaridzo chakasununguka
  • Kuderera kwekuita kana kuenzaniswa neshanduro yapfuura hakuna kupfuura 10%

Isu tinozadza dhatabhesi yebvunzo nedata - kuti tiite izvi, tinogashira ruzivo nezve anonyanya kunyorera munyoreri kubva kune yekugadzira server, kuwedzera nhamba dzayo ne5 (nhamba yemeseji, nhaurirano, vashandisi) uye kuyedza nenzira iyoyo.

Isu tinoita kuyedzwa kwemutoro weiyo yekudyidzana system mune matatu masisitimu:

  1. stress test
  2. Zvisungo chete
  3. Subscriber kunyoresa

Munguva yekuyedzwa kwekushushikana, tinovhura mazana akati wandei, uye ivo vanoisa sisitimu vasingamire: kunyora mameseji, kugadzira nhaurirano, kugamuchira runyoro rwemashoko. Isu tinotevedzera zviito zvevashandisiwo zvavo (tora runyoro rwemameseji angu asina kuverengwa, nyorera kune mumwe munhu) uye software mhinduro (endesa pasuru yeimwe gadziriso, gadzira yambiro).

Semuenzaniso, ichi ndicho chikamu cheyedzo yekushushikana inotaridzika senge:

  • Mushandisi anopinda
    • Inokumbira hurukuro dzako dzisina kuverengwa
    • 50% inogona kuverenga mameseji
    • 50% inogona kutumira mameseji
    • Mushandisi anotevera:
      • Ane 20% mukana wekugadzira nhaurirano itsva
      • Anosarudza chero ipi zvayo hurukuro dzayo
      • Inopinda mukati
      • Inokumbira mameseji, profiles yemushandisi
      • Inogadzira mameseji mashanu anonyorerwa kune vanongoshandisa kubva munhaurirano iyi
      • Inosiya nhaurirano
      • Inodzokorora ka20
      • Logi kunze, inodzokera kumashure kwekutanga script

    • Chatbot inopinda muhurongwa (inoteedzera mameseji kubva kukodhi yekushandisa)
      • Ane 50% mukana wekugadzira chiteshi chitsva chekuchinjana data (yakakosha nhaurirano)
      • 50% ingangonyora meseji kune chero chiteshi chiripo

Iyo "Connections Chete" scenario yakaonekwa nechikonzero. Pane mamiriro ezvinhu: vashandisi vakabatanidza sisitimu, asi havasati vabatanidzirwa. Wese mushandisi anobatidza komputa na09:00 mangwanani, anomisikidza chinongedzo kune server uye anoramba akanyarara. Ava vakomana vane njodzi, kune mazhinji acho - iwo ega mapakeji avanawo iPING / PONG, asi vanochengeta chinongedzo kune server (havagone kuzvichengeta - ko kana paine meseji nyowani). Muedzo unobereka mamiriro ezvinhu apo nhamba huru yevashandisi vakadaro vanoedza kupinda muhurongwa muhafu yeawa. Izvo zvakafanana nekuedzwa kwekunetseka, asi kutarisa kwaro kunonyatso kupinza iyi yekutanga - kuitira kuti pasave nekukundikana (munhu haashandisi system, uye inotodonha - zvakaoma kufunga nezve chimwe chinhu chakaipisisa).

Munyoreri kunyoresa script anotanga kubva kutanga kutanga. Takaita bvunzo yekushushikana uye takave nechokwadi chekuti sisitimu haina kunonoka panguva yetsamba. Asi vashandisi vakauya uye kunyoreswa kwakatanga kutadza nekuda kwekufamba kwenguva. Pakunyoresa takashandisa / dev / random, iyo inoenderana neiyo entropy yehurongwa. Sevha yanga isina nguva yekuunganidza yakakwana entropy uye payakakumbirwa SecureRandom nyowani, yakamira kwemasekonzi gumi. Kune nzira dzakawanda dzekubuda mumamiriro ezvinhu aya, semuenzaniso: chinja kune isina kuchengetedzeka / dev / urandom, isa bhodhi rakakosha rinogadzira entropy, gadzira nhamba dzisiri mberi uye udzichengete mudziva. Isu takavhara dambudziko kwenguva pfupi nedziva, asi kubva ipapo tanga tichiita bvunzo yakaparadzana yekunyoresa vanyoreri vatsva.

Isu tinoshandisa semutoro jenareta JMeter. Iyo haizive kushanda newebhu socket; inoda plugin. Yekutanga mumibairo yekutsvaga yemubvunzo "jmeter websocket" ndeiyi: zvinyorwa kubva kuBlazeMeter, izvo zvinokurudzira plugin naMaciej Zaleski.

Ndiko kwatakafunga kutangira.

Nguva pfupi mushure mekutanga kuyedzwa kwakakomba, takaona kuti JMeter yakatanga kudonha ndangariro.

Iyo plugin inyaya hombe yakaparadzana; ine 176 nyeredzi, ine 132 forogo pagithub. Munyori pachake haana kuzvipira kwazviri kubvira 2015 (takazvitora muna 2015, saka hazvina kumutsa fungidziro), akati wandei github nyaya dzine chekuita nekudonha kwendangariro, 7 isina kuvharwa zvikumbiro zvekudhonza.
Kana ukafunga kuita bvunzo dzemutoro uchishandisa iyi plugin, ndapota teerera kune dzinotevera nhaurirano:

  1. Munzvimbo ine tambo dzakawanda, yakajairwa LinkedList yakashandiswa, uye mhedzisiro yaive NPE munguva yekumhanya. Izvi zvinogona kugadziriswa nekuchinjira kuConcurrentLinkedDeque kana nemabhuroko akawiriraniswa. Isu takazvisarudzira sarudzo yekutanga (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Memory leak; kana ichibvisa, ruzivo rwekubatanidza haruna kubviswa (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. Mukutepfenyura modhi (apo iyo websocket isina kuvharwa pakupera kwemuenzaniso, asi inoshandiswa gare gare muchirongwa), maitiro ekupindura haashande (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

Iyi ndeimwe yeaya ari pagithub. Zvatakaita:

  1. Watora fork Elyran Kogan (@elyrank) - inogadzirisa matambudziko 1 uye 3
  2. Yakagadziriswa dambudziko 2
  3. Yakagadziridzwa jetty kubva 9.2.14 kusvika 9.3.12
  4. Yakaputirwa SimpleDateFormat muThreadLocal; SimpleDateFormat haina tambo-yakachengeteka, iyo yakatungamira kuNPE panguva yekumhanya
  5. Yakagadzirisa imwe memory leak (iyo yekubatanidza yakavharwa zvisizvo payakabviswa)

Uye zvakadaro inoyerera!

Memory yakatanga kupera kwete muzuva rimwe chete, asi maviri. Pakanga pasisina nguva zvachose, saka takafunga kuvhura tambo shoma, asi pavamiririri vana. Izvi zvaifanira kunge zvakakwana kweinenge vhiki.

Mazuva maviri apfuura...

Iye zvino Hazelcast yave kupera mundangariro. Matanda airatidza kuti mushure memazuva mashoma ekuyedzwa, Hazelcast akatanga kunyunyuta nezvekushaikwa kwendangariro, uye mushure menguva yakati rebei rakadonha, uye node dzakaramba dzichifa rimwe nerimwe. Isu takabatanidza JVisualVM kune hazelcast uye takaona "inosimuka" - yaigara ichidaidza GC, asi haina kukwanisa kujekesa ndangariro.

Sei uye nei takanyora yakakwira-mutoro scalable sevhisi ye1C: Enterprise: Java, PostgreSQL, Hazelcast

Zvakazoitika kuti muhazelcast 3.4, pakudzima mepu / multiMap (map.destroy()), ndangariro haina kusunungurwa zvachose:

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

Iyo bug ikozvino yakagadziriswa mu3.5, asi raive dambudziko kumashure. Isu takagadzira maMepu matsva ane mazita ane simba uye akaadzima zvinoenderana nemafungiro edu. Kodhi yacho yakaita seizvi:

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

Call:

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

multiMap yakagadzirirwa kunyoreswa kwega kwega uye kubviswa payanga isingade. Takasarudza kuti tichatanga Mepu , kiyi ichave zita rekunyoreswa, uye hunhu huchave ziviso dzechikamu (kubva kwaunokwanisa kuwana zviziviso zvevashandisi, kana zvichidikanwa).

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

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

Machati avandudzwa.

Sei uye nei takanyora yakakwira-mutoro scalable sevhisi ye1C: Enterprise: Java, PostgreSQL, Hazelcast

Ndezvipi zvimwe zvatadzidza pamusoro pekuongorora mutoro?

  1. JSR223 inoda kunyorwa mu groovy uye inosanganisira kuunganidza cache - inokurumidza zvakanyanya. batanidzo.
  2. Jmeter-Plugins magirafu ari nyore kunzwisisa pane akajairwa. batanidzo.

Nezve chiitiko chedu neHazelcast

Hazelcast yakanga iri chigadzirwa chitsva kwatiri, takatanga kushanda nayo kubva muvhezheni 3.4.1, ikozvino sevha yedu yekugadzira iri kushanda shanduro 3.9.2 (panguva yekunyora, shanduro yezvino yeHazelcast ndeye 3.10).

ID yekugadzira

Takatanga neinteger identifiers. Ngatimbofungidzira kuti tinoda imwe Yakareba yechinhu chitsva. Kutevedzana mudhatabhesi hakuna kukodzera, matafura ari kubatanidzwa mukugovanisa - zvinozoitika kuti kune meseji ID = 1 muDB1 uye meseji ID = 1 muDB2, haugone kuisa iyi ID muElasticsearch, kana muHazelcast. , asi chinhu chakaipisisa kana iwe uchida kusanganisa data kubva kune maviri dhatabhesi mune imwe (somuenzaniso, kusarudza kuti imwe dhatabhesi yakakwana kune vanyoreri ava). Iwe unogona kuwedzera akati wandei AtomicLongs kuHazelcast uye wochengeta counter ipapo, ipapo kuita kwekutora ID nyowani kuri kuwedzeraAndGet pamwe nenguva yekukumbira kuHazelcast. Asi Hazelcast ine chimwe chinhu chakanyanya kunaka - FlakeIdGenerator. Paunenge uchisangana nemutengi wega wega, vanopihwa ID yemhando, semuenzaniso, yekutanga - kubva pa1 kusvika ku10, yechipiri - kubva pa000 kusvika 10, zvichingodaro. Iye zvino mutengi anogona kuburitsa zviziviso zvitsva ari ega kudzamara huwandu hwakapihwa kwairi hwapera. Inoshanda nekukasira, asi paunotangazve application (uye mutengi weHazelcast) mutsva unoteedzana unotanga - saka kusvetuka, nezvimwe. Pamusoro pezvo, vanogadzira havanyatso nzwisisa kuti sei maID ari akazara, asi asingaenderane. Takayera zvese uye takachinjira kuUUIDs.

Nenzira, kune avo vanoda kufanana ne Twitter, kune rakadaro Snowcast raibhurari - iyi ndeyekushandiswa kweSnowflake pamusoro peHazelcast. Unogona kuiona pano:

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

Asi isu hatisati tasvika pazviri zvakare.

TransactionalMap.replace

Chimwe chinoshamisa: TransactionalMap.replace haishande. Heino bvunzo:

@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

Ndaifanira kunyora zvangu kutsiva ndichishandisa 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);
}

Edza kwete chete akajairwa data zvimiro, asiwo yavo transaction shanduro. Zvinoitika kuti IMap inoshanda, asi TransactionalMap haipo.

Isa itsva JAR pasina downtime

Kutanga, takasarudza kurekodha zvinhu zvemakirasi edu muHazelcast. Semuenzaniso, tine kirasi yeApplication, tinoda kuichengeta nekuiverenga. Sevha:

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

Tinoverenga kuti:

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

Zvose zviri kushanda. Ipapo takafunga kuvaka index muHazelcast kutsvaga ne:

map.addIndex("subscriberId", false);

Uye pakunyora chinhu chitsva, vakatanga kugamuchira ClassNotFoundException. Hazelcast akaedza kuwedzera kune index, asi hapana chaaiziva nezvekirasi yedu uye aida kuti JAR ine kirasi iyi ipihwe kwairi. Isu takangoita izvo, zvese zvakashanda, asi dambudziko idzva rakaonekwa: nzira yekuvandudza iyo JAR pasina kumisa zvachose sumbu? Hazelcast haitore iyo JAR nyowani panguva yekuvandudza node-ne-node. Panguva iyi takasarudza kuti taigona kurarama pasina kutsvaga index. Mushure mezvose, kana iwe ukashandisa Hazelcast sekiyi-yakakosha chitoro, saka zvese zvichashanda? Kwete saizvozvo. Pano zvakare maitiro eIMap uye TransactionalMap akasiyana. Iko IMap isina basa, TransactionalMap inokanda chikanganiso.

IMap. Tinonyora 5000 zvinhu, zviverenge. Zvose zvinotarisirwa.

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

Asi hazvishande mukutengesa, tinowana 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();
        }
    });
}

Muna 3.8, iyo Mushandisi Kirasi Deployment michina yakaonekwa. Iwe unogona kusarudza imwe master node uye kugadzirisa iyo JAR faira pairi.

Iye zvino tanyatso shandura maitiro edu: tinozvigadzirisa isu pachedu muJSON uye tichengetedze muHazelcast. Hazelcast haidi kuziva chimiro chemakirasi edu, uye isu tinokwanisa kugadzirisa pasina kudzika. Kushandurwa kwezvinhu zvedomasi kunodzorwa nekushandisa. Shanduro dzakasiyana dzekushandisa dzinogona kushanda panguva imwe chete, uye mamiriro ezvinhu anogoneka kana iyo nyowani application inonyora zvinhu zvine minda mitsva, asi yekare haisati yaziva nezve minda iyi. Uye panguva imwecheteyo, iyo nyowani application inoverenga zvinhu zvakanyorwa nekare application iyo isina minda mitsva. Isu tinobata mamiriro akadai mukati mekushandisa, asi kuti zvive nyore isu hatishandure kana kudzima minda, isu tinongowedzera makirasi nekuwedzera minda mitsva.

Isu tinoona sei kuita kwepamusoro

Nzendo ina kuenda kuHazelcast - yakanaka, mbiri kune database - yakaipa

Kuenda kune cache yedata kunogara kuri nani pane kuenda kudhatabhesi, asi iwe haudi kuchengeta marekodhi asina kushandiswa zvakare. Isu tinosiya sarudzo yekuti chii chekuchengeta kusvika padanho rekupedzisira rebudiriro. Kana hutsva hutsva huchinyorwa, tinoshandura kutema kwemibvunzo yose muPostgreSQL (log_min_duration_statement kusvika 0) uye shandisa kuongorora mutoro kwemaminitsi 20. Kushandisa matanda akaunganidzwa, zvishandiso zvakadai pgFouine uye pgBadger zvinogona kuvaka zvinyorwa zvekuongorora. Mumishumo, isu tinonyanya kutsvaga mivhunzo inononoka uye inowanzoitika. Pamubvunzo unononoka, tinovaka hurongwa hwekuuraya (TSANANGURA) uye tinoongorora kana mubvunzo wakadaro uchigona kukurumidzirwa. Kazhinji zvikumbiro zveiyo data yekuisa yakafanana inokodzera mucache. Isu tinoedza kuchengeta mibvunzo "yakafuratira", tafura imwe pamubvunzo.

Operation

SV sevhisi yepamhepo yakaiswa mukushanda muchirimo cha2017, uye sechigadzirwa chakasiyana, SV yakaburitswa muna Mbudzi 2017 (panguva iyoyo mune beta vhezheni mamiriro).

Muanopfuura gore rekushanda, hakuna kumbove nematambudziko akakomba mukushanda kweCB online service. Isu tinotarisisa iyo online sevhisi kuburikidza Zabbix, unganidza uye tumira kubva Bamboo.

Kugoverwa kweSV server kunopihwa nenzira yemapakeji ekuzvarwa: RPM, DEB, MSI. Uyezve yeWindows tinopa imwe chete yekuisa muchimiro cheEXE imwe chete inoisa sevha, Hazelcast uye Elasticsearch pamushini mumwe. Isu takatanga takadaidza iyi vhezheni yekumisikidza se "demo" vhezheni, asi zvave pachena kuti iyi ndiyo inonyanya kufarirwa sarudzo yekuendesa.

Source: www.habr.com

Voeg