Momwe ndichifukwa chiyani tidalembera ntchito yolemetsa kwambiri ya 1C: Enterprise: Java, PostgreSQL, Hazelcast

M’nkhaniyi tikambirana mmene tinayambira komanso chifukwa chake tinayambira Njira yolumikizirana - makina omwe amasamutsa zidziwitso pakati pa mapulogalamu a kasitomala ndi 1C: Ma seva abizinesi - kuchokera pakukhazikitsa ntchito mpaka kuganiza kudzera muzomanga ndi kukhazikitsa.

The Interaction System (yotchedwa SV) ndi makina otumizirana mameseji ogawidwa, osalolera zolakwika ndi kutumiza kotsimikizika. SV idapangidwa ngati ntchito yolemetsa kwambiri yokhala ndi scalability yayikulu, yomwe imapezeka ngati ntchito yapaintaneti (yoperekedwa ndi 1C) komanso ngati chinthu chopangidwa ndi misala chomwe chingagwiritsidwe ntchito pazida zanu za seva.

SV imagwiritsa ntchito zosungirako zogawidwa hazelcast ndi search engine Elasticsearch. Tikambirananso za Java ndi momwe timakulira mopingasa PostgreSQL.
Momwe ndichifukwa chiyani tidalembera ntchito yolemetsa kwambiri ya 1C: Enterprise: Java, PostgreSQL, Hazelcast

Kupanga kwa vuto

Kuti tifotokoze momveka bwino chifukwa chomwe tidapangira Interaction System, ndikuwuzani pang'ono za momwe chitukuko cha ntchito zamabizinesi mu 1C chimagwirira ntchito.

Poyamba, pang'ono za ife kwa iwo omwe sadziwa zomwe timachita :) Tikupanga 1C:Enterprise teknoloji nsanja. Pulatifomuyi imaphatikizapo chida cha chitukuko cha ntchito zamalonda, komanso nthawi yothamanga yomwe imalola kuti ntchito zamalonda ziziyenda pamtunda.

Paradigm yokulitsa kasitomala-seva

Ntchito zamabizinesi zomwe zidapangidwa pa 1C:Enterprise imagwira ntchito pamagawo atatu kasitomala-seva zomangamanga "DBMS - seva yogwiritsira ntchito - kasitomala". Khodi yofunsira yolembedwa mkati chinenero chomangidwa mu 1C, ikhoza kuchitidwa pa seva yofunsira kapena pa kasitomala. Zonse zimagwira ntchito ndi zinthu zogwiritsira ntchito (zolemba, zolemba, ndi zina zotero), komanso kuwerenga ndi kulemba nkhokwe, zimangochitika pa seva. Kugwira ntchito kwa mafomu ndi mawonekedwe amalamulo kumayendetsedwanso pa seva. Wogula amachita kulandira, kutsegula ndi kusonyeza mafomu, "kulankhulana" ndi wogwiritsa ntchito (machenjezo, mafunso ...), mawerengedwe ang'onoang'ono m'mawonekedwe omwe amafunikira kuyankha mwamsanga (mwachitsanzo, kuchulukitsa mtengo ndi kuchuluka), kugwira ntchito ndi mafayilo am'deralo, kugwira ntchito ndi zida.

M'makhodi ogwiritsira ntchito, mitu yamayendedwe ndi ntchito ziyenera kuwonetsa mwatsatanetsatane komwe kachidindoko kachitikire - pogwiritsa ntchito &AtClient / &AtServer malangizo (&AtClient / &AtServer mu mtundu wa Chingerezi wachilankhulocho). Opanga 1C tsopano andiwongolera ponena kuti malangizowo ndi enieni akuluakulu, koma kwa ife izi sizofunika tsopano.

Mutha kuyimbira nambala ya seva kuchokera pamakina a kasitomala, koma simungathe kuyimbira nambala ya kasitomala kuchokera pa seva. Ichi ndi cholepheretsa chachikulu chomwe tidapanga pazifukwa zingapo. Makamaka, chifukwa code ya seva iyenera kulembedwa m'njira yoti izichita chimodzimodzi mosasamala kanthu komwe imatchedwa - kuchokera kwa kasitomala kapena kuchokera kwa seva. Ndipo pankhani yoyimba nambala ya seva kuchokera ku code ina ya seva, palibe kasitomala wotere. Ndipo chifukwa pakuchita ma code a seva, kasitomala yemwe adayitchayo amatha kutseka, kusiya kugwiritsa ntchito, ndipo seva sikhalanso ndi aliyense woyimbira.

Momwe ndichifukwa chiyani tidalembera ntchito yolemetsa kwambiri ya 1C: Enterprise: Java, PostgreSQL, Hazelcast
Khodi yomwe imayendetsa batani lodina: kuyitana njira ya seva kuchokera kwa kasitomala idzagwira ntchito, kuyimbira njira ya kasitomala kuchokera pa seva sikungatero

Izi zikutanthauza kuti ngati tikufuna kutumiza uthenga wina kuchokera ku seva kupita ku ntchito ya kasitomala, mwachitsanzo, kuti mbadwo wa lipoti "lotalika" watha ndipo lipotilo likhoza kuwonedwa, tilibe njira yotereyi. Muyenera kugwiritsa ntchito zidule, mwachitsanzo, nthawi ndi nthawi fufuzani seva kuchokera pamakina a kasitomala. Koma njira iyi imadzaza makina ndi mafoni osafunikira, ndipo nthawi zambiri samawoneka okongola kwambiri.

Ndipo palinso chosowa, mwachitsanzo, foni ikafika SIP- poyimba foni, dziwitsani kasitomala za izi kuti agwiritse ntchito nambala ya woyimbirayo kuti aipeze mu nkhokwe ya anzawo ndikuwonetsa zambiri za wogwiritsa ntchitoyo. Kapena, mwachitsanzo, pamene oda ifika kumalo osungiramo katundu, dziwitsani kasitomala wa kasitomala za izi. Nthawi zambiri, pali nthawi zambiri pomwe njira yotereyi ingakhale yothandiza.

Kupanga komweko

Pangani njira yotumizira mauthenga. Mwachangu, wodalirika, woperekedwa motsimikizika, wokhoza kufufuza mauthenga mosavuta. Kutengera makina, gwiritsani ntchito messenger (mauthenga, kuyimba pavidiyo) yomwe ikuyenda mkati mwa mapulogalamu a 1C.

Pangani dongosolo kuti likhale lopanda malire. Kuchuluka kwa ma node kuyenera kuphatikizidwa ndi kuchuluka kwa ma node.

Реализация

Tidasankha kuti tisaphatikize gawo la seva la SV molunjika ku 1C: Enterprise nsanja, koma kuti tiyigwiritse ntchito ngati chinthu chosiyana, API yomwe ingatchulidwe kuchokera ku code ya 1C application solutions. Izi zinachitidwa pazifukwa zingapo, chachikulu chomwe chinali chakuti ndinkafuna kuti ndizitha kusinthanitsa mauthenga pakati pa mapulogalamu osiyanasiyana a 1C (mwachitsanzo, pakati pa Trade Management ndi Accounting). Mapulogalamu osiyanasiyana a 1C amatha kuthamanga pamitundu yosiyanasiyana ya 1C: nsanja ya Enterprise, kukhala pamaseva osiyanasiyana, ndi zina zambiri. Zikatero, kukhazikitsidwa kwa SV ngati chinthu chosiyana chomwe chili "mbali" ya kukhazikitsa kwa 1C ndiye yankho labwino kwambiri.

Chifukwa chake, tidaganiza zopanga SV ngati chinthu chosiyana. Tikupangira kuti makampani ang'onoang'ono agwiritse ntchito seva ya CB yomwe tidayika mumtambo wathu (wss://1cdialog.com) kuti apewe mtengo wokwera wokhudzana ndi kukhazikitsa ndikusintha kwa seva. Makasitomala akuluakulu atha kuwona kuti ndikofunikira kukhazikitsa ma seva awo a CB kumalo awo. Tinagwiritsa ntchito njira yofananira mumtambo wathu wa SaaS 1c Mwatsopano - imapangidwa ngati chinthu chopangidwa mochuluka kuti ikhazikike pamasamba amakasitomala, ndipo imayikidwanso mumtambo wathu https://1cfresh.com/.

Ntchito

Kuti tigawire katundu ndi kulolerana kwa zolakwika, sitidzatumiza pulogalamu imodzi ya Java, koma angapo, okhala ndi chowongolera patsogolo pawo. Ngati mukufuna kusamutsa uthenga kuchokera ku node kupita ku node, gwiritsani ntchito kusindikiza / kulembetsa ku Hazelcast.

Kulumikizana pakati pa kasitomala ndi seva kumadutsa pa websocket. Ndizoyenerana ndi machitidwe a nthawi yeniyeni.

Cache yogawidwa

Tinasankha pakati pa Redis, Hazelcast ndi Ehcache. Ndi 2015. Redis wangotulutsa gulu latsopano (latsopano, lowopsa), pali Sentinel yokhala ndi zoletsa zambiri. Ehcache sadziwa momwe angasonkhanitsire gulu (ntchitoyi idawonekera pambuyo pake). Tinaganiza zoyesera ndi Hazelcast 3.4.
Hazelcast imasonkhanitsidwa mumagulu kunja kwa bokosi. Munjira imodzi ya node, sizothandiza kwambiri ndipo ingagwiritsidwe ntchito ngati cache - sadziwa momwe mungatayire deta ku disk, ngati mutataya node yokhayo, mumataya deta. Timatumiza ma Hazelcasts angapo, pomwe timasunga deta yovuta. Sitikusungirako cache - sitisamala.

Kwa ife, Hazelcast ndi:

  • Kusungirako magawo a ogwiritsa ntchito. Zimatenga nthawi yayitali kuti tipite ku database ya gawoli nthawi iliyonse, kotero timayika magawo onse ku Hazelcast.
  • Posungira. Ngati mukuyang'ana mbiri ya ogwiritsa ntchito, yang'anani posungira. Analemba uthenga watsopano - ikani mu cache.
  • Mitu yolumikizana pakati pa zochitika zogwiritsira ntchito. Node imapanga chochitika ndikuchiyika pamutu wa Hazelcast. Malo ena ogwiritsira ntchito omwe adalembetsa pamutuwu amalandira ndikukonza chochitikacho.
  • Maloko a Cluster. Mwachitsanzo, timapanga zokambirana pogwiritsa ntchito kiyi yapadera (makambirano amodzi mkati mwa nkhokwe ya 1C):

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

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

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

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

Tinaona kuti palibe njira. Tidatenga loko, ndikuchiyang'ananso, ndikuchipanga. Ngati simuyang'ana loko mutatenga loko, ndiye kuti pali mwayi woti ulusi wina unayang'ananso panthawiyo ndipo tsopano ayesa kupanga zokambirana zomwezo - koma zilipo kale. Simungathe kutseka pogwiritsa ntchito cholumikizira kapena chokhazikika cha java. Kupyolera mu nkhokwe - imachedwa, ndipo ndi chisoni kwa nkhokwe; kudzera ku Hazelcast - ndizomwe mukufunikira.

Kusankha DBMS

Tili ndi zokumana nazo zambiri komanso zopambana pogwira ntchito ndi PostgreSQL ndikuthandizana ndi omwe akupanga DBMS iyi.

Sizophweka ndi gulu la PostgreSQL - lilipo XL, XC, Citus, koma kawirikawiri awa si NoSQL omwe amatuluka m'bokosi. Sitinaganizire NoSQL ngati malo osungira; zinali zokwanira kuti titenge Hazelcast, yomwe sitinagwirepo nayo ntchito.

Ngati mukufuna kukulitsa database yolumikizana, ndiye kuti kugawa. Monga mukudziwira, ndi sharding timagawa nkhokwe m'magawo osiyana kuti aliyense aikidwe pa seva yapadera.

Mtundu woyamba wa sharding wathu udaganiza zotha kugawa tebulo lililonse la pulogalamu yathu pamaseva osiyanasiyana mosiyanasiyana. Pali mauthenga ambiri pa seva A - chonde, tiyeni tisunthire gawo la tebulo ili ku seva B. Chisankhochi chinangofuula ponena za kukhathamiritsa msanga, kotero tinaganiza zodzichepetsera ku njira ya anthu ambiri.

Mutha kuwerenga za obwereketsa ambiri, mwachitsanzo, patsamba Citus Data.

SV ili ndi malingaliro ogwiritsira ntchito komanso olembetsa. Ntchito ndikukhazikitsa kwachindunji kwa bizinesi, monga ERP kapena Accounting, yokhala ndi ogwiritsa ntchito ndi data yabizinesi. Wolembetsa ndi bungwe kapena munthu yemwe m'malo mwake pulogalamuyo idalembetsedwa mu seva ya SV. Wolembetsa akhoza kukhala ndi mapulogalamu angapo olembetsedwa, ndipo mapulogalamuwa amatha kusinthana mauthenga wina ndi mnzake. Wolembetsayo adakhala wobwereka m'dongosolo lathu. Mauthenga ochokera kwa olembetsa angapo amatha kupezeka mumndandanda umodzi weniweni; ngati tiwona kuti wolembetsa wayamba kupanga magalimoto ambiri, timasunthira kumalo osiyana siyana (kapena ngakhale seva yachinsinsi).

Tili ndi nkhokwe yayikulu pomwe tebulo lamayendedwe limasungidwa ndi chidziwitso chokhudza malo onse olembetsa.

Momwe ndichifukwa chiyani tidalembera ntchito yolemetsa kwambiri ya 1C: Enterprise: Java, PostgreSQL, Hazelcast

Kuti tipewe nkhokwe yayikulu, timasunga tebulo lolowera (ndi zina zofunika pafupipafupi) mu cache.

Ngati nkhokwe ya olembetsa ikayamba kuchepa, tizidula m'magawo mkati. Pazinthu zina zomwe timagwiritsa ntchito pg_pathman.

Popeza kutaya mauthenga a ogwiritsa ntchito ndikoyipa, timasunga nkhokwe zathu ndi zofananira. Kuphatikiza kwa ma synchronous ndi asynchronous replicas kumakupatsani mwayi wodzipangira nokha ngati mutayika nkhokwe yayikulu. Kutayika kwa uthenga kudzachitika kokha ngati malo osungiramo zinthu zakale ndi mawonekedwe ake osakanikirana alephera nthawi imodzi.

Ngati chofanana ndi synchronous chatayika, chofananacho chimakhala chofanana.
Ngati nkhokwe yayikulu itayika, chofananira chofananira chimakhala nkhokwe yayikulu, ndipo chofananacho chimakhala chofanana.

Elasticsearch posaka

Popeza, mwa zina, SV ndi mesenjala, imafunikira kusaka mwachangu, kosavuta komanso kosinthika, poganizira ma morphology, kugwiritsa ntchito machesi osalongosoka. Tidaganiza kuti tisayambitsenso gudumu ndikugwiritsa ntchito injini yosakira yaulere Elasticsearch, yopangidwa kutengera laibulale Lucene. Timatumizanso Elasticsearch mu cluster (master - data - data) kuti athetse mavuto pakagwa kulephera kwa ma node ogwiritsira ntchito.

Pa github tapeza Pulogalamu ya Russian morphology kwa Elasticsearch ndikugwiritsa ntchito. Mu Elasticsearch index timasunga mizu ya mawu (yomwe plugin imazindikira) ndi N-grams. Pamene wosuta akulowetsa malemba kuti asake, timayang'ana malemba omwe alembedwa pakati pa N-grams. Mukasungidwa ku index, mawu oti "malemba" agawidwa kukhala ma N-gram awa:

[awo, tek, tex, malemba, ek, ex, ext, malemba, ks, kst, ksty, st, sty, inu],

Ndipo muzu wa mawu akuti “mawu” nawonso udzasungidwa. Njira imeneyi imakulolani kufufuza kumayambiriro, pakati, ndi kumapeto kwa mawu.

Chithunzi chachikulu

Momwe ndichifukwa chiyani tidalembera ntchito yolemetsa kwambiri ya 1C: Enterprise: Java, PostgreSQL, Hazelcast
Bwerezani chithunzicho kuyambira koyambirira kwa nkhaniyo, koma ndi mafotokozedwe:

  • Balancer yowululidwa pa intaneti; tili ndi nginx, zitha kukhala zilizonse.
  • Zochitika za Java application zimalumikizana wina ndi mnzake kudzera pa Hazelcast.
  • Kuti tigwire ntchito ndi socket yapaintaneti timagwiritsa ntchito neti.
  • Ntchito ya Java idalembedwa mu Java 8 ndipo imakhala ndi mitolo OSGi. Zolingazo zikuphatikiza kusamukira ku Java 10 ndikusintha kupita ku ma module.

Chitukuko ndi kuyesa

Popanga ndikuyesa SV, tidakumana ndi zinthu zingapo zosangalatsa zomwe timagwiritsa ntchito.

Kuyesa kwa katundu ndi kutayikira kukumbukira

Kutulutsidwa kwa kutulutsidwa kulikonse kwa SV kumaphatikizapo kuyezetsa katundu. Zimatheka pamene:

  • Chiyesocho chinagwira ntchito kwa masiku angapo ndipo panalibe zolephera zautumiki
  • Nthawi yoyankhira pazochita zazikulu sinadutse nthawi yabwino
  • Kuwonongeka kwa magwiridwe antchito poyerekeza ndi mtundu wakale sikuposa 10%

Timadzaza nkhokwe yoyeserera ndi data - kuti tichite izi, timalandira zambiri za olembetsa omwe akugwira ntchito kwambiri kuchokera pa seva yopanga, kuchulukitsa manambala ake ndi 5 (chiwerengero cha mauthenga, zokambirana, ogwiritsa ntchito) ndikuyesa mwanjira imeneyo.

Timayesa kuyezetsa katundu wamakina olumikizirana mumasinthidwe atatu:

  1. kupsinjika maganizo
  2. Malumikizidwe okha
  3. Kulembetsa kwa olembetsa

Pakuyesa kupsinjika, timayambitsa ulusi mazana angapo, ndipo amatsitsa dongosolo popanda kuyimitsa: kulemba mauthenga, kupanga zokambirana, kulandira mndandanda wa mauthenga. Timatsanzira zochita za ogwiritsa ntchito wamba (pezani mndandanda wa mauthenga anga osawerengedwa, lembani kwa wina) ndi mayankho a mapulogalamu (perekani phukusi la kasinthidwe kosiyana, konzekerani chenjezo).

Mwachitsanzo, izi ndi zomwe gawo la mayeso opsinjika maganizo limawonekera:

  • Wogwiritsa alowa
    • Imapempha zokambirana zanu zomwe simunawerenge
    • 50% amatha kuwerenga mauthenga
    • 50% amatha kutumiza mameseji
    • Wogwiritsa wina:
      • Ali ndi mwayi 20% wopanga zokambirana zatsopano
      • Mwachisawawa amasankha iliyonse ya zokambirana zake
      • Amalowa mkati
      • Amapempha mauthenga, mbiri ya ogwiritsa ntchito
      • Amapanga mauthenga asanu opita kwa ogwiritsa ntchito mwachisawawa kuchokera muzokambiranazi
      • Kusiya zokambirana
      • Kubwereza ka 20
      • Kutuluka, kubwereranso kumayambiriro kwa script

    • Chatbot imalowa m'dongosolo (amatsanzira mauthenga kuchokera ku code code)
      • Ali ndi mwayi 50% wopanga njira yatsopano yosinthira deta (makambirano apadera)
      • 50% amatha kulemba uthenga kumayendedwe aliwonse omwe alipo

Chochitika cha "Malumikizidwe Okha" adawonekera pazifukwa. Pali zochitika: ogwiritsa ntchito adalumikiza dongosolo, koma sanalowe nawo. Wogwiritsa ntchito aliyense amayatsa kompyuta nthawi ya 09:00 m'mawa, amakhazikitsa kulumikizana ndi seva ndipo amakhala chete. Anyamatawa ndi owopsa, pali ambiri a iwo - mapepala okhawo omwe ali nawo ndi PING / PONG, koma amasunga kugwirizana kwa seva (sangathe kusunga - bwanji ngati pali uthenga watsopano). Mayeserowa amabalanso momwe ambiri ogwiritsa ntchito amayesera kulowa mu dongosolo mu theka la ola. Zili zofanana ndi kuyesa kupsinjika maganizo, koma cholinga chake ndi chothandizira choyamba - kotero kuti palibe zolephera (munthu sagwiritsa ntchito dongosolo, ndipo amagwa kale - n'zovuta kuganiza za chinachake choipa).

Zolemba zolembetsa zolembetsa zimayamba kuyambira pakuyambitsa koyamba. Tinayesa kupsinjika maganizo ndipo tinali otsimikiza kuti dongosolo silinachepetse panthawi yolemberana makalata. Koma ogwiritsa ntchito adabwera ndipo kulembetsa kudayamba kulephera chifukwa chakutha kwa nthawi. Polembetsa tinagwiritsa ntchito / dev / mwachisawawa, zomwe zimagwirizana ndi entropy ya dongosolo. Seva inalibe nthawi yodziunjikira entropy yokwanira ndipo SecureRandom yatsopano itafunsidwa, idaundana kwa masekondi makumi. Pali njira zambiri zotulutsira izi, mwachitsanzo: sinthani ku zosatetezedwa / dev / urandom, ikani bolodi lapadera lomwe limapanga entropy, pangani manambala osasintha pasadakhale ndikuzisunga mu dziwe. Tinatseka vutoli kwakanthawi ndi dziwe, koma kuyambira pamenepo takhala tikuyesa mayeso apadera olembetsa olembetsa atsopano.

Timagwiritsa ntchito ngati jenereta yonyamula katundu JMeter. Simadziwa kugwira ntchito ndi websocket; imafunikira pulogalamu yowonjezera. Zotsatira zoyambirira za funso la "jmeter websocket" ndi: zolemba kuchokera ku BlazeMeter, zomwe zimalimbikitsa pulogalamu yowonjezera ndi Maciej Zaleski.

Ndipamene tinaganiza zoyambira.

Pafupifupi titangoyamba kuyezetsa kwambiri, tidazindikira kuti JMeter idayamba kutsitsa kukumbukira.

Pulagiyi ndi nkhani yayikulu yosiyana; ndi nyenyezi za 176, ili ndi mafoloko 132 pa github. Wolembayo sanachitepo kanthu kuyambira 2015 (tidatenga mu 2015, ndiye kuti sizinadzutse kukayikira), nkhani zingapo za github zokhudzana ndi kutayikira kukumbukira, zopempha 7 zosatsekedwa.
Ngati mwaganiza zoyesa katundu pogwiritsa ntchito pulogalamu yowonjezerayi, chonde tcherani khutu pazokambirana zotsatirazi:

  1. M'malo okhala ndi ulusi wambiri, LinkedList yokhazikika idagwiritsidwa ntchito, ndipo zotsatira zake zinali NPE mu nthawi yokonzekera. Izi zitha kuthetsedwa posinthira ku ConcurrentLinkedDeque kapena ndi midadada yolumikizidwa. Tidasankha tokha njira yoyamba (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Memory kutayikira; mukadula, zidziwitso zolumikizidwa sizichotsedwa (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. Munjira yotsatsira (pamene websocket sitsekedwa kumapeto kwa chitsanzo, koma imagwiritsidwa ntchito pambuyo pake mu dongosolo), njira zoyankhira sizigwira ntchito (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

Ichi ndi chimodzi mwazomwe zili pa github. Zomwe tidachita:

  1. Watenga foloko Elyran Kogan (@elyrank) - imakonza zovuta 1 ndi 3
  2. Kuthetsa vuto 2
  3. Jetty yosinthidwa kuchokera ku 9.2.14 mpaka 9.3.12
  4. Wokutidwa SimpleDateFormat mu ThreadLocal; SimpleDateFormat siyotetezedwa ndi ulusi, zomwe zidatsogolera ku NPE panthawi yothamanga
  5. Kukonza kutayikira kwina kwa kukumbukira (kulumikizana kudatsekedwa molakwika pamene kulumikizidwa)

Ndipo komabe imayenda!

Memory idayamba kutha osati tsiku limodzi, koma awiri. Panalibe nthawi yotsala, kotero tinaganiza zoyambitsa ulusi wochepa, koma kwa othandizira anayi. Izi zikanakhala zokwanira kwa sabata imodzi.

Masiku awiri adutsa...

Tsopano Hazelcast ikutha. Mitengoyo inasonyeza kuti patapita masiku angapo akuyesedwa, Hazelcast anayamba kudandaula za kusowa kukumbukira, ndipo patapita nthawi gululo linaphwanyidwa, ndipo mfundozo zinapitirizabe kufa mmodzimmodzi. Tidalumikiza JVisualVM ku hazelcast ndikuwona "macheka okwera" - nthawi zonse amatchedwa GC, koma sitinathe kuchotsa kukumbukira.

Momwe ndichifukwa chiyani tidalembera ntchito yolemetsa kwambiri ya 1C: Enterprise: Java, PostgreSQL, Hazelcast

Zinapezeka kuti mu hazelcast 3.4, pochotsa mapu / multiMap (map.destroy()), kukumbukira sikumamasulidwa kwathunthu:

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

Vutoli tsopano lakonzedwa mu 3.5, koma linali vuto kale. Tidapanga ma multiMaps atsopano okhala ndi mayina osinthika ndikuwachotsa malinga ndi malingaliro athu. Code idawoneka motere:

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

Imbani:

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

multiMap idapangidwa pakulembetsa kulikonse ndikuchotsedwa pomwe sikunali kofunikira. Tinaganiza kuti tiyambitsa Mapu , fungulo lidzakhala dzina la kulembetsa, ndipo zikhalidwe zidzakhala zozindikiritsa gawo (momwe mutha kupeza zozindikiritsa, ngati kuli kofunikira).

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

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

Ma chart ayenda bwino.

Momwe ndichifukwa chiyani tidalembera ntchito yolemetsa kwambiri ya 1C: Enterprise: Java, PostgreSQL, Hazelcast

Taphunziranso chiyani za kuyezetsa katundu?

  1. JSR223 iyenera kulembedwa mu groovy ndikuphatikiza posungira - ndiyothamanga kwambiri. kugwirizana.
  2. Ma graph a Jmeter-plugins ndi osavuta kumva kuposa omwe ali wamba. kugwirizana.

Za zomwe takumana nazo ndi Hazelcast

Hazelcast inali mankhwala atsopano kwa ife, tinayamba kugwira nawo ntchito kuchokera ku 3.4.1, tsopano seva yathu yopanga makina ikugwira ntchito 3.9.2 (panthawi yolemba, Hazelcast yatsopano ndi 3.10).

Kupanga ID

Tinayamba ndi zozindikiritsa zonse. Tiyerekeze kuti tikufunika Kutali kwina kwa chinthu chatsopano. Kutsatizana mu nkhokwe sikoyenera, matebulo akukhudzidwa ndi sharding - zikuwoneka kuti pali uthenga ID = 1 mu DB1 ndi uthenga ID = 1 mu DB2, simungathe kuyika ID iyi mu Elasticsearch, kapena Hazelcast. , koma choyipa kwambiri ngati mukufuna kuphatikiza deta kuchokera kuzinthu ziwiri kukhala imodzi (mwachitsanzo, kusankha kuti database imodzi ndiyokwanira kwa olembetsa awa). Mutha kuwonjezera ma AtomicLongs angapo ku Hazelcast ndikusunga kauntala pamenepo, ndiye kuti ntchito yopezera ID yatsopano ndikuwonjezeraAndGet kuphatikiza nthawi yofunsira ku Hazelcast. Koma Hazelcast ili ndi china chake chabwino kwambiri - FlakeIdGenerator. Akamalumikizana ndi kasitomala aliyense, amapatsidwa mtundu wa ID, mwachitsanzo, woyamba - kuyambira 1 mpaka 10, wachiwiri - kuchokera 000 mpaka 10, ndi zina zotero. Tsopano kasitomala atha kutulutsa zizindikiritso zatsopano payekha mpaka mtundu womwe waperekedwa kwa iwo utha. Zimagwira ntchito mwachangu, koma mukayambiranso kugwiritsa ntchito (ndi kasitomala wa Hazelcast), mndandanda watsopano umayamba - chifukwa chake kudumpha, ndi zina. Kuphatikiza apo, opanga samamvetsetsa kwenikweni chifukwa chake ma ID ndi ophatikizika, koma ndi osagwirizana. Tinayezera chilichonse ndikusintha kukhala ma UUID.

Mwa njira, kwa iwo amene akufuna kukhala ngati Twitter, pali laibulale ya Snowcast - uku ndikukhazikitsa kwa Snowflake pamwamba pa Hazelcast. Mutha kuziwona apa:

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

Koma sitinafikeponso.

TransactionalMap.replace

Chodabwitsa china: TransactionalMap.replace sikugwira ntchito. Nawa mayeso:

@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

Ndinayenera kulemba m'malo mwanga pogwiritsa ntchito 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);
}

Osamangoyesa mawonekedwe anthawi zonse, komanso mitundu yawo yosinthira. Zimachitika kuti IMap imagwira ntchito, koma TransactionalMap kulibe.

Ikani JAR yatsopano popanda nthawi yopuma

Choyamba, tinaganiza zojambulitsa zinthu za makalasi athu ku Hazelcast. Mwachitsanzo, tili ndi kalasi ya Application, tikufuna kusunga ndikuwerenga. Sungani:

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

Timawerenga:

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

Zonse zikuyenda. Kenako tidaganiza zopanga index ku Hazelcast kuti tifufuze ndi:

map.addIndex("subscriberId", false);

Ndipo polemba chinthu chatsopano, adayamba kulandira ClassNotFoundException. Hazelcast adayesa kuwonjezera pamndandanda, koma samadziwa kalikonse za kalasi yathu ndipo adafuna kuti JAR yokhala ndi kalasi iyi iperekedwe. Tidachita izi, zonse zidayenda, koma vuto latsopano lidawonekera: momwe mungasinthire JAR popanda kuyimitsa gululo? Hazelcast satenga JAR yatsopano panthawi yosintha ma node-by-node. Pa nthawiyi tinaganiza kuti tikhoza kukhala popanda kufufuza index. Kupatula apo, ngati mugwiritsa ntchito Hazelcast ngati sitolo yamtengo wapatali, ndiye kuti zonse ziyenda? Osati kwenikweni. Apanso machitidwe a IMap ndi TransactionalMap ndi osiyana. Kumene IMap siyisamala, TransactionalMap imaponya zolakwika.

IMap. Timalemba zinthu 5000, kuziwerenga. Zonse zimayembekezeredwa.

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

Koma sizigwira ntchito, timapeza 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();
        }
    });
}

Mu 3.8, makina a User Class Deployment adawonekera. Mutha kusankha master node imodzi ndikusintha fayilo ya JAR pamenepo.

Tsopano tasinthiratu njira yathu: timadzipanga tokha kukhala JSON ndikusunga ku Hazelcast. Hazelcast safunikira kudziwa kapangidwe ka makalasi athu, ndipo titha kusintha popanda nthawi yopuma. Kusintha kwa zinthu zamtundu kumayendetsedwa ndi pulogalamuyo. Mitundu yosiyanasiyana ya pulogalamuyo imatha kugwira ntchito nthawi imodzi, ndipo zochitika ndizotheka pamene pulogalamu yatsopanoyo ilemba zinthu ndi minda yatsopano, koma yakaleyo sinadziwebe za mindayi. Ndipo nthawi yomweyo, pulogalamu yatsopanoyi imawerenga zinthu zolembedwa ndi pulogalamu yakale zomwe zilibe minda yatsopano. Timachita zinthu ngati izi mkati mwa pulogalamuyo, koma kuphweka sitisintha kapena kuchotsa magawo, timangokulitsa makalasi powonjezera magawo atsopano.

Momwe timatsimikizira magwiridwe antchito apamwamba

Maulendo anayi opita ku Hazelcast - abwino, awiri ku database - oyipa

Kupita ku cache kwa deta nthawi zonse kuli bwino kusiyana ndi kupita kumalo osungirako zinthu, koma simukufunanso kusunga zolemba zosagwiritsidwa ntchito. Timasiya chisankho cha zomwe tingasunge mpaka gawo lomaliza lachitukuko. Pamene ntchito yatsopanoyo ili ndi coded, timatsegula zolemba za mafunso onse mu PostgreSQL (log_min_duration_statement to 0) ndikuyesa kuyesa katundu kwa mphindi 20. Pogwiritsa ntchito zipika zomwe zasonkhanitsidwa, zofunikira monga pgFouine ndi pgBadger zimatha kupanga malipoti osanthula. M'malipoti, timayang'ana mafunso omwe amachedwa komanso pafupipafupi. Pamafunso apang'onopang'ono, timapanga dongosolo lokonzekera (KUFOTOKOZERA) ndikuwunika ngati funsoli likhoza kufulumizitsidwa. Kupempha pafupipafupi kwa data yolowetsamo kumalowa bwino mu cache. Timayesetsa kuti mafunso akhale "osalala", tebulo limodzi pafunso lililonse.

Ntchito

SV ngati ntchito yapaintaneti idayamba kugwira ntchito kumapeto kwa chaka cha 2017, ndipo ngati chinthu chosiyana, SV idatulutsidwa mu Novembala 2017 (panthawiyo mumtundu wa beta).

Pakutha kwa chaka chimodzi chogwira ntchito, sipanakhalepo zovuta zazikulu pakugwiritsa ntchito ntchito yapaintaneti ya CB. Timayang'anira ntchito zapaintaneti kudzera Zabbix, sonkhanitsani ndi kutumiza kuchokera Bambo.

Kugawa kwa seva ya SV kumaperekedwa m'njira zamaphukusi: RPM, DEB, MSI. Kuphatikiza pa Windows timapereka choyikira chimodzi mwa mawonekedwe a EXE imodzi yomwe imayika seva, Hazelcast ndi Elasticsearch pamakina amodzi. Poyamba tidatcha mtundu uwu wa kukhazikitsa ngati mtundu wa "demo", koma tsopano zawonekeratu kuti iyi ndiye njira yotchuka kwambiri yotumizira.

Source: www.habr.com

Kuwonjezera ndemanga