Ta yaya kuma dalilin da yasa muka rubuta sabis na ma'aunin nauyi mai nauyi don 1C: Kasuwanci: Java, PostgreSQL, Hazelcast

A cikin wannan labarin za mu yi magana game da yadda da kuma dalilin da ya sa muka ci gaba Tsarin hulɗa - hanyar da ke canza bayanai tsakanin aikace-aikacen abokin ciniki da 1C: Sabar kasuwanci - daga saita aiki zuwa tunani ta hanyar gine-gine da cikakkun bayanan aiwatarwa.

Tsarin hulɗa (wanda ake kira SV) tsarin rarrabawa ne, tsarin saƙo mai jurewa tare da garantin isarwa. An ƙirƙira SV azaman sabis mai ɗaukar nauyi mai girma tare da haɓaka mai girma, ana samun duka azaman sabis na kan layi (wanda aka samar ta 1C) kuma azaman samfuri mai tarin yawa wanda za'a iya tura shi akan wuraren sabar ku.

SV yana amfani da ajiya mai rarrabawa hazelcast da injin bincike Elasticsearch. Za mu kuma yi magana game da Java da yadda muke auna ma'aunin PostgreSQL a kwance.
Ta yaya kuma dalilin da yasa muka rubuta sabis na ma'aunin nauyi mai nauyi don 1C: Kasuwanci: Java, PostgreSQL, Hazelcast

Tsara matsalar

Don bayyana dalilin da ya sa muka ƙirƙiri Tsarin Sadarwa, Zan gaya muku kaɗan game da yadda haɓaka aikace-aikacen kasuwanci a cikin 1C ke aiki.

Da farko, kadan game da mu ga waɗanda ba su san abin da muke yi ba tukuna :) Muna yin dandalin fasaha na 1C: Kasuwanci. Dandalin ya ƙunshi kayan aikin haɓaka aikace-aikacen kasuwanci, da kuma lokacin aiki wanda ke ba da damar aikace-aikacen kasuwanci don gudana a cikin yanayin giciye.

Tsarin ci gaban abokin ciniki-uwar garken

Aikace-aikacen kasuwanci da aka ƙirƙira akan 1C: Kasuwanci suna aiki a mataki uku abokin ciniki-uwar garken gine "DBMS - uwar garken aikace-aikacen - abokin ciniki". An rubuta lambar aikace-aikacen a ciki ginanniyar harshe 1C, ana iya kashe shi akan uwar garken aikace-aikacen ko akan abokin ciniki. Duk aiki tare da abubuwan aikace-aikacen (directory, takardu, da sauransu), kazalika da karantawa da rubuta bayanan, ana yin su ne kawai akan uwar garken. Hakanan ana aiwatar da ayyukan fom da ƙirar umarni akan sabar. Abokin ciniki yana yin karɓa, buɗewa da nuna siffofin, "sadar da" tare da mai amfani (gargaɗi, tambayoyi ...), ƙananan ƙididdiga a cikin siffofin da ke buƙatar amsa mai sauri (misali, ninka farashin da yawa), aiki tare da fayilolin gida, aiki tare da kayan aiki.

A cikin lambar aikace-aikacen, dole ne shugabannin matakai da ayyuka su nuna a sarari inda za a aiwatar da lambar - ta amfani da umarnin &AtClient / &AtServer (&AtClient / &AtServer a cikin sigar Ingilishi na yaren). Masu haɓaka 1C yanzu za su gyara ni ta hanyar cewa umarnin a zahiri fiye da, amma a gare mu wannan ba shi da mahimmanci a yanzu.

Kuna iya kiran lambar uwar garken daga lambar abokin ciniki, amma ba za ku iya kiran lambar abokin ciniki daga lambar uwar garken ba. Wannan ƙayyadaddun ƙayyadaddun tushe ne da muka yi don dalilai da yawa. Musamman, saboda dole ne a rubuta lambar uwar garke ta hanyar da za ta aiwatar da wannan hanya ko ta ina aka kira shi - daga abokin ciniki ko daga uwar garken. Kuma game da kiran lambar uwar garken daga wata lambar uwar garken, babu abokin ciniki kamar haka. Kuma saboda lokacin aiwatar da lambar uwar garken, abokin ciniki wanda ya kira shi zai iya rufewa, fita daga aikace-aikacen, kuma uwar garken ba zai sake samun wanda zai kira ba.

Ta yaya kuma dalilin da yasa muka rubuta sabis na ma'aunin nauyi mai nauyi don 1C: Kasuwanci: Java, PostgreSQL, Hazelcast
Lambar da ke sarrafa maɓallin danna: kiran tsarin sabar daga abokin ciniki zai yi aiki, kiran tsarin abokin ciniki daga uwar garken ba zai yi ba

Wannan yana nufin cewa idan muna so mu aika da wasu saƙo daga uwar garken zuwa aikace-aikacen abokin ciniki, alal misali, cewa samar da rahoton "dogon gudu" ya ƙare kuma za a iya duba rahoton, ba mu da irin wannan hanyar. Dole ne ku yi amfani da dabaru, alal misali, zaɓen sabar lokaci-lokaci daga lambar abokin ciniki. Amma wannan tsarin yana ɗaukar tsarin tare da kiran da ba dole ba, kuma gabaɗaya baya kama da kyan gani sosai.

Sannan akwai kuma buqatar, misali, idan wayar tarho ya zo SIP- lokacin yin kira, sanar da abokin ciniki aikace-aikacen game da wannan don ya iya amfani da lambar mai kiran don nemo shi a cikin bayanan takwaransa kuma ya nuna bayanin mai amfani game da takwaransa na kiran. Ko, alal misali, lokacin da oda ya isa wurin ajiya, sanar da abokin ciniki aikace-aikacen abokin ciniki game da wannan. Gabaɗaya, akwai lokuta da yawa inda irin wannan tsarin zai zama da amfani.

Samar da kanta

Ƙirƙirar hanyar aika saƙon. Mai sauri, abin dogaro, tare da garantin isarwa, tare da ikon bincika saƙonni cikin sassauƙa. Dangane da tsarin, aiwatar da manzo (saƙonni, kiran bidiyo) yana gudana cikin aikace-aikacen 1C.

Zana tsarin don zama a kwance. Dole ne a rufe nauyin haɓaka ta hanyar ƙara yawan nodes.

Aiwatarwa

Mun yanke shawarar kada mu haɗa sashin uwar garke na SV kai tsaye a cikin 1C: dandamali na kasuwanci, amma don aiwatar da shi azaman samfuri daban, API ɗin wanda za'a iya kiran shi daga lambar mafita na aikace-aikacen 1C. An yi haka ne saboda dalilai da yawa, babban ɗayan su shine ina so in ba da damar yin musayar saƙonni tsakanin aikace-aikacen 1C daban-daban (misali, tsakanin Gudanar da Kasuwanci da Accounting). Aikace-aikacen 1C daban-daban na iya gudana akan nau'ikan nau'ikan 1C: dandamali na kasuwanci, kasancewa akan sabar daban-daban, da sauransu. A cikin irin wannan yanayi, aiwatar da SV a matsayin samfurin daban wanda yake "a gefen" na shigarwa na 1C shine mafi kyawun bayani.

Don haka, mun yanke shawarar yin SV azaman samfuri daban. Muna ba da shawarar cewa ƙananan kamfanoni su yi amfani da uwar garken CB da muka shigar a cikin gajimarenmu (wss://1cdialog.com) don guje wa tsadar farashin da ke da alaƙa da shigarwa na gida da daidaita sabar. Manyan abokan ciniki na iya ganin yana da kyau su shigar da sabar CB nasu a wuraren aikinsu. Mun yi amfani da irin wannan hanya a cikin samfurin SaaS ɗin mu 1c sabo - an samar da shi azaman samfuri mai yawa don shigarwa a rukunin abokan ciniki, kuma ana tura shi cikin gajimarenmu. https://1cfresh.com/.

Aikace-aikacen

Don rarraba kaya da haƙurin kuskure, ba za mu tura aikace-aikacen Java ɗaya ba, amma da yawa, tare da ma'aunin nauyi a gabansu. Idan kana buƙatar canja wurin saƙo daga kumburi zuwa kumburi, yi amfani da bugawa/yi rajista a Hazelcast.

Sadarwa tsakanin abokin ciniki da uwar garken ta hanyar websocket. Ya dace sosai don tsarin lokaci na ainihi.

Rarraba cache

Mun zaɓi tsakanin Redis, Hazelcast da Ehcache. 2015 ne. Redis kawai ya fito da sabon tari (sabbin ma, ban tsoro), akwai Sentinel tare da hani mai yawa. Ehcache bai san yadda ake haɗawa cikin gungu ba (wannan aikin ya bayyana daga baya). Mun yanke shawarar gwada shi tare da Hazelcast 3.4.
Hazelcast an haɗa shi cikin gungu daga cikin akwatin. A cikin yanayin kumburi guda ɗaya, ba shi da amfani sosai kuma ana iya amfani da shi azaman cache kawai - bai san yadda ake jujjuya bayanai zuwa faifai ba, idan kun rasa kundi guda ɗaya, kuna rasa bayanan. Muna tura Hazelcasts da yawa, tsakanin waɗanda muke adana mahimman bayanai. Ba mu adana cache - ba mu damu da shi ba.

A gare mu, Hazelcast shine:

  • Adana zaman masu amfani. Yana ɗaukar lokaci mai tsawo don zuwa bayanan bayanai don zama kowane lokaci, don haka mun sanya duk zaman a Hazelcast.
  • Cache. Idan kana neman bayanin martabar mai amfani, duba cache. Rubuta sabon saƙo - sanya shi a cikin cache.
  • Batutuwa don sadarwa tsakanin misalan aikace-aikace. Kullin yana haifar da wani taron kuma ya sanya shi cikin batun Hazelcast. Sauran nodes na aikace-aikacen da aka yi rajista ga wannan batu suna karɓa da sarrafa taron.
  • Makullin tari. Misali, muna ƙirƙirar tattaunawa ta amfani da maɓalli na musamman (tattaunawar guda ɗaya a cikin bayanan 1C):

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

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

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

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

Mun duba cewa babu tashar. Muka dauki makullin, muka sake dubawa, muka kirkiro shi. Idan baku duba makullin ba bayan ɗaukar makullin, to akwai damar cewa wani zaren shima ya bincika a wannan lokacin kuma yanzu zai yi ƙoƙarin ƙirƙirar tattaunawa iri ɗaya - amma ya riga ya wanzu. Ba za ku iya kulle ta amfani da Makullin java na aiki tare ko na yau da kullun ba. Ta hanyar bayanan bayanai - yana da hankali, kuma yana da tausayi ga bayanan; ta hanyar Hazelcast - shine abin da kuke buƙata.

Zaɓin DBMS

Muna da kwarewa mai yawa da nasara aiki tare da PostgreSQL da haɗin kai tare da masu haɓaka wannan DBMS.

Ba shi da sauƙi tare da tarin PostgreSQL - akwai XL, XC, Citus, amma gabaɗaya waɗannan ba NoSQLs bane waɗanda ke sikelin daga akwatin. Ba mu yi la'akari da NoSQL a matsayin babban ajiya ba; ya isa cewa mun ɗauki Hazelcast, wanda ba mu yi aiki da shi ba.

Idan kuna buƙatar haɓaka bayanan alaƙa, wannan yana nufin sharding. Kamar yadda kuka sani, tare da sharding muna rarraba ma'ajin bayanai zuwa sassa daban-daban ta yadda kowannensu za'a iya sanya shi a kan uwar garken daban.

Sigar farko ta sharding ɗinmu ta ɗauki ikon rarraba kowane tebur na aikace-aikacen mu a kan sabar daban-daban a daidai gwargwado. Akwai saƙonni da yawa akan uwar garken A - don Allah, bari mu matsar da wani ɓangare na wannan tebur zuwa uwar garken B. Wannan shawarar kawai ta yi kururuwa game da ingantawa da wuri, don haka mun yanke shawarar iyakance kanmu zuwa hanyar masu haya da yawa.

Kuna iya karanta game da masu haya da yawa, alal misali, akan gidan yanar gizon Citus Data.

SV yana da ra'ayoyin aikace-aikace da masu biyan kuɗi. Aikace-aikace takamaiman shigarwa ne na aikace-aikacen kasuwanci, kamar ERP ko Accounting, tare da masu amfani da bayanan kasuwanci. Mai biyan kuɗi ƙungiya ce ko mutum wanda a madadinsa aka yi rajistar aikace-aikacen a sabar SV. Mai biyan kuɗi na iya samun aikace-aikace da yawa rajista, kuma waɗannan aikace-aikacen na iya musayar saƙonni da juna. Mai biyan kuɗi ya zama ɗan haya a cikin tsarin mu. Ana iya samun saƙon masu biyan kuɗi da yawa a cikin bayanan zahiri ɗaya; idan muka ga cewa mai biyan kuɗi ya fara samar da zirga-zirgar ababen hawa da yawa, muna matsar da shi zuwa wata rumbun adana bayanai ta zahiri (ko ma uwar garken bayanan daban).

Muna da babban rumbun adana bayanai inda ake adana tebur mai tuƙi tare da bayani game da wurin duk bayanan masu biyan kuɗi.

Ta yaya kuma dalilin da yasa muka rubuta sabis na ma'aunin nauyi mai nauyi don 1C: Kasuwanci: Java, PostgreSQL, Hazelcast

Don hana babban ma'aunin bayanai daga zama ƙugiya, muna ajiye tebur ɗin kewayawa (da sauran bayanan da ake buƙata akai-akai) a cikin ma'aji.

Idan bayanan mai biyan kuɗi ya fara raguwa, za mu yanke shi zuwa ɓangarori a ciki. A kan sauran ayyukan da muke amfani da su pg_tafarki.

Tun da rasa saƙonnin mai amfani ba shi da kyau, muna kula da bayanan mu tare da kwafi. Haɗuwa da kwafi na aiki tare da asynchronous yana ba ku damar inshora kan kanku idan asarar babban bayanan bayanai. Asarar saƙo zai faru ne kawai idan babban ma'ajin bayanai da kwafin sa na aiki tare sun gaza lokaci guda.

Idan kwafin aiki tare ya ɓace, kwafin asynchronous ya zama aiki tare.
Idan babban ma'ajin bayanai ya ɓace, kwafin aiki tare ya zama babban rumbun adana bayanai, kuma kwafin asynchronous ya zama kwafi na aiki tare.

Elasticsearch don bincike

Tun da, a tsakanin sauran abubuwa, SV kuma manzo ne, yana buƙatar bincike mai sauri, dacewa da sassauƙa, la'akari da ilimin halittar jiki, ta amfani da matches mara kyau. Mun yanke shawarar kada mu sake ƙirƙira dabaran kuma mu yi amfani da injin bincike kyauta Elasticsearch, wanda aka ƙirƙira bisa ɗakin karatu Lucene. Har ila yau, muna tura Elasticsearch a cikin tari (maigida - bayanai - bayanai) don kawar da matsaloli a yayin gazawar nodes na aikace-aikacen.

A kan github mun samo Rasha ilimin halittar jiki plugin don Elasticsearch kuma yi amfani da shi. A cikin fihirisar Elasticsearch muna adana tushen kalmar (wanda plugin ɗin ya ƙayyade) da N-grams. Yayin da mai amfani ke shigar da rubutu don bincika, muna neman rubutun da aka buga tsakanin N-grams. Lokacin da aka ajiye zuwa fihirisar, kalmar “rubutu” za a raba zuwa N-gram masu zuwa:

[wadanda, tek, tex, rubutu, rubutu, ek, ex, ext, rubutu, ks, kst, ksty, st, sty, kai],

Kuma za a adana tushen kalmar “rubutu” kuma. Wannan hanya tana ba ku damar bincika a farkon, a tsakiya, da kuma a ƙarshen kalmar.

Babban hoto

Ta yaya kuma dalilin da yasa muka rubuta sabis na ma'aunin nauyi mai nauyi don 1C: Kasuwanci: Java, PostgreSQL, Hazelcast
Maimaita hoton daga farkon labarin, amma tare da bayani:

  • Balancer fallasa akan Intanet; Muna da nginx, yana iya zama kowane.
  • Misalan aikace-aikacen Java suna sadarwa da juna ta Hazelcast.
  • Don yin aiki tare da soket ɗin gidan yanar gizo muna amfani Netty.
  • An rubuta aikace-aikacen Java a cikin Java 8 kuma ya ƙunshi daure OSGi. Tsare-tsaren sun haɗa da ƙaura zuwa Java 10 da canzawa zuwa kayayyaki.

Ci gaba da gwaji

A cikin tsarin haɓakawa da gwada SV, mun haɗu da abubuwa masu ban sha'awa da yawa na samfuran da muke amfani da su.

Gwajin lodi da zubewar ƙwaƙwalwar ajiya

Sakin kowane sakin SV ya ƙunshi gwajin nauyi. Yana yin nasara lokacin da:

  • Gwajin ya yi aiki na kwanaki da yawa kuma babu gazawar sabis
  • Lokacin amsawa don mahimman ayyuka bai wuce madaidaicin madaidaicin wuri ba
  • Tabarbarewar ayyuka idan aka kwatanta da sigar baya bai wuce 10% ba.

Mun cika bayanan gwaji tare da bayanai - don yin wannan, muna karɓar bayani game da mai biyan kuɗi mafi aiki daga uwar garken samarwa, ninka lambobi ta 5 (yawan saƙonni, tattaunawa, masu amfani) kuma gwada shi ta wannan hanya.

Muna gudanar da gwajin nauyin tsarin hulɗar a cikin tsari guda uku:

  1. gwajin damuwa
  2. Haɗi kawai
  3. Rijistar masu biyan kuɗi

A lokacin gwajin damuwa, muna ƙaddamar da zaren ɗari da yawa, kuma suna ɗaukar tsarin ba tare da tsayawa ba: rubuta saƙonni, ƙirƙirar tattaunawa, karɓar jerin saƙonni. Muna kwaikwayon ayyukan masu amfani na yau da kullun (samu jerin saƙonnin da ba a karanta ba, rubuta wa wani) da mafita software (wadar da fakitin wani tsari na daban, aiwatar da faɗakarwa).

Misali, wannan shine abin da sashin gwajin damuwa yayi kama:

  • Mai amfani ya shiga
    • Neman tattaunawar ku da ba a karanta ba
    • 50% mai yuwuwar karanta saƙonni
    • 50% mai yuwuwar yin rubutu
    • Mai amfani na gaba:
      • Yana da damar 20% na ƙirƙirar sabon tattaunawa
      • Ba da gangan ya zaɓi kowane tattaunawarsa ba
      • Yana shiga ciki
      • Yana buƙatar saƙonni, bayanan martaba na mai amfani
      • Ƙirƙirar saƙonni guda biyar da aka tuntuɓi ga masu amfani da bazuwar daga wannan tattaunawa
      • Bar tattaunawa
      • Maimaita sau 20
      • Fita, ya koma farkon rubutun

    • A chatbot yana shiga tsarin (yana kwaikwayon saƙon daga lambar aikace-aikacen)
      • Yana da damar 50% na ƙirƙirar sabon tasha don musayar bayanai (tattaunawa ta musamman)
      • 50% mai yuwuwa rubuta saƙo zuwa kowane tashoshin da ke akwai

Yanayin "Haɗin Haɗi kawai" ya bayyana saboda dalili. Akwai yanayi: masu amfani sun haɗa tsarin, amma ba su shiga ciki ba tukuna. Kowane mai amfani yana kunna kwamfutar da ƙarfe 09:00 na safe, ya kafa haɗi zuwa uwar garken kuma ya yi shiru. Wadannan mutane suna da haɗari, akwai da yawa daga cikinsu - kawai fakitin da suke da su shine PING/PONG, amma suna ci gaba da haɗi zuwa uwar garken (ba za su iya ci gaba da shi ba - idan akwai sabon saƙo). Gwajin ya sake haifar da halin da ake ciki inda yawancin irin waɗannan masu amfani ke ƙoƙarin shiga cikin tsarin a cikin rabin sa'a. Yana kama da gwajin danniya, amma mayar da hankali kan wannan shigarwa ta farko - don kada a sami gazawa (mutum bai yi amfani da tsarin ba, kuma ya riga ya fadi - yana da wuya a yi tunanin wani abu mafi muni).

Rubutun rijistar masu biyan kuɗi yana farawa daga farawa na farko. Mun gudanar da gwajin danniya kuma mun tabbata cewa tsarin bai ragu ba a lokacin da ake aikawa. Amma masu amfani sun zo kuma rajistar ta fara lalacewa saboda ɓata lokaci. Lokacin yin rijista mun yi amfani da shi / dev / bazuwar, wanda ke da alaƙa da entropy na tsarin. Sabar ba ta da lokaci don tara isassun entropy kuma lokacin da aka nemi sabon SecureRandom, ya daskare na daƙiƙa goma. Akwai hanyoyi da yawa daga wannan yanayin, misali: canzawa zuwa mafi ƙarancin tsaro / dev/urandom, shigar da kwamiti na musamman wanda ke haifar da entropy, samar da lambobi bazuwar gaba kuma adana su a cikin tafki. Mun rufe matsalar na ɗan lokaci tare da tafkin, amma tun daga lokacin muna gudanar da gwaji na daban don yin rajistar sababbin masu biyan kuɗi.

Muna amfani da matsayin mai ɗaukar nauyi JMeter. Bai san yadda ake aiki da websocket ba; yana buƙatar plugin. Na farko a cikin sakamakon bincike na tambayar "jmeter websocket" sune: labarai daga BlazeMeter, wanda ke ba da shawara plugin ta Maciej Zaleski.

A nan ne muka yanke shawarar farawa.

Kusan nan da nan bayan fara gwaji mai tsanani, mun gano cewa JMeter ya fara zubar da ƙwaƙwalwar ajiya.

Filogin babban labari ne daban; tare da taurari 176, yana da cokali 132 akan github. Marubucin da kansa bai sadaukar da shi ba tun 2015 (mun dauke shi a cikin 2015, sannan bai haifar da zato ba), batutuwan github da yawa game da leaks na ƙwaƙwalwar ajiya, buƙatun ja na 7 da ba a rufe ba.
Idan kun yanke shawarar yin gwajin nauyi ta amfani da wannan plugin ɗin, da fatan za a kula da tattaunawa masu zuwa:

  1. A cikin mahalli da yawa, an yi amfani da LinkedList na yau da kullun, kuma sakamakon ya kasance NPE a lokacin aiki. Ana iya magance wannan ta hanyar canzawa zuwa ConcurrentLinkedDeque ko ta hanyar tubalan da aka daidaita. Mun zabi zabin farko da kanmu (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Ƙwaƙwalwar ƙwaƙwalwa; lokacin cire haɗin, bayanan haɗin ba a share (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. A cikin yanayin yawo (lokacin da ba a rufe shafin yanar gizon a ƙarshen samfurin, amma ana amfani da shi daga baya a cikin shirin), Tsarin amsawa ba sa aiki (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

Wannan yana ɗaya daga cikin waɗanda ke kan github. Abin da muka yi:

  1. An dauka cokali mai yatsu Elyran Kogan (@elyrank) - yana gyara matsalolin 1 da 3
  2. An warware matsalar 2
  3. An sabunta jetty daga 9.2.14 zuwa 9.3.12
  4. Nannade SimpleDateFormat a cikin ThreadLocal; SimpleDateFormat ba shine amintaccen zaren ba, wanda ya haifar da NPE a lokacin aiki
  5. Kafaffen wani zubin ƙwaƙwalwar ajiya (An rufe haɗin ba daidai ba lokacin da aka cire haɗin)

Duk da haka yana gudana!

Tunawa ya fara ƙarewa ba a rana ɗaya ba, amma a cikin biyu. Babu cikakken lokaci da ya rage, don haka mun yanke shawarar ƙaddamar da ƙananan zaren, amma akan wakilai huɗu. Ya kamata wannan ya isa aƙalla mako guda.

Kwanaki biyu sun shude...

Yanzu Hazelcast yana kurewa ƙwaƙwalwar ajiya. Lokulan sun nuna cewa bayan kwanaki biyu na gwaji, Hazelcast ya fara kokawa game da rashin ƙwaƙwalwar ajiya, kuma bayan wani lokaci gungu ya rabu, kuma nodes ya ci gaba da mutuwa daya bayan daya. Mun haɗa JVisualVM zuwa hazelcast kuma mun ga "tashi mai tashi" - ana kiransa GC akai-akai, amma ya kasa share ƙwaƙwalwar ajiya.

Ta yaya kuma dalilin da yasa muka rubuta sabis na ma'aunin nauyi mai nauyi don 1C: Kasuwanci: Java, PostgreSQL, Hazelcast

Ya bayyana cewa a cikin hazelcast 3.4, lokacin share taswira / MultiMap (map.destroy()), ƙwaƙwalwar ajiya ba ta da cikakkiyar 'yanci:

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

Yanzu an gyara kwaro a cikin 3.5, amma matsala ce a lokacin. Mun ƙirƙiri sabbin taswirori da yawa tare da sunaye masu ƙarfi kuma mun share su bisa ga tunaninmu. Lambar ta yi kama da haka:

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

Kira:

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

MultiMap an ƙirƙira don kowane biyan kuɗi kuma an share shi lokacin da ba a buƙata ba. Mun yanke shawarar cewa za mu fara taswira , maɓallin zai zama sunan biyan kuɗi, kuma ƙimar za su kasance masu gano zaman (daga cikinsu za ku iya samun masu gano mai amfani, idan ya cancanta).

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

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

Jadawalin sun inganta.

Ta yaya kuma dalilin da yasa muka rubuta sabis na ma'aunin nauyi mai nauyi don 1C: Kasuwanci: Java, PostgreSQL, Hazelcast

Menene kuma muka koya game da gwajin lodi?

  1. JSR223 yana buƙatar a rubuta shi a cikin tsagi kuma ya haɗa da cache ɗin tattarawa - yana da sauri da sauri. mahada.
  2. Hotunan Jmeter-Plugins sun fi sauƙin fahimta fiye da daidaitattun. mahada.

Game da kwarewarmu da Hazelcast

Hazelcast sabon samfuri ne a gare mu, mun fara aiki tare da shi daga sigar 3.4.1, yanzu sabar samar da mu tana gudana sigar 3.9.2 (a lokacin rubutawa, sabon sigar Hazelcast shine 3.10).

Ƙarfin ID

Mun fara da masu gano lamba. Bari mu yi tunanin cewa muna buƙatar wani Dogon don sabon mahalli. Jeri a cikin bayanan bai dace ba, allunan suna da hannu a cikin sharding - ya bayyana cewa akwai ID na saƙo = 1 a cikin DB1 da ID ɗin saƙo = 1 a cikin DB2, ba za ku iya sanya wannan ID a cikin Elasticsearch ba, ko a cikin Hazelcast. , amma mafi munin abu shine idan kuna son haɗa bayanan daga rumbun adana bayanai guda biyu zuwa ɗaya (misali, yanke shawarar cewa ma'aunin bayanai guda ɗaya ya ishe waɗannan masu biyan kuɗi). Kuna iya ƙara AtomicLongs da yawa zuwa Hazelcast kuma ku ajiye ma'aunin a can, sannan aikin samun sabon ID yana ƙaruwaAndGet tare da lokacin buƙatun Hazelcast. Amma Hazelcast yana da wani abu mafi kyau - FlakeIdGenerator. Lokacin tuntuɓar kowane abokin ciniki, ana ba su kewayon ID, misali, na farko - daga 1 zuwa 10, na biyu - daga 000 zuwa 10, da sauransu. Yanzu abokin ciniki na iya fitar da sabbin abubuwan ganowa da kansa har sai iyakar da aka ba shi ya ƙare. Yana aiki da sauri, amma lokacin da kuka sake kunna aikace-aikacen (da abokin ciniki na Hazelcast), sabon jerin yana farawa - don haka tsallakewa, da sauransu. Bugu da ƙari, masu haɓakawa ba su fahimci ainihin dalilin da yasa ID ɗin ke da lamba ba, amma ba su da daidaituwa. Mun auna komai kuma muka koma UUIDs.

Af, ga wadanda suke so su zama kamar Twitter, akwai irin wannan ɗakin karatu na Snowcast - wannan shine aiwatar da Snowflake a saman Hazelcast. Kuna iya kallonsa anan:

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

Amma ba mu sake samun kusa da shi ba.

TransactionalMap.maye gurbin

Wani abin mamaki: TransactionalMap.maye gurbin baya aiki. Ga gwaji:

@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

Dole ne in rubuta madadina ta amfani da 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);
}

Gwada ba kawai tsarin bayanai na yau da kullun ba, har ma da nau'ikan ma'amalarsu. Ya faru cewa IMap yana aiki, amma TransactionalMap ba ya wanzu.

Saka sabon JAR ba tare da bata lokaci ba

Da farko, mun yanke shawarar yin rikodin abubuwan azuzuwan mu a Hazelcast. Misali, muna da ajin Application, muna so mu ajiye mu karanta. Ajiye:

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

Kamar:

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

Komai yana aiki. Sannan mun yanke shawarar gina fihirisa a cikin Hazelcast don bincika ta:

map.addIndex("subscriberId", false);

Kuma lokacin rubuta sabuwar ƙungiya, sun fara karɓar ClassNotFoundException. Hazelcast yayi ƙoƙarin ƙarawa zuwa fihirisar, amma bai san komai game da ajinmu ba kuma yana son a ba da JAR mai wannan ajin. Mun yi haka kawai, komai ya yi aiki, amma wata sabuwar matsala ta bayyana: yadda za a sabunta JAR ba tare da dakatar da gungu gaba ɗaya ba? Hazelcast baya ɗaukar sabon JAR yayin sabuntawar kumburi-da-ƙulli. A wannan lokacin mun yanke shawarar cewa za mu iya rayuwa ba tare da binciken fihirisa ba. Bayan haka, idan kun yi amfani da Hazelcast azaman maɓalli mai ƙima, to komai zai yi aiki? Ba da gaske ba. Anan kuma halayen IMap da TransactionalMap sun bambanta. Inda IMap ba ta damu ba, TransactionalMap yana jefa kuskure.

IMap. Muna rubuta abubuwa 5000, karanta su. Ana sa ran komai.

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

Amma ba ya aiki a cikin ma'amala, muna samun 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();
        }
    });
}

A cikin 3.8, tsarin ƙaddamar da ajin mai amfani ya bayyana. Kuna iya zayyana kundi mai mahimmanci guda ɗaya kuma ku sabunta fayil ɗin JAR akansa.

Yanzu mun canza tsarin mu gaba ɗaya: mun tsara shi da kanmu zuwa JSON kuma mu adana shi a cikin Hazelcast. Hazelcast baya buƙatar sanin tsarin azuzuwan mu, kuma zamu iya sabuntawa ba tare da bata lokaci ba. Ana sarrafa sigar abubuwan yanki ta aikace-aikacen. Daban-daban na aikace-aikacen na iya gudana a lokaci guda, kuma yanayi yana yiwuwa lokacin da sabon aikace-aikacen ke rubuta abubuwa da sabbin filayen, amma tsohon bai sani ba tukuna game da waɗannan filayen. Kuma a lokaci guda, sabon aikace-aikacen yana karanta abubuwan da tsohuwar aikace-aikacen ta rubuta waɗanda ba su da sabbin filayen. Muna gudanar da irin waɗannan yanayi a cikin aikace-aikacen, amma don sauƙi ba mu canza ko share filayen ba, muna fadada azuzuwan ne kawai ta ƙara sabbin filayen.

Yadda muke tabbatar da babban aiki

Tafiya huɗu zuwa Hazelcast - mai kyau, biyu zuwa bayanan bayanai - mara kyau

Je zuwa cache don bayanai yana da kyau koyaushe fiye da zuwa bayanan bayanai, amma ba kwa son adana bayanan da ba a yi amfani da su ba. Mun bar yanke shawara game da abin da za a cache har zuwa mataki na ƙarshe na ci gaba. Lokacin da aka ƙididdige sabon aikin, muna kunna shigar da duk tambayoyin a cikin PostgreSQL (log_min_duration_statement zuwa 0) kuma muna gudanar da gwajin lodi na mintuna 20. Yin amfani da rajistan ayyukan da aka tattara, abubuwan amfani kamar pgFouine da pgBadger na iya gina rahotannin nazari. A cikin rahotanni, da farko muna neman tambayoyin a hankali da akai-akai. Don jinkirin tambayoyin, muna gina tsarin aiwatarwa (BAYYANA) kuma muna kimanta ko za a iya ƙara irin wannan tambayar. Bukatu akai-akai don bayanan shigarwa iri ɗaya sun dace sosai a cikin ma'ajin. Muna ƙoƙarin kiyaye tambayoyin "lalata", tebur ɗaya kowace tambaya.

Ayyuka

SV a matsayin sabis na kan layi an sanya shi aiki a cikin bazara na 2017, kuma azaman samfurin daban, an saki SV a cikin Nuwamba 2017 (a wancan lokacin a matsayin sigar beta).

A cikin fiye da shekara guda na aiki, babu matsaloli masu tsanani a cikin aikin sabis na kan layi na CB. Muna saka idanu akan sabis na kan layi ta hanyar Zabbix, tattara da turawa daga bamboo.

Ana ba da rarraba uwar garken SV a cikin nau'ikan fakiti na asali: RPM, DEB, MSI. Ƙari don Windows muna samar da mai sakawa guda ɗaya a cikin nau'i na EXE guda ɗaya wanda ke shigar da sabar, Hazelcast da Elasticsearch akan na'ura ɗaya. Da farko mun kira wannan sigar shigarwa a matsayin sigar “demo”, amma yanzu ya bayyana a sarari cewa wannan shine mafi mashahuri zaɓin turawa.

source: www.habr.com

Add a comment