Ciamar agus carson a sgrìobh sinn seirbheis scalable làn luchd airson 1C: Iomairt: Java, PostgreSQL, Hazelcast

San artaigil seo bruidhnidh sinn mu ciamar agus carson a leasaich sinn Siostam eadar-obrachaidh - inneal a ghluaiseas fiosrachadh eadar tagraidhean teachdaiche agus 1C: frithealaichean iomairt - bho bhith a’ suidheachadh gnìomh gu bhith a’ smaoineachadh tron ​​​​ailtireachd agus mion-fhiosrachadh buileachaidh.

Tha an Siostam Eadar-obrachaidh (air an canar SV an-seo) na shiostam teachdaireachd sgaoilte, fulangach le locht le lìbhrigeadh cinnteach. Tha SV air a dhealbhadh mar sheirbheis làn luchd le scalability àrd, ri fhaighinn an dà chuid mar sheirbheis air-loidhne (air a sholarachadh le 1C) agus mar thoradh mòr-riochdaichte a ghabhas cleachdadh air na goireasan frithealaiche agad fhèin.

Bidh SV a’ cleachdadh stòradh sgaoilte calltainn agus einnsean sgrùdaidh Elasticsearch. Bruidhnidh sinn cuideachd mu Java agus mar a bhios sinn a’ sgèile PostgreSQL gu còmhnard.
Ciamar agus carson a sgrìobh sinn seirbheis scalable làn luchd airson 1C: Iomairt: Java, PostgreSQL, Hazelcast

Aithris dhuilgheadas

Gus a dhèanamh soilleir carson a chruthaich sinn an siostam eadar-obrachaidh, innsidh mi beagan dhut mu mar a tha leasachadh thagraidhean gnìomhachais ann an 1C ag obair.

An toiseach, beagan mu ar deidhinn dhaibhsan aig nach eil fios fhathast dè a bhios sinn a’ dèanamh :) Tha sinn a’ dèanamh àrd-ùrlar teicneòlais 1C:Enterprise. Tha an àrd-ùrlar a’ toirt a-steach inneal leasachaidh tagradh gnìomhachais, a bharrachd air ùine ruith a leigeas le tagraidhean gnìomhachais ruith ann an àrainneachd tar-àrd-ùrlar.

Paradigm leasachaidh frithealaiche teachdaiche

Bidh tagraidhean gnìomhachais air an cruthachadh air 1C:Iomairt ag obair ann an trì ìrean cliant-frithealaidh ailtireachd “DBMS - frithealaiche tagraidh - neach-dèiligidh”. Còd tagraidh sgrìobhte ann 1C cànan a chaidh a thogail a-steach, faodar a chuir gu bàs air frithealaiche an tagraidh no air an neach-dèiligidh. Bidh a h-uile obair le stuthan tagraidh (seòlaidhean, sgrìobhainnean, msaa), a bharrachd air a bhith a ’leughadh agus a’ sgrìobhadh an stòr-dàta, air a dhèanamh a-mhàin air an fhrithealaiche. Tha gnìomhachd fhoirmean agus eadar-aghaidh àithne cuideachd air a chuir an gnìomh air an fhrithealaiche. Bidh an neach-dèiligidh a’ coileanadh a bhith a’ faighinn, a’ fosgladh agus a’ taisbeanadh fhoirmean, “a’ conaltradh” leis an neach-cleachdaidh (rabhaidhean, ceistean ...), àireamhachadh beaga ann am foirmean a dh’ fheumas freagairt sgiobalta (mar eisimpleir, ag iomadachadh a’ phrìs le meud), ag obair le faidhlichean ionadail, ag obair le uidheamachd.

Ann an còd tagraidh, feumaidh cinn-cinn mhodhan-obrach agus gnìomhan nochdadh gu soilleir far an tèid an còd a chuir an gnìomh - a’ cleachdadh an &AtClient / & AtServer stiùiridhean (&AtClient / &AtServer anns an dreach Beurla den chànan). Ceartaichidh luchd-leasachaidh 1C mi a-nis le bhith ag ràdh gu bheil stiùiridhean ann dha-rìribh barrachd na, ach dhuinne chan eil seo cudromach a-nis.

Faodaidh tu còd frithealaiche a ghairm bho chòd teachdaiche, ach chan urrainn dhut còd teachdaiche a ghairm bho chòd an fhrithealaiche. Is e seo cuingealachadh bunaiteach a rinn sinn airson grunn adhbharan. Gu sònraichte, oir feumaidh còd an fhrithealaiche a bhith air a sgrìobhadh ann an dòigh a chuireas e an gnìomh san aon dòigh ge bith càite a bheil e air a ghairm - bhon neach-dèiligidh no bhon fhrithealaiche. Agus a thaobh a bhith a’ gairm còd frithealaiche bho chòd frithealaiche eile, chan eil teachdaiche mar sin ann. Agus oir nuair a chaidh còd an fhrithealaiche a chuir an gnìomh, dh ’fhaodadh an neach-dèiligidh a dh’ ainmich e dùnadh, an tagradh fhàgail, agus cha bhiodh duine aig an t-seirbheisiche ri ghairm tuilleadh.

Ciamar agus carson a sgrìobh sinn seirbheis scalable làn luchd airson 1C: Iomairt: Java, PostgreSQL, Hazelcast
Còd a làimhsicheas cliog putan: obraichidh gairm frithealaiche bhon neach-dèiligidh, cha bhith gairm modh teachdaiche bhon t-seirbheisiche

Tha seo a’ ciallachadh ma tha sinn airson teachdaireachd air choireigin a chuir bhon t-seirbheisiche chun tagradh teachdaiche, mar eisimpleir, gu bheil gineadh aithisg “fad-ùine” air tighinn gu crìch agus gum faodar coimhead air an aithisg, chan eil dòigh mar sin againn. Feumaidh tu cleasan a chleachdadh, mar eisimpleir, bho àm gu àm a’ sgrùdadh an fhrithealaiche bho chòd an neach-dèiligidh. Ach tha an dòigh-obrach seo a 'luchdachadh an t-siostam le gairmean neo-riatanach, agus mar as trice chan eil e a' coimhead gu math eireachdail.

Agus tha feum ann cuideachd, mar eisimpleir, nuair a thig fios fòn SIP- nuair a nì thu gairm, cuir fios chun tagradh teachdaiche mu dheidhinn seo gus an urrainn dha àireamh an neach-fios a chleachdadh gus a lorg ann an stòr-dàta a’ chunntair agus fiosrachadh a nochdadh don neach-cleachdaidh mun neach-gairm. No, mar eisimpleir, nuair a ruigeas òrdugh an taigh-bathair, cuir fios gu tagradh teachdaiche an neach-ceannach mu dheidhinn seo. San fharsaingeachd, tha mòran chùisean ann far am biodh inneal mar seo feumail.

An riochdachadh fhèin

Cruthaich inneal teachdaireachd. Fast, earbsach, le lìbhrigeadh cinnteach, le comas teachdaireachdan a lorg gu sùbailte. Stèidhichte air an uidheamachd, cuir an gnìomh teachdaire (teachdaireachdan, fiosan bhidio) a ’ruith taobh a-staigh tagraidhean 1C.

Dealbhaich an siostam gus a bhith scalable gu còmhnard. Feumaidh an t-uallach a tha a 'sìor fhàs a bhith air a chòmhdach le bhith a' meudachadh àireamh nan nodan.

Реализация

Cho-dhùin sinn gun a bhith ag amalachadh pàirt an fhrithealaiche de SV gu dìreach a-steach don àrd-ùrlar 1C: Iomairt, ach a chuir an gnìomh mar thoradh air leth, agus faodar an API dhiubh a ghairm bho chòd fuasglaidhean tagraidh 1C. Chaidh seo a dhèanamh airson grunn adhbharan, agus b’ e am prìomh fhear dhiubh sin gun robh mi airson a dhèanamh comasach teachdaireachdan iomlaid eadar diofar thagraidhean 1C (mar eisimpleir, eadar Stiùireadh Malairt agus Cunntasachd). Faodaidh diofar thagraidhean 1C ruith air dreachan eadar-dhealaichte den àrd-ùrlar 1C:Enterprise, a bhith suidhichte air diofar frithealaichean, msaa. Ann an leithid de shuidheachaidhean, is e buileachadh SV mar thoradh air leth suidhichte “air taobh” ionadan 1C am fuasgladh as fheàrr.

Mar sin, chuir sinn romhainn SV a dhèanamh mar thoradh air leth. Tha sinn a’ moladh gun cleachd companaidhean beaga am frithealaiche CB a chuir sinn a-steach san sgòth againn (wss://1cdialog.com) gus na cosgaisean os-cionn co-cheangailte ri stàladh ionadail agus rèiteachadh an fhrithealaiche a sheachnadh. Is dòcha gum bi e ciallach do luchd-cleachdaidh mòr am frithealaiche CB aca fhèin a chuir a-steach aig na goireasan aca. Chleachd sinn dòigh-obrach coltach ris anns an toradh sgòth SaaS againn 1c Ùr - tha e air a thoirt a-mach mar thoradh mòr-riochdaichte airson a chuir a-steach aig làraich teachdaichean, agus tha e cuideachd air a chleachdadh san sgòth againn https://1cfresh.com/.

Iarrtas

Gus fulangas luchdan is sgàinidhean a sgaoileadh, cha chuir sinn a-steach aon iarrtas Java, ach grunnan, le cothromachadh luchdan air am beulaibh. Ma dh’fheumas tu teachdaireachd a ghluasad bho nód gu nód, cleachd foillseachadh / fo-sgrìobhadh ann an Hazelcast.

Tha conaltradh eadar an neach-dèiligidh agus an frithealaiche tro websocket. Tha e gu math freagarrach airson siostaman fìor-ùine.

Tasgadh air a chuairteachadh

Thagh sinn eadar Redis, Hazelcast agus Ehcache. Is e 2015 a th’ ann. Tha Redis dìreach air cruinneachadh ùr a leigeil ma sgaoil (ro ùr, eagallach), tha Sentinel ann le tòrr chuingealachaidhean. Chan eil fios aig Ehcache mar a chruinnicheas e ann am brabhsair (nochd an gnìomh seo nas fhaide air adhart). Cho-dhùin sinn feuchainn air le Hazelcast 3.4.
Tha Hazelcast air a chruinneachadh ann am brabhsair a-mach às a’ bhogsa. Ann am modh aon nòta, chan eil e glè fheumail agus chan urrainnear a chleachdadh ach mar thasgadh - chan eil fios aige ciamar a dhumpas tu dàta gu diosc, ma chailleas tu an aon nód, caillidh tu an dàta. Bidh sinn a’ cleachdadh grunn Hazelcasts, eadar am bi sinn a’ dèanamh cùl-taic de dhàta èiginneach. Cha bhith sinn a’ cumail suas an tasgadan – chan eil dragh againn air.

Dhuinne, is e Hazelcast:

  • Stòradh seiseanan luchd-cleachdaidh. Bheir e ùine mhòr a dhol dhan stòr-dàta airson seisean a h-uile turas, agus mar sin chuir sinn na seiseanan gu lèir ann an Hazelcast.
  • Tasgadh. Ma tha thu a’ coimhead airson pròifil cleachdaiche, thoir sùil air an tasgadan. Sgrìobh teachdaireachd ùr - cuir san tasgadan e.
  • Cuspairean airson conaltradh eadar eisimpleirean tagraidh. Bidh an nód a’ gineadh tachartas agus ga chuir ann an cuspair Hazelcast. Bidh nodan tagraidh eile a tha fo-sgrìobhadh don chuspair seo a’ faighinn agus a’ pròiseasadh an tachartais.
  • Glasan cnuasachaidh. Mar eisimpleir, cruthaichidh sinn deasbad a’ cleachdadh iuchair shònraichte (còmhradh singilte taobh a-staigh stòr-dàta 1C):

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

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

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

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

Rinn sinn sgrùdadh nach eil sianal ann. Ghabh sinn a’ ghlas, rinn sinn sgrùdadh air a-rithist, agus chruthaich sinn e. Mura toir thu sùil air a’ ghlas às deidh dhut a’ ghlas a ghabhail, tha teansa ann gun do rinn snàithlean eile sgrùdadh aig an àm sin agus feuchaidh tu a-nis ris an aon deasbad a chruthachadh - ach tha e ann mu thràth. Chan urrainn dhut glasadh le bhith a’ cleachdadh glas java sioncronaich no àbhaisteach. Tron stòr-dàta - tha e slaodach, agus tha e duilich don stòr-dàta; tro Hazelcast - sin agad a tha a dhìth ort.

A 'taghadh DBMS

Tha eòlas farsaing agus soirbheachail againn ag obair le PostgreSQL agus a’ co-obrachadh le luchd-leasachaidh an DBMS seo.

Chan eil e furasta le cruinneachadh PostgreSQL - tha XL, XC, Citus, ach san fharsaingeachd chan e seo NoSQLs a tha a’ dol a-mach às a’ bhogsa. Cha do bheachdaich sinn air NoSQL mar am prìomh stòradh; bha e gu leòr gun do ghabh sinn Hazelcast, nach robh sinn air a bhith ag obair leis roimhe.

Ma dh’ fheumas tu stòr-dàta dàimheach a sgèileadh, tha sin a’ ciallachadh rùsgadh. Mar a tha fios agad, le bhith a’ roinneadh an stòr-dàta bidh sinn a’ roinn an stòr-dàta gu pàirtean fa leth gus an tèid gach fear dhiubh a chuir air frithealaiche air leth.

Bha a’ chiad dreach den sharding againn a’ gabhail ris a’ chomas a bhith a’ sgaoileadh gach clàr den tagradh againn thairis air diofar luchd-frithealaidh ann an diofar chuibhreannan. Tha tòrr theachdaireachdan air frithealaiche A - feuch, gluaisidh sinn pàirt den chlàr seo gu frithealaiche B. Bha an co-dhùnadh seo dìreach a’ sgreuchail mu optimization ro-luath, agus mar sin chuir sinn romhainn sinn fhìn a chuingealachadh gu dòigh-obrach ioma-neach-gabhail.

Faodaidh tu leughadh mu dheidhinn ioma-neach-gabhail, mar eisimpleir, air an làrach-lìn Dàta Citus.

Tha bun-bheachdan tagraidh agus ballrachd aig SV. Tha tagradh na stàladh sònraichte de thagradh gnìomhachais, leithid ERP no Cunntasachd, leis an luchd-cleachdaidh agus dàta gnìomhachais. Is e buidheann no neach fa leth a th’ ann an fo-sgrìobhaiche às a bheil an tagradh clàraichte san t-seirbheisiche SV. Faodaidh grunn thagraidhean a bhith clàraichte aig neach-clàraidh, agus faodaidh na tagraidhean sin teachdaireachdan iomlaid ri chèile. Thàinig an neach-clàraidh gu bhith na neach-gabhail san t-siostam againn. Faodar teachdaireachdan bho ghrunn luchd-aontachaidh a lorg ann an aon stòr-dàta corporra; ma chì sinn gu bheil neach-clàraidh air tòiseachadh a’ gineadh tòrr trafaic, gluaisidh sinn e gu stòr-dàta fiosaigeach air leth (no eadhon frithealaiche stòr-dàta air leth).

Tha prìomh stòr-dàta againn far a bheil clàr slighe air a stòradh le fiosrachadh mu shuidheachadh gach stòr-dàta luchd-aontachaidh.

Ciamar agus carson a sgrìobh sinn seirbheis scalable làn luchd airson 1C: Iomairt: Java, PostgreSQL, Hazelcast

Gus casg a chuir air a’ phrìomh stòr-dàta bho bhith na bhotal, bidh sinn a’ cumail a’ chlàr seòlaidh (agus dàta eile air a bheil feum tric) ann an tasgadan.

Ma thòisicheas stòr-dàta an neach-aontachaidh a’ fàs nas slaodaiche, gearraidh sinn e ann am pìosan a-staigh. Air pròiseactan eile a bhios sinn a’ cleachdadh pg_pathman.

Leis gu bheil e dona teachdaireachdan luchd-cleachdaidh a chall, bidh sinn a’ cumail suas ar stòran-dàta le mac-samhail. Leigidh an cothlamadh de mhac-samhail sioncronaich agus asyncronach leat àrachas a thoirt dhut fhèin gun fhios nach caill thu am prìomh stòr-dàta. Cha tachair call teachdaireachd ach ma dh’ fhailicheas am prìomh stòr-dàta agus an mac-samhail sioncronaich aige aig an aon àm.

Ma thèid mac-samhail sioncronaich a chall, bidh am mac-samhail asyncronach a’ fàs sioncronaich.
Ma thèid am prìomh stòr-dàta a chall, bidh am mac-samhail sioncronaich na phrìomh stòr-dàta, agus bidh am mac-samhail asyncronach na mhac-samhail sioncronaich.

Elasticsearch airson lorg

Leis, am measg rudan eile, tha SV cuideachd na theachdaire, feumaidh e sgrùdadh luath, goireasach agus sùbailte, a ’toirt aire do morphology, a’ cleachdadh maidsean neo-mhearachdach. Cho-dhùin sinn gun a’ chuibhle ath-thòiseachadh agus an einnsean sgrùdaidh an-asgaidh Elasticsearch a chleachdadh, a chaidh a chruthachadh stèidhichte air an leabharlann Lucene. Bidh sinn cuideachd a’ cleachdadh Elasticsearch ann am brabhsair (maighstir - dàta - dàta) gus cuir às do dhuilgheadasan ma dh’ fhàillig nodan tagraidh.

Air github lorg sinn Russian morphology plugan a airson Elasticsearch agus cleachd e. Ann an clàr-amais Elasticsearch bidh sinn a’ stòradh freumhan fhaclan (a tha am plugan a’ dearbhadh) agus N-grams. Mar a chuireas an neach-cleachdaidh a-steach teacsa airson rannsachadh, bidh sinn a’ coimhead airson an teacsa clò-sgrìobhte am measg N-grams. Nuair a thèid a shàbhaladh don chlàr-amais, thèid am facal “teacsaichean” a roinn anns na N-graman a leanas:

[iadsan, tek, tex, teacsa, teacsaichean, ek, ex, ext, teacsaichean, ks, kst, ksty, st, sty, thu],

Agus bidh freumh an fhacail “teacsa” cuideachd air a ghleidheadh. Leigidh an dòigh-obrach seo leat sgrùdadh a dhèanamh aig toiseach, sa mheadhan, agus aig deireadh an fhacail.

An dealbh mòr

Ciamar agus carson a sgrìobh sinn seirbheis scalable làn luchd airson 1C: Iomairt: Java, PostgreSQL, Hazelcast
Dèan ath-aithris air an dealbh bho thoiseach an artaigil, ach le mìneachadh:

  • Balancer fosgailte air an eadar-lìon; tha nginx againn, faodaidh e a bhith idir.
  • Bidh eisimpleirean de thagraidhean Java a’ conaltradh ri chèile tro Hazelcast.
  • Airson obrachadh le socaid lìn bidh sinn a’ cleachdadh Neitidh.
  • Tha an tagradh Java sgrìobhte ann an Java 8 agus tha pasganan ann OSGi. Tha na planaichean a’ toirt a-steach imrich gu Java 10 agus gluasad gu modalan.

Leasachadh agus deuchainn

Ann a bhith a’ leasachadh agus a’ dèanamh deuchainn air an SV, thàinig sinn tarsainn air grunn fheartan inntinneach de na stuthan a bhios sinn a’ cleachdadh.

Luchdaich a-nuas deuchainn agus cuimhne ag aoidion

Tha sgaoileadh gach brath SV a’ toirt a-steach deuchainn luchdan. Bidh e soirbheachail nuair:

  • Dh'obraich an deuchainn airson grunn làithean agus cha robh fàilligidhean seirbheis ann
  • Cha robh an ùine freagairt airson prìomh obrachaidhean nas àirde na ìre chofhurtail
  • Chan eil crìonadh coileanaidh an coimeas ris an dreach roimhe nas àirde na 10%

Bidh sinn a’ lìonadh an stòr-dàta deuchainn le dàta - gus seo a dhèanamh, gheibh sinn fiosrachadh mun neach-clàraidh as gnìomhaiche bhon t-seirbheisiche riochdachaidh, iomadaich na h-àireamhan aige le 5 (an àireamh de theachdaireachdan, chòmhraidhean, luchd-cleachdaidh) agus dèan deuchainn air san dòigh sin.

Bidh sinn a’ dèanamh deuchainn luchdan air an t-siostam eadar-obrachaidh ann an trì rèiteachaidhean:

  1. deuchainn cuideam
  2. Ceanglaichean a-mhàin
  3. Clàradh neach-clàraidh

Rè an deuchainn cuideam, bidh sinn a 'cur air bhog grunn cheudan snàithlean, agus bidh iad a' luchdachadh an t-siostam gun stad: a 'sgrìobhadh teachdaireachdan, a' cruthachadh chòmhraidhean, a 'faighinn liosta de theachdaireachdan. Bidh sinn ag atharrais air gnìomhan luchd-cleachdaidh àbhaisteach (faigh liosta de na teachdaireachdan gun leughadh agam, sgrìobh gu cuideigin) agus fuasglaidhean bathar-bog (cuir seachad pasgan de rèiteachadh eadar-dhealaichte, pròiseas rabhadh).

Mar eisimpleir, seo cò ris a tha pàirt den deuchainn cuideam coltach:

  • Luchd-cleachdaidh a 'logadh a-steach
    • Ag iarraidh do chòmhraidhean gun leughadh
    • 50% dualtach teachdaireachdan a leughadh
    • 50% dualtach teacsadh
    • An ath chleachdaiche:
      • Tha cothrom 20% ann airson deasbad ùr a chruthachadh
      • Bidh e air thuaiream a’ taghadh gin de na còmhraidhean aige
      • A’ dol a-staigh
      • Iarr teachdaireachdan, pròifilean cleachdaiche
      • Cruthaich còig teachdaireachdan air an seòladh gu luchd-cleachdaidh air thuaiream bhon deasbad seo
      • A’ fàgail deasbaid
      • Ath-aithris 20 uair
      • Logs a-mach, a 'dol air ais gu toiseach an sgriobt

    • Bidh chatbot a’ dol a-steach don t-siostam (a’ dèanamh atharrais air teachdaireachdan bho chòd an tagraidh)
      • A bheil cothrom 50% ann seanail ùr a chruthachadh airson iomlaid dàta (deasbad sònraichte)
      • 50% dualtach teachdaireachd a sgrìobhadh gu gin de na seanailean a th’ ann mar-thà

Nochd an suidheachadh “Ceanglaichean a-mhàin” airson adhbhar. Tha suidheachadh ann: tha luchd-cleachdaidh air an siostam a cheangal, ach chan eil iad air a dhol an sàs fhathast. Bidh gach neach-cleachdaidh a 'tionndadh air a' choimpiutair aig 09:00 sa mhadainn, a 'stèidheachadh ceangal ris an fhrithealaiche agus a' fuireach sàmhach. Tha na daoine sin cunnartach, tha mòran dhiubh ann - is e PING/PONG na h-aon phasgan a th’ aca, ach cumaidh iad an ceangal ris an fhrithealaiche (chan urrainn dhaibh a chumail suas - dè ma tha teachdaireachd ùr ann). Bidh an deuchainn ag ath-riochdachadh suidheachadh far am bi àireamh mhòr de luchd-cleachdaidh mar sin a’ feuchainn ri logadh a-steach don t-siostam ann an leth uair a thìde. Tha e coltach ri deuchainn cuideam, ach tha am fòcas gu mionaideach air a 'chiad chur-a-steach seo - gus nach bi fàilligeadh ann (chan eil duine a' cleachdadh an t-siostam, agus tha e mar-thà a 'tuiteam dheth - tha e doirbh smaoineachadh air rudeigin nas miosa).

Bidh an sgriobt clàraidh ballrachd a’ tòiseachadh bhon chiad fhoillseachadh. Rinn sinn deuchainn cuideam agus bha sinn cinnteach nach do dh'fhàs an siostam nas slaodaiche rè conaltradh. Ach thàinig luchd-cleachdaidh agus thòisich an clàradh a’ fàiligeadh air sgàth ùine a-muigh. Nuair a bha sinn a’ clàradh chleachd sinn / dev / air thuaiream, a tha co-cheangailte ri entropy an t-siostam. Cha robh tìde aig an fhrithealaiche entropy gu leòr a chruinneachadh agus nuair a chaidh SecureRandom ùr iarraidh, reòthadh e airson deichean diog. Tha iomadh dòigh a-mach às an t-suidheachadh seo, mar eisimpleir: gluais chun an / dev/urandom nach eil cho tèarainte, cuir a-steach bòrd sònraichte a chruthaicheas entropy, cruthaich àireamhan air thuaiream ro-làimh agus stòraich iad ann an amar. Dhùin sinn an duilgheadas leis an amar airson ùine, ach bhon uairsin tha sinn air a bhith a’ ruith deuchainn air leth airson luchd-aontachaidh ùra a chlàradh.

Bidh sinn ga chleachdadh mar ghineadair luchdan JMeter. Chan eil fios aige ciamar a dh’ obraicheas e le websocket; feumaidh e plugan. Is e a’ chiad fhear ann an toraidhean rannsachaidh airson na ceiste “jmeter websocket”: artaigilean bho BlazeMeter, a tha a 'moladh plugan le Maciej Zaleski.

Sin far an do chuir sinn romhainn tòiseachadh.

Cha mhòr sa bhad às deidh dhuinn fìor dheuchainnean a thòiseachadh, fhuair sinn a-mach gun do thòisich JMeter air cuimhne a leigeil a-mach.

Tha am plugan na sgeulachd mhòr air leth; le 176 rionnagan, tha 132 forc air github. Chan eil an t-ùghdar fhèin air gealltainn dha bho 2015 (ghabh sinn e ann an 2015, an uairsin cha do thog e amharas), grunn chùisean github a thaobh aoidion cuimhne, 7 iarrtasan tarraing gun dhùnadh.
Ma cho-dhùnas tu deuchainn luchdan a dhèanamh leis a’ plugan seo, thoir aire do na còmhraidhean a leanas:

  1. Ann an àrainneachd ioma-snàthainn, chaidh LinkedList cunbhalach a chleachdadh, agus bha an toradh NPE ann an àm ruith. Faodar seo fhuasgladh an dàrna cuid le bhith ag atharrachadh gu ConcurrentLinkedDeque no le blocaichean sioncronaich. Thagh sinn a’ chiad roghainn dhuinn fhìn (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Aodion cuimhne; nuair a thèid an ceangal a dhì-cheangal, cha tèid fiosrachadh ceangail a dhubhadh às (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. Ann am modh sruthadh (nuair nach eil an websocket dùinte aig deireadh an t-sampall, ach ga chleachdadh nas fhaide air adhart sa phlana), chan obraich pàtrain freagairt (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

Is e seo aon den fheadhainn air github. Na rinn sinn:

  1. Air gabhail forc Elyran Kogan (@elyrank) - bidh e a’ fuasgladh dhuilgheadasan 1 agus 3
  2. A fhuair fuasgladh air an duilgheadas 2.
  3. Cidhe ùrachadh bho 9.2.14 gu 9.3.12
  4. Fòrmat SimpleDate fillte ann an ThreadLocal; Chan eil SimpleDateFormat sàbhailte ann an snàithlean, a dh’ adhbhraich NPE aig àm ruith
  5. Chàirich sinn aodion cuimhne eile (chaidh an ceangal a dhùnadh gu ceàrr nuair a chaidh a dhì-cheangal)

Agus fhathast tha e a 'sruthadh!

Thòisich cuimhne air ruith a-mach chan ann ann an latha, ach ann an dà. Cha robh ùine air fhàgail, agus mar sin chuir sinn romhainn nas lugha de snàithleanan a chuir air bhog, ach air ceithir riochdairean. Bu chòir gum biodh seo gu leòr airson co-dhiù seachdain.

Tha dà latha air a dhol seachad...

A-nis tha Hazelcast a’ ruith a-mach à cuimhne. Sheall na logaichean, às deidh latha no dhà de dheuchainn, gun do thòisich Hazelcast a’ gearan mu dheidhinn dìth cuimhne, agus às deidh beagan ùine thuit am buidheann às a chèile, agus lean na nodan a ’bàsachadh aon às deidh aon. Cheangail sinn JVisualVM ri hazelcast agus chunnaic sinn “sàbh ag èirigh” - b’ e an GC a chanadh e gu cunbhalach, ach cha b’ urrainn dhuinn an cuimhne a ghlanadh.

Ciamar agus carson a sgrìobh sinn seirbheis scalable làn luchd airson 1C: Iomairt: Java, PostgreSQL, Hazelcast

Thionndaidh e a-mach, ann an hazelcast 3.4, nuair a sguabas tu às mapa / multiMap (map.destroy()), nach eil cuimhne air a shaoradh gu tur:

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

Tha am biast a-nis stèidhichte ann an 3.5, ach bha e na dhuilgheadas aig an àm sin. Chruthaich sinn multiMaps ùra le ainmean fiùghantach agus chuir sinn às dhaibh a rèir ar loidsig. Bha an còd a’ coimhead rudeigin mar seo:

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

Faclan-cinn:

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

chaidh multiMap a chruthachadh airson gach ballrachd agus chaidh a sguabadh às nuair nach robh feum air. Cho-dhùin sinn gun tòisicheadh ​​​​sinn Mapa , is e an iuchair ainm an fho-sgrìobhaidh, agus bidh na luachan mar aithnichearan seisean (às an urrainn dhut aithnichearan cleachdaiche fhaighinn, ma tha sin riatanach).

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

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

Tha na clàran air fàs nas fheàrr.

Ciamar agus carson a sgrìobh sinn seirbheis scalable làn luchd airson 1C: Iomairt: Java, PostgreSQL, Hazelcast

Dè eile a dh'ionnsaich sinn mu dheuchainnean luchdan?

  1. Feumaidh JSR223 a bhith sgrìobhte ann an groovy agus a’ toirt a-steach tasgadan cruinneachaidh - tha e tòrr nas luaithe. cheangal.
  2. Tha grafaichean Jmeter-Plugins nas fhasa a thuigsinn na feadhainn àbhaisteach. cheangal.

Mun eòlas againn le Hazelcast

B ’e toradh ùr a bh’ ann an Hazelcast dhuinn, thòisich sinn ag obair leis bho dhreach 3.4.1, a-nis tha an frithealaiche riochdachaidh againn a ’ruith dreach 3.9.2 (aig àm sgrìobhaidh, is e 3.10 an dreach as ùire de Hazelcast).

Gineadh ID

Thòisich sinn le aithnichearan an t-slànaighear. Smaoinichidh sinn gu bheil feum againn air Long eile airson eintiteas ùr. Chan eil sreath san stòr-dàta freagarrach, tha na bùird an sàs ann an rùsgadh - tha e a’ tionndadh a-mach gu bheil teachdaireachd ID=1 ann an DB1 agus teachdaireachd ID=1 ann an DB2, chan urrainn dhut an ID seo a chuir ann an Elasticsearch, no ann an Hazelcast , ach is e an rud as miosa ma tha thu airson an dàta bho dhà stòr-dàta a chur còmhla ann an aon (mar eisimpleir, co-dhùnadh gu bheil aon stòr-dàta gu leòr airson na fo-sgrìobhaichean sin). Faodaidh tu grunn AtomicLongs a chur ri Hazelcast agus a’ chunntair a chumail an sin, agus an uairsin tha coileanadh faighinn ID ùr àrdachadh AndGet a bharrachd air an ùine airson iarrtas gu Hazelcast. Ach tha rudeigin nas fheàrr aig Hazelcast - FlakeIdGenerator. Nuair a chuireas iad fios gu gach neach-dèiligidh, gheibh iad raon ID, mar eisimpleir, a’ chiad fhear - bho 1 gu 10, an dàrna fear - bho 000 gu 10, agus mar sin air adhart. A-nis faodaidh an neach-dèiligidh aithnichearan ùra a chuir a-mach leis fhèin gus an tig an raon a chaidh a thoirt dha gu crìch. Bidh e ag obair gu sgiobalta, ach nuair a nì thu ath-thòiseachadh air an tagradh (agus an neach-dèiligidh Hazelcast), tòisichidh sreath ùr - mar sin na sgioban, msaa. A bharrachd air an sin, chan eil luchd-leasachaidh dha-rìribh a’ tuigsinn carson a tha na IDan iomlan, ach tha iad cho neo-chunbhalach. Rinn sinn cuideam air a h-uile càil agus thionndaidh sinn gu UUIDs.

Co-dhiù, dhaibhsan a tha airson a bhith coltach ri Twitter, tha leithid de leabharlann Snowcast ann - is e seo buileachadh Snowflake a bharrachd air Hazelcast. Faodaidh tu fhaicinn an seo:

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

Ach chan eil sinn air faighinn timcheall air tuilleadh.

TransationalMap.replace

iongnadh eile: chan eil TransationalMap.replace ag obair. Seo deuchainn:

@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

B’ fheudar dhomh an àite agam fhìn a sgrìobhadh a’ cleachdadh 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);
}

Dèan deuchainn chan ann a-mhàin air structaran dàta cunbhalach, ach cuideachd air na dreachan malairt aca. Tha e a’ tachairt gu bheil IMap ag obair, ach chan eil TransationalMap ann tuilleadh.

Cuir a-steach JAR ùr gun ùine downt

An toiseach, chuir sinn romhainn rudan de na clasaichean againn a chlàradh ann an Hazelcast. Mar eisimpleir, tha clas Iarrtais againn, tha sinn airson a shàbhaladh agus a leughadh. Sàbhail:

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

Tha sinn a' leughadh:

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

Tha a h-uile dad ag obair. An uairsin chuir sinn romhainn clàr-amais a thogail ann an Hazelcast airson rannsachadh le:

map.addIndex("subscriberId", false);

Agus nuair a bha iad a’ sgrìobhadh eintiteas ùr, thòisich iad a’ faighinn ClassNotFoundException. Dh’ fheuch Hazelcast ri cur ris a’ chlàr-amais, ach cha robh fios aige càil mun chlas againn agus bha e airson gun deidheadh ​​JAR leis a’ chlas seo a thoirt dha. Rinn sinn dìreach sin, dh’ obraich a h-uile càil, ach nochd duilgheadas ùr: mar as urrainn dhut an JAR ùrachadh gun stad a chuir air a’ bhuidheann gu tur? Cha bhith Hazelcast a’ togail an JAR ùr rè ùrachadh nód-by-node. Aig an ìre seo cho-dhùin sinn gum b’ urrainn dhuinn a bhith beò às aonais sgrùdadh clàr-amais. Às deidh na h-uile, ma chleachdas tu Hazelcast mar phrìomh stòr luach, an obraich a h-uile dad? Chan eil idir. An seo a-rithist tha giùlan IMap agus TransactionalMap eadar-dhealaichte. Far nach eil dragh air IMap, bidh TransactionalMap a’ tilgeil mearachd.

IMap. Bidh sinn a’ sgrìobhadh 5000 rud, gan leughadh. Tha dùil ris a h-uile càil.

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

Ach chan obraich e ann an gnothach, gheibh sinn 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();
        }
    });
}

Ann an 3.8, nochd an uidheamachd cleachdadh clas cleachdaiche. Faodaidh tu aon phrìomh nód ainmeachadh agus am faidhle JAR ùrachadh air.

A-nis tha sinn air ar dòigh-obrach atharrachadh gu tur: bidh sinn ga chuir a-steach gu JSON agus ga shàbhaladh ann an Hazelcast. Chan fheum Hazelcast a bhith eòlach air structar ar clasaichean, agus is urrainn dhuinn ùrachadh às aonais ùine downt. Tha tionndadh de nithean fearainn fo smachd an tagraidh. Faodaidh dreachan eadar-dhealaichte den tagradh a bhith a’ ruith aig an aon àm, agus tha suidheachadh comasach nuair a bhios an tagradh ùr a’ sgrìobhadh nithean le raointean ùra, ach chan eil fios aig an t-seann fhear mu na raointean sin fhathast. Agus aig an aon àm, bidh an tagradh ùr a’ leughadh nithean a chaidh a sgrìobhadh leis an t-seann iarrtas aig nach eil raointean ùra. Bidh sinn a’ làimhseachadh leithid de shuidheachaidhean taobh a-staigh an tagraidh, ach airson sìmplidh cha bhith sinn ag atharrachadh no a’ cuir às do raointean, cha bhith sinn a’ leudachadh nan clasaichean ach le bhith a’ cur raointean ùra ris.

Mar a nì sinn cinnteach à coileanadh àrd

Ceithir tursan gu Hazelcast - math, dhà chun an stòr-dàta - dona

Tha e an-còmhnaidh nas fheàrr a dhol don tasgadan airson dàta na bhith a’ dol don stòr-dàta, ach chan eil thu airson clàran nach deach a chleachdadh a stòradh nas motha. Bidh sinn a’ fàgail a’ cho-dhùnaidh mu dè a bu chòir a thasgadh gus an ìre leasachaidh mu dheireadh. Nuair a bhios an comas-gnìomh ùr air a chòdachadh, bidh sinn a’ tionndadh air logadh a h-uile ceist ann am PostgreSQL (log_min_duration_statement to 0) agus a’ ruith deuchainn luchdan airson mionaidean 20. A’ cleachdadh nan logaichean cruinnichte, faodaidh goireasan leithid pgFouine agus pgBadger aithisgean anailis a thogail. Ann an aithisgean, bidh sinn gu sònraichte a’ coimhead airson ceistean slaodach is tric. Airson ceistean slaodach, bidh sinn a’ togail plana cur gu bàs (EXPLAIN) agus a’ measadh an gabh a leithid de cheist a luathachadh. Bidh iarrtasan tric airson an aon dàta cuir a-steach a’ freagairt gu math ris an tasgadan. Feuchaidh sinn ri ceistean a chumail “rèidh”, aon bhòrd airson gach ceist.

Gnìomh

Chaidh SV mar sheirbheis air-loidhne a chuir an gnìomh as t-earrach 2017, agus mar thoradh air leth, chaidh SV a leigeil ma sgaoil san t-Samhain 2017 (aig an àm sin ann an inbhe dreach beta).

Ann an còrr is bliadhna de dh'obair, cha robh duilgheadasan mòra sam bith ann an obrachadh seirbheis air-loidhne CB. Bidh sinn a’ cumail sùil air an t-seirbheis air-loidhne tro Zabbix, a chruinneachadh agus a chur an sàs bho Bambù.

Tha an cuairteachadh frithealaiche SV air a thoirt seachad ann an cruth pasganan dùthchasach: RPM, DEB, MSI. A bharrachd air an sin airson Windows bidh sinn a’ toirt seachad aon stàlaichear ann an cruth aon EXE a stàlaicheas am frithealaiche, Hazelcast agus Elasticsearch air aon inneal. Thug sinn iomradh an toiseach air an dreach seo den stàladh mar an dreach “demo”, ach tha e a-nis air fàs soilleir gur e seo an roghainn cleachdadh as mòr-chòrdte.

Source: www.habr.com

Cuir beachd ann