Kedu na ihe kpatara anyị ji dee ọrụ nwere ike ibu ibu maka 1C: Enterprise: Java, PostgreSQL, Hazelcast

N'isiokwu a, anyị ga-ekwu banyere otú na ihe mere anyị ji malite Usoro mmekọrịta - usoro na-ebufe ozi n'etiti ngwa ndị ahịa na 1C: Sava ụlọ ọrụ - site na ịtọ ọrụ ruo n'iche echiche site na nkọwa nhazi na mmejuputa iwu.

Sistemụ mmekọrịta (nke a na-akpọ SV) bụ usoro izi ozi nke na-anabataghị mmejọ nke nwere nnyefe n'ezie. Emebere SV ka ọ bụrụ ọrụ dị elu nke nwere nnukwu scalability, dị ma dị ka ọrụ ịntanetị (nke 1C nyere) yana dịka ngwaahịa a na-emepụta nke ukwuu nke enwere ike ibunye na ụlọ ọrụ nkesa gị.

SV na-eji nchekwa ekesa hazelcast na search engine Elasticsearch. Anyị ga-ekwukwa maka Java na otu anyị si atụsa PostgreSQL n'ụzọ kwụ ọtọ.
Kedu na ihe kpatara anyị ji dee ọrụ nwere ike ibu ibu maka 1C: Enterprise: Java, PostgreSQL, Hazelcast

Ulationkpụzi nsogbu a

Iji mee ka o doo anya ihe mere anyị ji mepụta System Interaction System, m ga-agwa gị ntakịrị banyere otú mmepe nke ngwa azụmahịa na 1C si arụ ọrụ.

Iji malite, ntakịrị banyere anyị maka ndị na-amabeghị ihe anyị na-eme :) Anyị na-eme 1C: Enterprise technology platform. Ikpo okwu na-agụnye ngwá ọrụ mmepe ngwa azụmahịa, yana oge ịgba ọsọ na-enye ohere ka ngwa ahịa na-agba ọsọ na gburugburu ebe obibi cross-platform.

Usoro mmepe nke onye ahịa-nkesa

Ngwa azụmahịa emepụtara na 1C: Enterprise na-arụ ọrụ n'ọkwa atọ onye ahịa-ihe nkesa ije "DBMS - ngwa nkesa - ahịa". Edere koodu ngwa asụsụ 1C arụnyere n'ime ya, enwere ike igbu ya na ihe nkesa ngwa ma ọ bụ na onye ahịa. Ọrụ niile na ngwa ngwa (akwụkwọ ndekọ aha, akwụkwọ, wdg), yana ịgụ na ide nchekwa data, a na-arụ naanị na ihe nkesa. A na-arụkwa ọrụ nke ụdị na interface iwu na ihe nkesa. Onye ahịa ahụ na-arụ ọrụ ịnata, imeghe na igosipụta ụdị, "na-ekwurịta okwu" na onye ọrụ (ịdọ aka ná ntị, ajụjụ ...), obere mgbako n'ụdị nke chọrọ nzaghachi ngwa ngwa (dịka ọmụmaatụ, ịba ụba ọnụahịa site na ọnụ ọgụgụ), na-arụ ọrụ na faịlụ mpaghara, na-arụ ọrụ na akụrụngwa.

Na koodu ngwa, ndị nkụnye eji isi mee nke usoro na ọrụ ga-egosipụta nke ọma ebe a ga-eme koodu ahụ - iji &AtClient / &AtServer ntuziaka (&AtClient / &AtServer na ụdị asụsụ bekee). Ndị mmepe 1C ga-agbazi m ugbu a site n'ikwu na ntuziaka bụ n'ezie karịa, ma maka anyị nke a adịghị mkpa ugbu a.

Ị nwere ike ịkpọ koodu nkesa site na koodu ndị ahịa, mana ịnweghị ike ịkpọ koodu ahịa site na koodu nkesa. Nke a bụ njedebe bụ isi anyị mere maka ọtụtụ ihe kpatara ya. Karịsịa, n'ihi na koodu nkesa ga-ederịrị n'ụzọ nke na ọ na-eme otu ụzọ n'agbanyeghị ebe a na-akpọ ya - site na onye ahịa ma ọ bụ site na ihe nkesa. Na n'ihe gbasara ịkpọ koodu nkesa site na koodu nkesa ọzọ, ọ dịghị onye ahịa dị otú ahụ. Na n'ihi na n'oge mmebe nke koodu nkesa, onye ahịa na-akpọ ya nwere ike mechie, pụọ ngwa, na ihe nkesa agaghịzi enwe onye ọ bụla na-akpọ.

Kedu na ihe kpatara anyị ji dee ọrụ nwere ike ibu ibu maka 1C: Enterprise: Java, PostgreSQL, Hazelcast
Koodu na-ejikwa bọtịnụ pịa: ịkpọ usoro nkesa site na onye ahịa ga-arụ ọrụ, ịkpọ usoro onye ahịa site na ihe nkesa agaghị eme

Nke a pụtara na ọ bụrụ na anyị chọrọ izipu ụfọdụ ozi site na ihe nkesa na ngwa ndị ahịa, dịka ọmụmaatụ, na ọgbọ nke akụkọ "ogologo oge" agwụla ma enwere ike ilele akụkọ ahụ, anyị enweghị usoro dị otú ahụ. Ị ga-eji aghụghọ, dịka ọmụmaatụ, nyochaa ihe nkesa site na koodu ndị ahịa. Mana usoro a na-ebu sistemu ahụ na oku na-enweghị isi, yana n'ozuzu ọ naghị adị oke mma.

Ọ dịkwa mkpa, dịka ọmụmaatụ, mgbe oku ekwentị rutere inu- mgbe ị na-akpọ oku, gwa onye ahịa ngwa maka nke a ka o wee jiri nọmba onye na-akpọ oku chọta ya na nchekwa data ibe ma gosi ozi onye ọrụ gbasara onye ọkpụkpọ oku. Ma ọ bụ, dịka ọmụmaatụ, mgbe iwu rutere n'ụlọ nkwakọba ihe, gwa onye ahịa ngwa maka nke a. N'ozuzu, enwere ọtụtụ ikpe ebe usoro dị otú ahụ ga-aba uru.

Mmepụta ahụ n'onwe ya

Mepụta usoro izi ozi. Ọsọ ọsọ, ntụkwasị obi, nwere nnyefe ekwe nkwa, yana ikike ịchọ ozi n'ụzọ dị nro. Dabere na usoro ahụ, mejuputa onye ozi (ozi, oku vidiyo) na-agba n'ime ngwa 1C.

Chepụta usoro ahụ ka ọ bụrụ nha nha nha. A ghaghị kpuchie ibu na-arịwanye elu site n'ịba ụba ọnụ ọgụgụ nke ọnụ.

Mmejuputa iwu

Anyị kpebiri na anyị agaghị ejikọta akụkụ nkesa nke SV ozugbo n'ime 1C: Enterprise platform, kama iji mejuputa ya dị ka ngwaahịa dị iche iche, API nke nwere ike ịkpọ site na koodu nke ngwọta ngwa 1C. Emere nke a n'ihi ọtụtụ ihe kpatara ya, nke bụ isi bụ na m chọrọ ime ka o kwe omume ịgbanwe ozi n'etiti ngwa 1C dị iche iche (dịka ọmụmaatụ, n'etiti njikwa ahia na Accounting). Ngwa 1C dị iche iche nwere ike ịgba ọsọ na ụdị dị iche iche nke 1C:Enterprise platform, dị na sava dị iche iche, wdg. N'ọnọdụ ndị dị otú ahụ, mmejuputa SV dị ka ngwaahịa dị iche iche dị "n'akụkụ" nke nrụnye 1C bụ ihe ngwọta kachasị mma.

Yabụ, anyị kpebiri ime SV dị ka ngwaahịa dị iche. Anyị na-akwado ka obere ụlọ ọrụ jiri ihe nkesa CB anyị rụnyere n'igwe ojii anyị (wss://1cdialog.com) iji zere nnukwu ọnụ ahịa metụtara nrụnye na nhazi nke sava mpaghara. Ndị ahịa buru ibu nwere ike ịhụ na ọ dị mma ịwụnye sava CB nke ha n'ụlọ ọrụ ha. Anyị ji usoro yiri nke ahụ na ngwaahịa SaaS igwe ojii anyị 1c dị ọhụrụ - A na-emepụta ya dị ka ngwaahịa a na-emepụta maka nrụnye na saịtị ndị ahịa, a na-etinyekwa ya na igwe ojii anyị. https://1cfresh.com/.

Ngwa

Iji kesaa ibu na ntachi obi mmejọ, anyị agaghị ebuga ọ bụghị otu ngwa Java, mana ọtụtụ, na-eji njikwa ibu dị n'ihu ha. Ọ bụrụ na ịchọrọ ịnyefe ozi site na ọnụ gaa na ọnụ, jiri bipụta/ denye aha na Hazelcast.

Nkwurịta okwu n'etiti onye ahịa na ihe nkesa bụ site na websocket. Ọ dabara nke ọma maka sistemu oge.

cache ekesara

Anyị họọrọ n'etiti Redis, Hazelcast na Ehcache. Ọ bụ 2015. Redis ka wepụtara ụyọkọ ọhụrụ (ọ dị ọhụrụ, egwu), enwere Sentinel nwere ọtụtụ mmachi. Ehcache amaghị ka esi agbakọta n'ime ụyọkọ (ọrụ a pụtara ka emechara). Anyị kpebiri iji Hazelcast 3.4 nwalee ya.
A na-agbakọta Hazelcast ka ọ bụrụ ụyọkọ n'ime igbe ahụ. Na otu node mode, ọ bụghị nnọọ uru na ike ga-eji dị ka a cache - ọ maghị otú ikpofu data na disk, ọ bụrụ na ị na-atụfu nanị ọnụ, ị na-atụfu data. Anyị na-ebuga ọtụtụ Hazelcasts, n'etiti nke anyị na-akwado data dị oke mkpa. Anyị anaghị akwado cache - anyị echeghị ya.

Maka anyị, Hazelcast bụ:

  • Nchekwa nke oge onye ọrụ. Ọ na-ewe ogologo oge iji gaa na nchekwa data maka nnọkọ oge ọ bụla, yabụ anyị na-etinye oge niile na Hazelcast.
  • Cache. Ọ bụrụ na ị na-achọ profaịlụ onye ọrụ, lelee cache. Dee ozi ọhụrụ - tinye ya na cache.
  • Isiokwu maka nkwurịta okwu n'etiti ngwa ngwa. Ọnụ ụzọ ahụ na-ewepụta mmemme wee tinye ya na isiokwu Hazelcast. Ọnụ ngwa ngwa ndị ọzọ debanyere aha isiokwu a na-anata ma hazie mmemme ahụ.
  • Mkpọchi ụyọkọ. Dịka ọmụmaatụ, anyị na-eji igodo pụrụ iche mepụta mkparịta ụka (mkparịta ụka otu n'ime nchekwa data 1C):

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

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

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

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

Anyị nyochara na ọ nweghị ọwa. Anyị were mkpọchi ahụ, lelee ya ọzọ, wee kee ya. Ọ bụrụ na ịgaghị elele mkpọchi ahụ mgbe iwere mkpọchi ahụ, mgbe ahụ enwere ohere na eriri ọzọ enyochakwara n'oge ahụ ma ga-anwa ịmepụta otu mkparịta ụka - mana ọ dịlarị. Ị nweghị ike igbachi site na iji mkpọchi java emekọrịtara ma ọ bụ mgbe niile. Site na nchekwa data - ọ na-adị ngwa, na ọ bụ ọmịiko maka nchekwa data; site na Hazelcast - nke ahụ bụ ihe ị chọrọ.

Ịhọrọ DBMS

Anyị nwere ahụmịhe dị ukwuu na nke ịga nke ọma na-arụ ọrụ na PostgreSQL yana imekọ ihe na ndị mmepe nke DBMS a.

Ọ dịghị mfe na ụyọkọ PostgreSQL - enwere XL, XC, Citus, mana n'ozuzu ndị a abụghị NoSQL nke na-esi na igbe ahụ pụta. Anyị atụleghị NoSQL dị ka isi nchekwa; o zuru ezu na anyị were Hazelcast, nke anyị na-arụbeghị ọrụ na mbụ.

Ọ bụrụ na ịchọrọ ịbawanye nchekwa data mmekọrịta, nke ahụ pụtara sharding. Dị ka ị maara, na sharding anyị na-ekewa nchekwa data n'ime akụkụ dị iche iche ka e wee tinye nke ọ bụla n'ime ha na sava dị iche.

Ụdị nke mbụ nke sharding anyị chere na ọ nwere ike ikesa tebụl nke ngwa anyị n'ofe sava dị iche iche n'ogo dị iche iche. Enwere ọtụtụ ozi na sava A - biko, ka anyị kwaga akụkụ nke tebụl a gaa na nkesa B. Mkpebi a na-eti mkpu naanị maka njikarịcha akaghi aka, yabụ anyị kpebiri ịmachi onwe anyị na ụzọ ọtụtụ ndị nwe ụlọ.

Ị nwere ike ịgụ gbasara ọtụtụ ndị nwe ụlọ, dịka ọmụmaatụ, na webụsaịtị Citus Data.

SV nwere echiche nke ngwa na ndị debanyere aha. Ngwa bụ ntinye nke ngwa azụmaahịa, dị ka ERP ma ọ bụ Akaụntụ, yana ndị ọrụ ya na data azụmaahịa. Onye debanyere aha bụ nzukọ ma ọ bụ onye e debanyere aha ngwa ahụ na sava SV n'aha ya. Onye debanyere aha nwere ike ịdebanye aha ọtụtụ ngwa, yana ngwa ndị a nwere ike ịgbanwere onwe ha ozi. Onye debanyere aha ghọrọ onye nwe ụlọ na sistemụ anyị. Ozi sitere na ọtụtụ ndị debanyere aha nwere ike ịnọ n'otu nchekwa data anụ ahụ; ọ bụrụ na anyị ahụ na onye debanyere aha amalitela ịmepụta ọtụtụ okporo ụzọ, anyị na-ebuga ya na nchekwa data anụ ahụ dị iche (ma ọ bụ ọbụna ihe nkesa nchekwa data dị iche).

Anyị nwere isi nchekwa data ebe a na-echekwa tebụl ntụgharị nwere ozi gbasara ọnọdụ ọdụ data ndị debanyere aha niile.

Kedu na ihe kpatara anyị ji dee ọrụ nwere ike ibu ibu maka 1C: Enterprise: Java, PostgreSQL, Hazelcast

Iji gbochie isi nchekwa data ka ọ ghara ịbụ ọkpọkọ, anyị na-edobe tebụl ntụgharị (na data ndị ọzọ a na-achọkarị) na ebe nchekwa.

Ọ bụrụ na nchekwa data nke ndị debanyere aha amalite iji nwayọọ, anyị ga-ebipụ ya na nkebi n'ime. Na ọrụ ndị ọzọ anyị na-eji pg_ụzọ.

Ebe ọ bụ na ịhapụ ozi onye ọrụ dị njọ, anyị na-eji ụdị oyiri na-edobe ọdụ data anyị. Nchikota nke synchronous na asynchronous replicas na-enye gị ohere ịme onwe gị mkpuchi ma ọ bụrụ na efu nke isi nchekwa data. Ọnwụ ozi ga-eme naanị ma ọ bụrụ na nchekwa data isi na oyiri ya na-emekọrịta ihe na-ada n'otu oge.

Ọ bụrụ na oyiri mmekọrịta efuola, oyiri asynchronous ga-emekọrịta.
Ọ bụrụ na isi nchekwa data efunahụ, oyiri synchronous na-aghọ isi nchekwa data, na oyiri asynchronous na-aghọ oyiri synchronous.

Elasticsearch maka ọchụchọ

Ebe ọ bụ na, n'etiti ihe ndị ọzọ, SV bụkwa onye ozi, ọ na-achọ ngwa ngwa, dị mfe na nchọta mgbanwe, na-eburu n'uche morphology, na-eji egwuregwu na-ezighi ezi. Anyị kpebiri na anyị agaghị emegharị wiil ahụ wee jiri igwe nchọta n'efu Elasticsearch, nke emere dabere na ọba akwụkwọ Lucene. Anyị na-ebuga Elasticsearch na ụyọkọ (nna ukwu - data - data) iji kpochapụ nsogbu ma ọ bụrụ na ọdịda nke oghere ngwa.

Na github anyị hụrụ Ngwakọta morphology nke Russia maka Elasticsearch wee jiri ya. Na Elasticsearch index anyị na-echekwa mgbọrọgwụ okwu (nke ngwa mgbakwunye na-ekpebi) na N-grams. Ka onye ọrụ na-abanye ederede ka ọ chọọ, anyị na-achọ ederede edere n'etiti N-gram. Mgbe echekwara na ndeksi, a ga-ekewa okwu ahụ "ederede" n'ime N-gram ndị a:

[ndị, tek, tex, ederede, ederede, ek, ex, ext, ederede, ks, kst, ksty, st, sty, ị],

A ga-echekwakwa mgbọrọgwụ nke okwu ahụ bụ́ “ederede”. Ụzọ a na-enye gị ohere ịchọ na mmalite, n'etiti, na na njedebe nke okwu.

Foto zuru ezu

Kedu na ihe kpatara anyị ji dee ọrụ nwere ike ibu ibu maka 1C: Enterprise: Java, PostgreSQL, Hazelcast
Tinyegharịa foto ahụ site na mmalite nke akụkọ, mana na nkọwa:

  • Balancer kpughere na ịntanetị; Anyị nwere nginx, ọ nwere ike ịbụ nke ọ bụla.
  • Ụdị ngwa Java na-akparịta ụka site na Hazelcast.
  • Iji rụọ ọrụ na oghere webụ anyị na-eji ụgbụ.
  • Edere ngwa Java na Java 8 ma nwee ngwugwu OSGi. Atụmatụ ndị a gụnyere ịkwaga Java 10 na mgbanwe na modul.

Mmepe na ule

N'ime usoro mmepe na ịnwale SV, anyị hụrụ ọtụtụ atụmatụ na-adọrọ mmasị nke ngwaahịa anyị na-eji.

Nnwale ibu na mgbapu ebe nchekwa

Ntọhapụ nke ntọhapụ SV ọ bụla gụnyere nnwale ibu. Ọ na-aga nke ọma mgbe:

  • Nnwale ahụ rụrụ ọrụ ọtụtụ ụbọchị na enweghị ọdịda ọrụ
  • Oge nzaghachi maka ọrụ igodo agafeghị oke oke ntụsara ahụ
  • Mbelata arụmọrụ ma atụnyere ụdị nke gara aga abụghị ihe karịrị 10%

Anyị na-ejupụta data nchekwa data - iji mee nke a, anyị na-enweta ozi gbasara onye na-edebanye aha na-arụsi ọrụ ike site na ihe nkesa mmepụta, mụbaa nọmba ya site na 5 (ọnụọgụ ozi, mkparịta ụka, ndị ọrụ) wee nwalee ya otú ahụ.

Anyị na-eme nnwale ibu nke sistemu mmekọrịta na nhazi atọ:

  1. ule nrụgide
  2. Naanị njikọ
  3. Ndebanye aha ndị debanyere aha

N'oge ule nrụgide, anyị na-ebupụta ọtụtụ narị eri, ha na-ebukwa usoro ahụ n'akwụsịghị akwụsị: ide ozi, ịmepụta mkparịta ụka, ịnweta ndepụta ozi. Anyị na-eme ka omume nke ndị ọrụ nkịtị (nweta ndepụta nke ozi m na-agụghị, degara mmadụ akwụkwọ) na ngwọta ngwanrọ (na-ebufe ngwugwu nke nhazi dị iche, hazie njikere).

Dịka ọmụmaatụ, nke a bụ akụkụ nke ule nrụgide ahụ dị ka:

  • Onye ọrụ na-abanye
    • Arịrịọ mkparịta ụka gị na-agụghị
    • 50% nwere ike ịgụ ozi
    • 50% nwere ike ide ederede
    • Onye ọrụ na-esote:
      • Nwere ohere 20% nke ịmepụta mkparịta ụka ọhụrụ
      • Na-ahọrọ nke ọ bụla n'ime mkparịta ụka ya na-akpaghị aka
      • Abanye n'ime
      • Arịrịọ ozi, profaịlụ onye ọrụ
      • Na-emepụta ozi ise e degaara ndị ọrụ na-enweghị usoro site na mkparịta ụka a
      • Hapụ mkparịta ụka
      • Na-emegharị ugboro 20
      • Wepụ, laghachi na mmalite nke edemede ahụ

    • A chatbot na-abanye na sistemụ (na-eṅomi ozi sitere na koodu ngwa)
      • Nwere ohere 50% nke ịmepụta ọwa ọhụrụ maka mgbanwe data (mkparịta ụka pụrụ iche)
      • 50% nwere ike dee ozi na ọwa ọ bụla dị

Ọnọdụ "Naanị Njikọ" pụtara maka ihe kpatara ya. Enwere ọnọdụ: ndị ọrụ ejikọtala usoro ahụ, mana ha etinyebeghị aka. Onye ọrụ ọ bụla na-agbanye kọmpụta n'elekere 09:00 nke ụtụtụ, guzobe njikọ na sava ahụ wee gbachie nkịtị. Ụmụ okorobịa ndị a dị ize ndụ, e nwere ọtụtụ n'ime ha - naanị ngwugwu ha nwere bụ PING/PONG, ma ha na-edobe njikọ na ihe nkesa (ha enweghị ike idobe ya - gịnị ma ọ bụrụ na e nwere ozi ọhụrụ). Nnwale ahụ na-emegharị ọnọdụ ebe ọnụ ọgụgụ buru ibu nke ndị ọrụ dị otú ahụ na-agbalị ịbanye na usoro na ọkara otu awa. Ọ dị ka ule nrụgide, ma ọ na-elekwasị anya kpọmkwem na ntinye mbụ a - nke mere na ọ dịghị ọdịda (mmadụ anaghị eji usoro ahụ eme ihe, ma ọ na-adaba - ọ na-esiri ike iche ihe dị njọ).

Edemede ndebanye aha ndị debanyere aha na-amalite site na mbido mbụ. Anyị mere ule nrụgide ma jide n'aka na usoro ahụ akwụsịghị n'oge akwụkwọ ozi. Mana ndị ọrụ bịara na ndebanye aha ahụ malitere ịda n'ihi oge nkwụsị. Mgbe anyị na-edebanye aha anyị na-eji / dev / aghara, nke metụtara entropy nke usoro. Ihe nkesa ahụ enweghị oge iji kpokọta entropy zuru oke na mgbe achọrọ SecureRandom ọhụrụ, ọ jụrụ oyi ruo iri iri nke sekọnd. Enwere ọtụtụ ụzọ isi pụọ ​​na ọnọdụ a, dịka ọmụmaatụ: gbanwee gaa na obere nchekwa / dev / urandom, wụnye bọọdụ pụrụ iche nke na-emepụta entropy, mepụta nọmba random tupu oge eruo ma chekwaa ha na ọdọ mmiri. Anyị ji ọdọ mmiri mechie nsogbu ahụ nwa oge, mana kemgbe ahụ anyị na-agba ule dị iche maka ịdenye aha ndị debanyere aha ọhụrụ.

Anyị na-eji dị ka onye na-ebu ibu JMita. Ọ maghị ka e si arụ ọrụ na websocket; ọ chọrọ ngwa mgbakwunye. Nke mbụ na nsonaazụ ọchụchọ maka ajụjụ "jmeter websocket" bụ: akụkọ sitere na BlazeMeter, nke na-akwado ngwa mgbakwunye nke Maciej Zaleski.

Ọ bụ ebe ahụ ka anyị kpebiri ibido.

Ihe fọrọ nke nta ka ọ bụrụ ozugbo ịmalitere ule siri ike, anyị chọpụtara na JMeter malitere ịmịpụ ebe nchekwa.

Ngwa mgbakwunye bụ nnukwu akụkọ dị iche; nwere kpakpando 176, o nwere ndụdụ 132 na github. Onye edemede n'onwe ya etinyebeghị ya kemgbe 2015 (anyị were ya na 2015, mgbe ahụ ọ welitere enyo enyo), ọtụtụ okwu github gbasara ebe nchekwa nchekwa, arịrịọ 7 na-emechighị emechi.
Ọ bụrụ na ị kpebie iji ngwa mgbakwunye a rụọ nnwale ibu, biko ṅaa ntị na mkparịta ụka ndị a:

  1. N'ebe enwere ọtụtụ eriri, ejiri LinkedList oge niile, nsonaazụ ya bụ NPE na runtime. Enwere ike idozi nke a site n'ịgbanwe na ConcurrentLinkedDeque ma ọ bụ site na ngọngọ mekọrịtara ọnụ. Anyị họọrọ nhọrọ nke mbụ maka onwe anyị (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Nhapu ebe nchekwa; mgbe ị na-ewepụ njikọ, anaghị ehichapụ ozi njikọ (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. Na usoro nkwanye ugwu (mgbe emechighị websocket na njedebe nke ihe nlele, mana ejiri ya emechaa na atụmatụ), usoro nzaghachi anaghị arụ ọrụ (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

Nke a bụ otu n'ime ndị na github. Ihe anyị mere:

  1. ewerela ndụdụ Elyran Kogan (@elyrank) - ọ na-edozi nsogbu 1 na 3
  2. E doziri nsogbu 2
  3. Jetty emelitere site na 9.2.14 ruo 9.3.12
  4. Kechie SimpleDateFormat na ThreadLocal; SimpleDateFormat abụghị eri-nchekwa, nke butere NPE na oge ojiri gaa
  5. Edoziri ihie ebe nchekwa ọzọ (njikọ ahụ emechiri ezighi ezi mgbe ọ kwụsịrị)

Ma ọ na-asọ!

Ebe nchekwa malitere ịpụ ọ bụghị n'otu ụbọchị, kama na abụọ. Ọ nweghị oge fọdụrụ, yabụ anyị kpebiri ịmalite eri ole na ole, mana na ndị ọrụ anọ. Nke a gaara ezuru opekata mpe otu izu.

Ụbọchị abụọ agafeela...

Ugbu a Hazelcast na-agwụcha ebe nchekwa. Akwụkwọ ndekọ ahụ gosiri na ka ụbọchị ole na ole nke ule gasịrị, Hazelcast malitere mkpesa maka enweghị ebe nchekwa, ma mgbe oge ụfọdụ gasịrị ụyọkọ ahụ daa, ọnụ ọnụ ahụ nọgidere na-anwụ n'otu n'otu. Anyị jikọtara JVisualVM na hazelcast wee hụ “nhụhụ na-ebili” - a na-akpọ ya GC mgbe niile, mana enweghị ike ikpochapụ ebe nchekwa ahụ.

Kedu na ihe kpatara anyị ji dee ọrụ nwere ike ibu ibu maka 1C: Enterprise: Java, PostgreSQL, Hazelcast

Ọ tụgharịrị na na hazelcast 3.4, mgbe ị na-ehichapụ maapụ / multiMap (map.destroy()), ebe nchekwa anaghị ahapụ kpamkpam:

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

A doziri ahụhụ ahụ na 3.5, mana ọ bụ nsogbu n'oge ahụ. Anyị mepụtara ọtụtụ maps ọhụrụ nwere aha dị ike wee hichapụ ha dịka ezi uche anyị siri dị. Koodu ahụ dị ka nke a:

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

Kpọọ:

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

Emepụtara multiMap maka ndenye aha ọ bụla wee hichapụ ya mgbe ọ na-achọghị ya. Anyị kpebiri na anyị ga-amalite Map , igodo ga-abụ aha ndenye aha, na ụkpụrụ ga-abụ ihe nchọpụta nnọkọ (nke ị nwere ike nweta njirimara njirimara, ọ bụrụ na ọ dị mkpa).

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

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

chaatị ndị a emeziwanyela.

Kedu na ihe kpatara anyị ji dee ọrụ nwere ike ibu ibu maka 1C: Enterprise: Java, PostgreSQL, Hazelcast

Kedu ihe ọzọ anyị mụtara gbasara nyocha ibu?

  1. JSR223 kwesịrị ka ede ya n'ọgba ma tinye cache mkpokọta - ọ na-adị ngwa ngwa. njikọ.
  2. Eserese Jmeter-Plugins dị mfe nghọta karịa nke ọkọlọtọ. njikọ.

Banyere ahụmịhe anyị na Hazelcast

Hazelcast bụ ngwaahịa ọhụrụ maka anyị, anyị malitere ịrụ ọrụ na ya site na ụdị 3.4.1, ugbu a ihe nkesa mmepụta anyị na-arụ ọrụ 3.9.2 (n'oge ederede, ụdị ọhụrụ nke Hazelcast bụ 3.10).

Ọgbọ ID

Anyị ji ihe nchọpụta integer malite. Ka anyị were ya na anyị chọrọ Ogologo ọzọ maka ụlọ ọrụ ọhụrụ. Usoro na nchekwa data adịghị mma, tebụl na-etinye aka na sharding - ọ na-apụta na e nwere ozi ID = 1 na DB1 na ozi ID = 1 na DB2, ị nweghị ike itinye NJ a na Elasticsearch, ma ọ bụ na Hazelcast. , ma ihe kachasị njọ bụ ma ọ bụrụ na ịchọrọ ijikọ data sitere na ọdụ data abụọ n'ime otu (dịka ọmụmaatụ, ikpebi na otu nchekwa data zuru ezu maka ndị debanyere aha a). Ị nwere ike tinye ọtụtụ AtomicLongs na Hazelcast ma debe counter ahụ, mgbe ahụ arụmọrụ nke ịnweta ID ọhụrụ na-abawanye na-enweta gbakwunyere oge maka arịrịọ Hazelcast. Mana Hazelcast nwere ihe kacha mma - FlakeIdGenerator. Mgbe ị na-akpọtụrụ onye ahịa ọ bụla, a na-enye ha ọnụọgụ ID, dịka ọmụmaatụ, nke mbụ - site na 1 ruo 10, nke abụọ - site na 000 ruo 10, na ndị ọzọ. Ugbu a onye ahịa nwere ike wepụta ihe nchọpụta ọhụrụ n'onwe ya ruo mgbe oke enyere ya kwụsịrị. Ọ na-arụ ọrụ ngwa ngwa, mana mgbe ịmalitegharịa ngwa ahụ (yana onye ahịa Hazelcast), usoro ọhụrụ ga-amalite - yabụ na-awụlikwa elu, wdg. Na mgbakwunye, ndị mmepe anaghị aghọta n'ezie ihe kpatara ID ji bụrụ integer, mana enweghị nkwekọrịta. Anyị tụlere ihe niile wee tụgharịa gaa na UUID.

Site n'ụzọ, maka ndị chọrọ ịdị ka Twitter, enwere ọbá akwụkwọ Snowcast dị otú ahụ - nke a bụ mmejuputa Snowflake n'elu Hazelcast. Ị nwere ike ịhụ ya ebe a:

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

Ma anyị enwebeghị ike ime ya ọzọ.

TransactionalMap. dochie

Ihe ijuanya ọzọ: TransactionalMap.replace anaghị arụ ọrụ. Nke a bụ ule:

@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

Ekwesịrị m iji getForUpdate dee nnọchi nke m:

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

Nwalee ọ bụghị naanị usoro data mgbe niile, kamakwa ụdị azụmahịa ha. Ọ na-eme na IMap na-arụ ọrụ, mana TransactionalMap adịghịzi adị.

Fanye JAR ọhụrụ na-enweghị oge nkwụsị

Nke mbụ, anyị kpebiri idekọ ihe nke klaasị anyị na Hazelcast. Dịka ọmụmaatụ, anyị nwere klas ngwa, anyị chọrọ ịchekwa ma gụọ ya. Chekwa:

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

Anyị na-agụ, sị:

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

Ihe niile na-arụ ọrụ. Mgbe ahụ, anyị kpebiri iwupụta ndeksi na Hazelcast iji chọọ site na:

map.addIndex("subscriberId", false);

Ma mgbe ha na-ede ụlọ ọrụ ọhụrụ, ha malitere ịnata ClassNotFoundException. Hazelcast nwara itinye na ndeksi, mana ọ maghị ihe ọ bụla gbasara klaasị anyị ma chọọ ka e wetara ya JAR nwere klaasị a. Anyị mere nke ahụ, ihe niile na-arụ ọrụ, mana nsogbu ọhụrụ pụtara: otu esi emelite JAR na-enweghị nkwụsị kpamkpam? Hazelcast anaghị ebuli JAR ọhụrụ n'oge mmelite ọnụ-na-ọnụ. N'oge a, anyị kpebiri na anyị nwere ike ịdị ndụ na-enweghị nyocha index. E kwuwerị, ọ bụrụ na ị na-eji Hazelcast dị ka ụlọ ahịa isi-uru, mgbe ahụ ihe niile ga-arụ ọrụ? Ọ bụchaghị. N'ebe a ọzọ omume IMap na TransactionalMap dị iche. Ebe imap achọghị ịma, TransactionalMap na-atụfu mperi.

IMap. Anyị na-ede ihe 5000, gụọ ha. A na-atụ anya ihe niile.

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

Mana ọ naghị arụ ọrụ na azụmahịa, anyị na-enweta 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();
        }
    });
}

Na 3.8, usoro ntinye klaasị onye ọrụ pụtara. Ị nwere ike ịmepụta otu ọnụ ụzọ ma melite faịlụ JAR na ya.

Ugbu a anyị agbanweela ụzọ anyị kpamkpam: anyị na-edobe ya n'onwe anyị na JSON wee chekwaa ya na Hazelcast. Hazelcast achọghị ịma nhazi nke klaasị anyị, anyị nwere ike imelite na-enweghị oge. Ngwa na-achịkwa nsụgharị nke ihe ngalaba. Ụdị ngwa dị iche iche nwere ike na-agba ọsọ n'otu oge, na ọnọdụ ga-ekwe omume mgbe ngwa ọhụrụ ahụ na-ede ihe na ubi ọhụrụ, mana nke ochie amabeghị banyere ubi ndị a. Ma n'otu oge ahụ, ngwa ọhụrụ na-agụ ihe ndị e dere site na ngwa ochie na-enweghị ebe ọhụrụ. Anyị na-ejikwa ọnọdụ ndị dị otú ahụ n'ime ngwa ahụ, mana maka ịdị mfe anyị anaghị agbanwe ma ọ bụ hichapụ ubi, naanị anyị na-agbasa klaasị site na ịgbakwunye mpaghara ọhụrụ.

Otu anyị si hụ na arụmọrụ dị elu

Njem anọ na Hazelcast - dị mma, abụọ na nchekwa data - ọjọọ

Ịga na cache maka data dị mma mgbe niile karịa ịga na nchekwa data, mana ị chọghịkwa ịchekwa ndekọ ndị na-ejighị ya. Anyị na-ahapụ mkpebi banyere ihe ị ga-echekwa ruo oge ikpeazụ nke mmepe. Mgbe etinyere koodu ọrụ ọhụrụ ahụ, anyị na-agbanye ntinye nke ajụjụ niile na PostgreSQL (log_min_duration_statement na 0) ma na-anwale ule maka nkeji 20. N'iji ndekọ anakọtara, ihe ndị dị ka pgFouine na pgBadger nwere ike ịmepụta akụkọ nyocha. N'ime akụkọ, anyị na-achọkarị ajụjụ ngwa ngwa na ugboro ugboro. Maka ajụjụ nwayọ, anyị na-arụ atụmatụ mmebe (KWUO) wee nyochaa ma enwere ike ịme ngwa ngwa ajụjụ dị otú ahụ. Arịrịọ ugboro ugboro maka otu data ntinye ahụ dabara nke ọma na cache. Anyị na-agbalị idobe ajụjụ “dị larịị”, otu tebụl kwa ajụjụ.

Nrigbu

A na-etinye SV dị ka ọrụ ntanetị n'ọrụ n'oge opupu ihe ubi nke 2017, yana dịka ngwaahịa dị iche iche, SV wepụtara na November 2017 (n'oge ahụ na ọnọdụ beta).

N'ime ihe karịrị otu afọ nke arụ ọrụ, enweghi nsogbu siri ike na ọrụ nke ọrụ ntanetị CB. Anyị na-enyocha ọrụ ịntanetị site na Zabbix, nakọta ma bugharịa site na Bamboo.

A na-eweta nkesa nkesa SV n'ụdị ngwugwu ala: RPM, DEB, MSI. Na mgbakwunye maka Windows anyị na-enye otu ihe nrụnye n'ụdị otu EXE nke na-etinye ihe nkesa, Hazelcast na Elasticsearch n'otu igwe. Anyị na-ezo aka na ụdị nrụnye a na mbụ dị ka ụdị "demo", ma ugbu a ọ bịara doo anya na nke a bụ nhọrọ mbugharị kachasị ewu ewu.

isi: www.habr.com

Tinye a comment