Ahoana ary nahoana izahay no nanoratanay serivisy azo scalable be entana ho an'ny 1C: Enterprise: Java, PostgreSQL, Hazelcast

Ato amin'ity lahatsoratra ity isika dia hiresaka momba ny fomba sy ny antony nahatonga antsika Rafitra fifandraisana – rafitra iray izay mamindra vaovao eo amin'ny fampiharana mpanjifa sy 1C: Enterprise servers - manomboka amin'ny fametrahana asa mankany amin'ny fisainana amin'ny antsipiriany momba ny maritrano sy ny fampiharana.

Ny Rafitra Fifandraisana (antsoina hoe SV) dia rafitra fandefasana hafatra miparitaka sy mandefitra amin'ny fanaterana azo antoka. Ny SV dia natao ho serivisy avo lenta miaraka amin'ny scalability avo lenta, azo alaina amin'ny serivisy an-tserasera (nomen'ny 1C) ary ho toy ny vokatra vokarina faobe izay azo apetraka amin'ny tranokalanao manokana.

Ny SV dia mampiasa fitehirizana voazara hazelcast ary motera fikarohana Elasticsearch. Hiresaka momba an'i Java ihany koa isika sy ny fomba fandrefesana ny PostgreSQL.
Ahoana ary nahoana izahay no nanoratanay serivisy azo scalable be entana ho an'ny 1C: Enterprise: Java, PostgreSQL, Hazelcast

Fanambarana olana

Mba hanazavana ny antony namoronanay ny System Interaction, dia holazaiko aminao kely ny fomba fiasan'ny fampiroboroboana ny rindranasa fandraharahana ao amin'ny 1C.

Hanombohana, kely momba anay ho an'izay mbola tsy mahafantatra ny ataonay :) Manao ny sehatra teknolojia 1C:Enterprise izahay. Ny sehatra dia ahitana fitaovana fampivoarana fampiharana ara-barotra, ary koa ny fotoana fampandehanana izay ahafahan'ny rindranasa fandraharahana mandeha amin'ny tontolon'ny sehatra.

Paradigma fampandrosoana mpanjifa-server

Ny fampiharana ara-barotra noforonina tamin'ny 1C: Enterprise dia miasa amin'ny ambaratonga telo client-server Architecture "DBMS - mpizara fampiharana - mpanjifa". Kaody fampiharana voasoratra ao naorina-in 1C fiteny, azo tanterahina amin'ny mpizara fampiharana na amin'ny mpanjifa. Ny asa rehetra miaraka amin'ny zavatra fampiharana (lahatsoratra, antontan-taratasy, sns), ary koa ny famakiana sy fanoratana ny angon-drakitra, dia atao amin'ny mpizara ihany. Ny fiasan'ny endrika sy ny interface interface dia ampiharina amin'ny server ihany koa. Ny mpanjifa dia manao fandraisana, fanokafana ary fampisehoana endrika, "fifandraisana" amin'ny mpampiasa (fampitandremana, fanontaniana ...), kajy kely amin'ny endrika mitaky valiny haingana (ohatra, fampitomboana ny vidiny amin'ny isa), miasa amin'ny rakitra eo an-toerana, miasa amin'ny fitaovana.

Ao amin'ny fehezan-dalàna fampiharana, ny lohatenin'ny fomba fiasa sy ny fiasa dia tsy maintsy manondro mazava ny toerana hanatanterahana ny fehezan-dalàna - amin'ny fampiasana ny torolàlana &AtClient / &AtServer (&AtClient / &AtServer amin'ny dikan-teny anglisy). Ny mpamorona 1C dia hanitsy ahy izao amin'ny filazana fa marina ny torolàlana mihoatra noho ny, fa tsy zava-dehibe aminay izany ankehitriny.

Azonao atao ny miantso ny kaody mpizara amin'ny kaody mpanjifa, fa tsy afaka miantso ny kaody mpanjifa amin'ny kaody mpizara ianao. Fameperana fototra nataonay izany noho ny antony maromaro. Indrindra indrindra, satria ny kaody mpizara dia tsy maintsy soratana amin'ny fomba mitovy amin'izany na aiza na aiza iantsoana azy - avy amin'ny mpanjifa na avy amin'ny mpizara. Ary raha ny fiantsoana ny kaody mpizara amin'ny kaody mpizara hafa dia tsy misy mpanjifa toy izany. Ary satria mandritra ny fanatanterahana ny kaody mpizara dia afaka manidy ny mpanjifa niantso azy, nivoaka ny fampiharana ary tsy manana olona hiantso intsony ny mpizara.

Ahoana ary nahoana izahay no nanoratanay serivisy azo scalable be entana ho an'ny 1C: Enterprise: Java, PostgreSQL, Hazelcast
Kaody mitantana bokotra bokotra: ny fiantsoana ny fomba fiasan'ny mpizara avy amin'ny mpanjifa dia hiasa, ny fiantsoana ny fizotran'ny mpanjifa avy amin'ny mpizara dia tsy hiasa.

Midika izany fa raha te-handefa hafatra avy amin'ny mpizara mankany amin'ny fampiharana mpanjifa isika, ohatra, fa efa vita ny famokarana tatitra "efa ela" ary azo jerena ny tatitra, tsy manana fomba toy izany isika. Tsy maintsy mampiasa fika ianao, ohatra, manadihady tsindraindray ny mpizara amin'ny kaody mpanjifa. Saingy io fomba fiasa io dia mameno ny rafitra amin'ny antso tsy ilaina, ary amin'ny ankapobeny dia tsy mijery kanto loatra.

Ary ilaina koa, ohatra, rehefa misy antso an-tariby SIP- rehefa manao antso, dia ampahafantaro ny fampiharana mpanjifa momba izany mba hahafahany mampiasa ny laharan'ny mpiantso hitadiavana azy ao amin'ny angon-drakitra mifanandrify ary mampiseho ny mombamomba ny mpampiasa momba ny mpifanandrina amin'ny antso. Na, ohatra, rehefa tonga any amin'ny trano fanatobiana entana ny baiko iray, ampahafantaro ny fangatahan'ny mpanjifa momba izany. Amin'ny ankapobeny, misy tranga maro izay mety hahasoa ny mekanika toy izany.

Ny famokarana mihitsy

Mamorona rafitra fandefasana hafatra. Haingana, azo itokisana, miaraka amin'ny fanaterana azo antoka, miaraka amin'ny fahafahana mikaroka hafatra mora foana. Miorina amin'ny mekanika, ampiharo iraka (hafatra, antso an-tsary) mandeha ao anatin'ny rindranasa 1C.

Mamorona ny rafitra ho marindrano scalable. Ny fitomboan'ny entana dia tsy maintsy rakofana amin'ny fampitomboana ny isan'ny nodes.

fanatanterahana

Nanapa-kevitra izahay fa tsy hampiditra mivantana ny ampahany amin'ny mpizara SV amin'ny sehatra 1C: Enterprise, fa hampihatra azy io ho vokatra misaraka, ny API izay azo antsoina amin'ny fehezan-dalàna momba ny vahaolana fampiharana 1C. Izany dia noho ny antony maromaro, ny tena zava-dehibe dia ny tiako hahatonga ny fifampizarana hafatra eo amin'ny fampiharana 1C samihafa (ohatra, eo amin'ny Trade Management sy Accounting). Ny fampiharana 1C samihafa dia afaka mandeha amin'ny dikan-teny samihafa amin'ny sehatra 1C: Enterprise, hita amin'ny lohamilina samihafa, sns. Amin'ny toe-javatra toy izany, ny fampiharana ny SV ho toy ny vokatra misaraka hita "amin'ny lafiny" ny fametrahana 1C no vahaolana tsara indrindra.

Noho izany, nanapa-kevitra ny hanao SV ho vokatra misaraka izahay. Manoro hevitra izahay fa ny orinasa madinika dia mampiasa ny lohamilina CB izay napetrakay ao amin'ny rahonay (wss://1cdialog.com) mba hialana amin'ny vidin'ny overhead mifandraika amin'ny fametrahana sy ny fanamafisam-peo eo an-toerana. Ny mpanjifa lehibe dia mety mahita fa tsara ny mametraka ny mpizara CB azy manokana ao amin'ny tranony. Nampiasa fomba mitovy amin'izany izahay tamin'ny vokatra rahona SaaS 1c Vaovao - dia novokarina ho toy ny vokatra be dia be ho an'ny fametrahana amin'ny tranokalan'ny mpanjifa, ary apetraka ao amin'ny rahonay ihany koa https://1cfresh.com/.

fampiharana

Mba hizarana ny fandeferana enta-mavesatra sy fahadisoam-panantenana, dia tsy hametraka fampiharana Java iray izahay, fa maromaro, miaraka amin'ny mpandrindra entana eo anoloan'izy ireo. Raha mila mamindra hafatra avy amin'ny node mankany amin'ny node ianao dia ampiasao ny famoahana / famandrihana amin'ny Hazelcast.

Ny fifandraisana eo amin'ny mpanjifa sy ny mpizara dia amin'ny alàlan'ny websocket. Mety tsara ho an'ny rafitra amin'ny fotoana tena izy.

Cache zaraina

Nisafidy teo amin'i Redis, Hazelcast ary Ehcache izahay. 2015 izao. Redis vao namoaka cluster vaovao (vaovao loatra, mampatahotra), misy Sentinel misy fameperana be dia be. Tsy hain'i Ehcache ny mivondrona ao anaty cluster (niseho taty aoriana io fampiasa io). Nanapa-kevitra izahay fa hanandrana izany amin'ny Hazelcast 3.4.
Hazelcast dia miangona ao anaty cluster avy ao anaty boaty. Amin'ny fomba tokana node dia tsy dia ilaina loatra ary azo ampiasaina ho toy ny cache ihany - tsy hainy ny manary data amin'ny kapila, raha very ny hany node dia very ny angona. Mametraka Hazelcasts maromaro izahay, ka eo anelanelan'izany no anaovanay backup ny angona tsikera. Tsy manohana ny cache izahay - tsy mampaninona anay izany.

Ho antsika, ny Hazelcast dia:

  • Fitehirizana ny fotoam-piasan'ny mpampiasa. Mitaky fotoana lava ny fandehanana any amin'ny tahiry ho an'ny fivoriana iray isaky ny mandeha, noho izany dia apetrakay ao amin'ny Hazelcast ny fivoriana rehetra.
  • Cache. Raha mitady profil mpampiasa ianao dia jereo ny cache. Nanoratra hafatra vaovao - apetraho ao anaty cache.
  • Lohahevitra momba ny fifandraisana eo amin'ireo ohatra fampiharana. Mamorona hetsika ny node ary mametraka izany ao amin'ny lohahevitra Hazelcast. Ny node fampiharana hafa misoratra anarana amin'ity lohahevitra ity dia mandray sy mikarakara ny hetsika.
  • Cluster hidy. Ohatra, mamorona fifanakalozan-kevitra izahay amin'ny fampiasana fanalahidy tokana (resadresaka tokana ao anatin'ny tahiry 1C):

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

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

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

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

Nojerenay fa tsy misy fantsona. Noraisinay ny hidin-trano, nojerenay indray ary noforoninay. Raha tsy manamarina ny hidin-trano ianao rehefa avy naka ny hidin-trano, dia misy ny mety hisian'ny kofehy hafa nanamarina tamin'io fotoana io ary hiezaka hamorona fifanakalozan-kevitra mitovy amin'izany - saingy efa misy izany. Tsy afaka manidy ianao amin'ny fampiasana java Lock voarindra na mahazatra. Amin'ny alàlan'ny angon-drakitra - miadana izany, ary mampalahelo ny angon-drakitra; amin'ny alàlan'ny Hazelcast - izany no ilainao.

Mifidy DBMS

Manana traikefa be dia be sy mahomby izahay miasa amin'ny PostgreSQL ary miara-miasa amin'ireo mpamorona an'ity DBMS ity.

Tsy mora amin'ny kluster PostgreSQL - misy XL, XC, Citus, fa amin'ny ankapobeny dia tsy NoSQL ireo izay mivoaka ao anaty boaty. Tsy noheverinay ho fitahirizana lehibe ny NoSQL; ampy ny nakana ny Hazelcast, izay tsy niara-niasa taminay taloha.

Raha mila manenjana angon-drakitra relational ianao dia midika izany sharding. Araka ny fantatrao, amin'ny sharding dia mizara ny angon-drakitra ho ampahany samihafa izahay mba hahafahan'ny tsirairay amin'izy ireo apetraka amin'ny lohamilina iray.

Ny dikan-teny voalohany amin'ny sharding dia nihevitra ny fahafahana mizara ny latabatra tsirairay amin'ny fampiharanay amin'ny servisy samihafa amin'ny ampahany samihafa. Betsaka ny hafatra ao amin'ny mpizara A - azafady, andao hamindra ny ampahany amin'ity latabatra ity mankany amin'ny mpizara B. Ity fanapahan-kevitra ity dia nikiakiaka fotsiny momba ny fanatsarana aloha loatra, ka nanapa-kevitra izahay fa hametra ny tenanay amin'ny fomba fiasa marobe.

Azonao atao ny mamaky momba ny multi-mpanofa, ohatra, ao amin'ny tranokala Data citus.

SV dia manana ny foto-kevitry ny fampiharana sy ny mpanjifa. Ny fampiharana dia fametrahana manokana ny rindranasa fandraharahana, toy ny ERP na Accounting, miaraka amin'ny mpampiasa azy sy ny angona momba ny orinasa. Ny mpanjifa dia fikambanana na olon-tsotra izay misoratra anarana amin'ny mpizara SV amin'ny anaran'ny fampiharana. Ny mpanjifa dia afaka manana rindranasa maromaro misoratra anarana, ary afaka mifanakalo hafatra ireo fampiharana ireo. Lasa mpanofa tao amin'ny rafitray ilay mpanjifa. Ny hafatra avy amin'ny mpanjifa maromaro dia azo jerena ao anaty tahiry ara-batana iray; raha hitantsika fa nanomboka niteraka fifamoivoizana be ny mpanjifa iray, dia afindrantsika any amin'ny angon-drakitra ara-batana misaraka (na mpizara database misaraka mihitsy aza).

Manana angon-drakitra lehibe izahay izay misy latabatra fitetezana misy fampahalalana momba ny toerana misy ny angon-drakitra rehetra.

Ahoana ary nahoana izahay no nanoratanay serivisy azo scalable be entana ho an'ny 1C: Enterprise: Java, PostgreSQL, Hazelcast

Mba hisakanana ny angon-drakitra lehibe tsy ho tavoara, dia tazoninay ao anaty cache ny latabatry ny lalana (sy ireo angona hafa ilaina matetika).

Raha manomboka miadana ny angon-drakitra an'ny mpanjifa dia hotapahintsika ho fizarazarana ao anatiny. Amin'ny tetikasa hafa ampiasainay pg_pathman.

Satria ratsy ny fahaverezan'ny hafatry ny mpampiasa, dia mitazona ny angon-drakitray miaraka amin'ny kopia izahay. Ny fitambaran'ny replicas synchronous sy asynchronous dia ahafahanao miantoka ny tenanao raha toa ka very ny tahiry fototra. Ny fahaverezan'ny hafatra dia hitranga raha tsy mahomby miaraka ny angon-drakitra voalohany sy ny dika mitovy aminy.

Raha very ny kopia synchronous dia lasa synchronous ny kopia asynchronous.
Raha very ny angon-drakitra lehibe, dia lasa tahiry lehibe ny kopia synchronous, ary ny kopia asynchronous dia lasa replica synchronous.

Elasticsearch ho an'ny fikarohana

Satria, ankoatry ny zavatra hafa, ny SV dia iraka ihany koa, mitaky fikarohana haingana sy mora ary mora, amin'ny fiheverana ny morphologie, amin'ny fampiasana lalao tsy mazava. Nanapa-kevitra ny tsy hanamboatra ny kodiarana izahay ary hampiasa ny motera fikarohana maimaim-poana Elasticsearch, noforonina mifototra amin'ny tranomboky Lucene. Izahay koa dia mametraka Elasticsearch ao anaty cluster (master - data - data) mba hanafoanana ny olana raha sendra ny tsy fahombiazan'ny nodes fampiharana.

Hitanay tao amin'ny github Plugin morphologie Rosiana ho an'ny Elasticsearch ary ampiasao izany. Ao amin'ny indeksan'ny Elasticsearch dia mitahiry ny fakan'ny teny isika (izay mamaritra ny plugin) sy N-grams. Rehefa miditra lahatsoratra hikaroka ny mpampiasa, dia mitady ny lahatsoratra voatendry amin'ny N-grams izahay. Rehefa voatahiry ao amin'ny fanondroana, ny teny hoe "soratra" dia hozaraina amin'ireto grama N manaraka ireto:

[ireo, tek, tex, text, texts, ek, ex, ext, texts, ks, kst, ksty, st, sty, anao],

Ary hotehirizina koa ny fototry ny teny hoe “soratra”. Ity fomba fiasa ity dia ahafahanao mikaroka any amin'ny voalohany, eo afovoany ary amin'ny faran'ny teny.

Ny sary lehibe

Ahoana ary nahoana izahay no nanoratanay serivisy azo scalable be entana ho an'ny 1C: Enterprise: Java, PostgreSQL, Hazelcast
Avereno ilay sary tany am-piandohan'ny lahatsoratra, saingy miaraka amin'ny fanazavana:

  • Mpandanja naseho tamin'ny Internet; manana nginx izahay, mety misy izany.
  • Mifampiresaka amin'ny alàlan'ny Hazelcast ny fampiharana Java.
  • Mba hiasa amin'ny faladia web ampiasainay Netty.
  • Ny fampiharana Java dia nosoratana tamin'ny Java 8 ary misy amboara OSGi. Ny drafitra dia misy ny fifindra-monina mankany Java 10 ary ny fifindrana mankany amin'ny modules.

Fampandrosoana sy fitsapana

Teo am-pamolavolana sy fitiliana ny SV dia nahitana endri-javatra mahaliana maromaro amin'ny vokatra ampiasainay.

Fitsapana entana sy fitadidiana mitete

Ny famotsorana ny famoahana SV tsirairay dia misy ny fitiliana entana. Mahomby izany rehefa:

  • Niasa nandritra ny andro maromaro ny fitsapana ary tsy nisy ny tsy fahombiazan'ny serivisy
  • Ny fotoana famaliana ho an'ny asa lehibe dia tsy mihoatra ny fe-potoana mahazo aina
  • Tsy mihoatra ny 10% ny fahasimban'ny fampisehoana raha oharina amin'ny dikan-teny teo aloha.

Fenoy angon-drakitra ny angon-drakitra fitsapana - mba hanaovana izany, dia mahazo vaovao momba ny mpanjifa mavitrika indrindra avy amin'ny mpizara famokarana, ampitomboy ny isany amin'ny 5 (ny isan'ny hafatra, fifanakalozan-kevitra, mpampiasa) ary andramo izany.

Manao fitiliana enta-mavesatra ny rafi-pifandraisana amin'ny fanamafisana telo izahay:

  1. fitsapana adin-tsaina
  2. Fifandraisana ihany
  3. Fisoratana anarana

Mandritra ny fitsapana adin-tsaina, dia manomboka kofehy an-jatony maro izahay, ary mameno ny rafitra tsy mijanona izy ireo: manoratra hafatra, mamorona fifanakalozan-kevitra, mandray lisitry ny hafatra. Manahaka ny fihetsiky ny mpampiasa tsotra izahay (mahazo lisitr'ireo hafatro mbola tsy novakiako, manorata amin'olona) sy vahaolana amin'ny rindrambaiko (mandefa fonosana misy rindrankajy hafa, manaova fanairana).

Ohatra, toy izao ny ampahany amin'ny fitsapana adin-tsaina:

  • Miditra ny mpampiasa
    • Mangataka ny fifanakalozan-kevitrao tsy novakiana
    • 50% no mety hamaky hafatra
    • 50% no mety handefa hafatra
    • Mpampiasa manaraka:
      • Manana vintana 20% hamorona dinika vaovao
      • Mifidy kisendrasendra ny iray amin'ireo dinika ao aminy
      • Mandeha ao anatiny
      • Mangataka hafatra, mombamomba ny mpampiasa
      • Mamorona hafatra dimy miantefa amin'ireo mpampiasa kisendrasendra avy amin'ity fifanakalozan-kevitra ity
      • Miala dinika
      • Miverina in-20
      • Mivoaha, miverina amin'ny fiandohan'ny script

    • Miditra ao amin'ny rafitra ny chatbot (mamoaka hafatra avy amin'ny kaody fampiharana)
      • Manana vintana 50% hamorona fantsona vaovao ho an'ny fifanakalozana angona (dinika manokana)
      • 50% no mety hanoratra hafatra amin'ireo fantsona efa misy

Ny scenario "Connections Only" dia niseho noho ny antony iray. Misy toe-javatra iray: nampifandray ny rafitra ny mpampiasa, saingy tsy mbola tafiditra. Ny mpampiasa tsirairay dia mamelona ny solosaina amin'ny 09:00 maraina, mametraka fifandraisana amin'ny mpizara ary mangina. Mampidi-doza ry zalahy ireto, be dia be izy ireo - PING/PONG irery no fonosana azony, fa mitazona ny connexion amin'ny server (tsy afaka mitazona izany - ahoana raha misy hafatra vaovao). Ny fitsapana dia mamerina toe-javatra iray izay ahafahan'ny mpampiasa marobe maro manandrana miditra amin'ny rafitra ao anatin'ny antsasak'adiny. Mitovitovy amin'ny fitsapana adin-tsaina izy io, fa amin'ity fampidirana voalohany ity indrindra no ifantohany - mba tsy hisian'ny tsy fahombiazana (tsy mampiasa ny rafitra ny olona iray, ary efa mianjera - sarotra ny mieritreritra zavatra ratsy kokoa).

Ny script fisoratana anarana mpanjifa dia manomboka amin'ny fandefasana voalohany. Nanao fitsapana adin-tsaina izahay ary azonay antoka fa tsy nihena ny rafitra nandritra ny fifampiresahana. Saingy tonga ny mpampiasa ary nanomboka tsy nahomby ny fisoratana anarana noho ny fahataperan'ny fotoana. Rehefa nisoratra anarana izahay dia nampiasa / dev / kisendrasendra, izay mifandray amin'ny entropy ny rafitra. Tsy nanam-potoana hanangonana entropy ampy ny mpizara ary rehefa nangataka SecureRandom vaovao dia nivaingana nandritra ny segondra vitsivitsy. Misy fomba maro hivoahana amin'ity toe-javatra ity, ohatra: miverena amin'ny / dev / urandom tsy dia azo antoka loatra, mametraka board manokana izay miteraka entropy, mamorona isa kisendrasendra mialoha ary tehirizo ao anaty dobo. Nohidinay vonjimaika ny olana tamin'ny dobo, fa nanomboka teo dia nanao andrana manokana momba ny fisoratana anarana mpanjifa vaovao.

Ampiasainay ho toy ny mpamokatra entana JMeter. Tsy hainy ny miasa amin'ny websocket; mila plugin. Ny voalohany amin'ny valin'ny fikarohana momba ny fangatahana "jmeter websocket" dia: lahatsoratra avy amin'ny BlazeMeter, izay manoro hevitra plugin avy amin'i Maciej Zaleski.

Teo no nanapa-kevitra ny hanomboka.

Saika avy hatrany taorian'ny nanombohan'ny fitsapana matotra, dia hitanay fa nanomboka nandroaka fahatsiarovana i JMeter.

Ny plugin dia tantara lehibe misaraka; miaraka amin'ny kintana 176, misy 132 forks amin'ny github. Ny mpanoratra mihitsy no tsy nanolo-tena tamin'izany nanomboka tamin'ny 2015 (nalainay tamin'ny 2015 izany, avy eo tsy nampiahiahy azy), olana github maromaro momba ny fahatapahan'ny fahatsiarovana, fangatahana 7 tsy mihidy.
Raha manapa-kevitra ny hanao fitiliana entana ianao amin'ny fampiasana an'ity plugin ity dia tandremo ireto fifanakalozan-kevitra manaraka ireto:

  1. Ao amin'ny tontolo misy kofehy maromaro, LinkedList mahazatra no nampiasaina, ary ny vokany dia NPE in runtime. Azo voavaha izany na amin'ny alàlan'ny fifindrana amin'ny ConcurrentLinkedDeque na amin'ny alàlan'ny sakana synchronized. Nifidy ny safidy voalohany ho anay izahay (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Miporitsaka ny fahatsiarovana; rehefa tapaka ny fifandraisana dia tsy voafafa ny fampahalalana momba ny fifandraisana (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. Amin'ny fomba streaming (rehefa tsy mihidy ny websocket amin'ny faran'ny santionany, fa ampiasaina any aoriana any amin'ny drafitra), dia tsy mandeha ny lamina famaliana (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

Ity dia iray amin'ireo ao amin'ny github. Ny nataonay:

  1. Efa naka fork Elyran Kogan (@elyrank) – mamaha ny olana 1 sy 3 izany
  2. Voavaha ny olana 2
  3. Jetty nohavaozina tamin'ny 9.2.14 hatramin'ny 9.3.12
  4. Nofonosina SimpleDateFormat amin'ny ThreadLocal; SimpleDateFormat dia tsy azo antoka amin'ny kofehy, izay nitarika ho amin'ny NPE amin'ny fotoana fandehanana
  5. Namboarina leak ny fitadidiana hafa (tsy nikatona ny fifandraisana rehefa tapaka)

Ary mbola mikoriana!

Nanomboka lany ny fahatsiarovana tsy tao anatin'ny iray andro, fa tao anatin'ny roa. Tsy nisy fotoana intsony, noho izany dia nanapa-kevitra ny handefa kofehy vitsivitsy izahay, fa amin'ny mpiasa efatra. Tokony ho ampy herinandro farafahakeliny izany.

Roa andro no lasa...

Efa lany fitadidiana izao ny Hazelcast. Nasehon'ny logs fa taorian'ny fitsapana roa andro dia nanomboka nitaraina momba ny tsy fahampian'ny fitadidiana i Hazelcast, ary rehefa afaka kelikely dia nirodana ny cluster, ary nitohy maty tsirairay ny nodes. Nampifandray an'i JVisualVM tamin'ny hazelcast izahay ary nahita "tsofa miakatra" - antsoina matetika hoe GC, saingy tsy afaka nanadio ny fahatsiarovana.

Ahoana ary nahoana izahay no nanoratanay serivisy azo scalable be entana ho an'ny 1C: Enterprise: Java, PostgreSQL, Hazelcast

Hita fa ao amin'ny hazelcast 3.4, rehefa mamafa sarintany / multiMap (map.destroy()) dia tsy afaka tanteraka ny fahatsiarovana:

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

Namboarina tao amin'ny 3.5 izao ilay bug, saingy olana izany tamin'izany. Namorona multiMaps vaovao misy anarana mavitrika izahay ary nofafanay araka ny lojikanay. Toy izao ny code:

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

Antso:

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

multiMap dia noforonina ho an'ny famandrihana tsirairay ary voafafa rehefa tsy ilaina izany. Nanapa-kevitra izahay fa hanomboka Map , ny lakile dia ny anaran'ny famandrihana, ary ny soatoavina dia ny session identifiers (izay ahafahanao mahazo mpampiasa famantarana, raha ilaina).

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

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

Nihatsara ny tabilao.

Ahoana ary nahoana izahay no nanoratanay serivisy azo scalable be entana ho an'ny 1C: Enterprise: Java, PostgreSQL, Hazelcast

Inona koa no nianarantsika momba ny fitiliana entana?

  1. JSR223 dia mila soratana amin'ny groovy ary misy cache compilation - haingana kokoa izany. rohy.
  2. Ny grafika Jmeter-Plugins dia mora azo kokoa noho ny mahazatra. rohy.

Momba ny traikefanay tamin'ny Hazelcast

Hazelcast dia vokatra vaovao ho anay, nanomboka niasa niaraka tamin'izany izahay avy amin'ny version 3.4.1, ankehitriny ny serivera famokarana dia mihazakazaka version 3.9.2 (tamin'ny fotoana nanoratana, ny dikan-teny farany an'ny Hazelcast dia 3.10).

Generation ID

Nanomboka tamin'ny famantarana integer izahay. Alao sary an-tsaina fa mila Long hafa isika ho an'ny orinasa vaovao. Ny filaharana ao amin'ny database dia tsy mety, ny latabatra dia tafiditra amin'ny sharding - hita fa misy hafatra ID = 1 ao amin'ny DB1 ary hafatra ID = 1 ao amin'ny DB2, tsy azonao atao ny mametraka an'io ID io ao amin'ny Elasticsearch, na ao amin'ny Hazelcast , fa ny ratsy indrindra dia raha te hanambatra ny angona avy amin'ny angon-drakitra roa ho iray ianao (ohatra, manapa-kevitra fa ny angona iray dia ampy ho an'ireo mpanjifa ireo). Azonao atao ny manampy AtomicLongs maromaro amin'ny Hazelcast ary mitazona ny kaontera ao, avy eo ny fanatanterahana ny fahazoana ID vaovao dia incrementAndGet miampy ny fotoana fangatahana amin'ny Hazelcast. Saingy manana zavatra tsara kokoa i Hazelcast - FlakeIdGenerator. Rehefa mifandray amin'ny mpanjifa tsirairay izy ireo dia omena laharana ID izy ireo, ohatra, ny voalohany - manomboka amin'ny 1 ka hatramin'ny 10, ny faharoa - manomboka amin'ny 000 ka hatramin'ny 10, sy ny sisa. Amin'izao fotoana izao, ny mpanjifa dia afaka mamoaka famantarana vaovao ho azy mandra-pahatapitry ny laharana nomena azy. Miasa haingana izy io, fa rehefa averinao indray ny fampiharana (sy ny mpanjifa Hazelcast), dia misy filaharana vaovao manomboka - noho izany ny skips, sns. Fanampin'izay, tsy tena takatry ny mpamorona ny antony maha-integer ny ID, fa tsy mifanaraka. Nolanjainay ny zava-drehetra ary nivadika ho UUID.

Raha ny tokony ho izy, ho an'ireo izay te ho tahaka ny Twitter dia misy tranomboky Snowcast toy izany - fampiharana ny Snowflake eo an-tampon'ny Hazelcast. Azonao jerena eto:

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

Saingy tsy mbola nihaona tamin'izany intsony izahay.

TransactionalMap.replace

Fahagagana hafa: tsy mandeha ny TransactionalMap.replace. Ity misy fitsapana:

@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

Tsy maintsy nanoratra ny soloko manokana aho tamin'ny fampiasana 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);
}

Andramo tsy ny rafitra angon-drakitra mahazatra ihany, fa ny dikan-teny transactional azy koa. Mitranga fa miasa ny IMap, saingy tsy misy intsony ny TransactionalMap.

Ampidiro JAR vaovao tsy misy fiatoana

Voalohany, nanapa-kevitra ny hanoratra zavatra momba ny kilasinay ao amin'ny Hazelcast izahay. Ohatra, manana kilasy Application izahay, te-hitahiry sy hamaky azy io. Tehirizo:

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

Namaky izahay hoe:

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

Mandeha ny zava-drehetra. Avy eo dia nanapa-kevitra ny hanangana tondro ao amin'ny Hazelcast izahay mba hikaroka amin'ny alalan'ny:

map.addIndex("subscriberId", false);

Ary rehefa nanoratra singa vaovao izy ireo dia nanomboka nahazo ClassNotFoundException. Niezaka nanampy tamin'ny fanondroana i Hazelcast, saingy tsy nahalala na inona na inona momba ny kilasinay ary naniry ny hanomezana JAR miaraka amin'ity kilasy ity. Nanao izany izahay, niasa ny zava-drehetra, saingy nisy olana vaovao niseho: ahoana ny fanavaozana ny JAR nefa tsy mijanona tanteraka ny cluster? Hazelcast dia tsy maka ny JAR vaovao mandritra ny fanavaozana node-by-node. Tamin'ity fotoana ity dia nanapa-kevitra izahay fa afaka miaina tsy misy fikarohana index. Rehefa dinihina tokoa, raha mampiasa Hazelcast ho fivarotana manan-danja ianao, dia handeha ny zava-drehetra? Tsy dia izany loatra. Eto indray dia hafa ny fihetsiky ny IMap sy TransactionalMap. Raha tsy miraharaha ny IMap, TransactionalMap dia manipy hadisoana.

IMap. Manoratra zavatra 5000 izahay, mamaky azy ireo. Andrasana ny zava-drehetra.

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

Saingy tsy mandeha amin'ny fifampiraharahana izany, mahazo ClassNotFoundException izahay:

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

Ao amin'ny 3.8, niseho ny mekanika Fampielezana ny Kilasy mpampiasa. Azonao atao ny manendry node master iray ary manavao ny rakitra JAR eo aminy.

Ankehitriny dia nanova tanteraka ny fomba fiasay izahay: mametraka azy amin'ny JSON izahay ary mitahiry izany ao amin'ny Hazelcast. Tsy mila mahafantatra ny firafitry ny kilasinay i Hazelcast, ary afaka manavao tsy misy fiatoana izahay. Ny famoahana ny zavatra domaine dia fehezin'ny fampiharana. Ny dikan-teny samihafa amin'ny rindranasa dia afaka mandeha amin'ny fotoana iray ihany, ary misy toe-javatra mety hitranga rehefa manoratra zavatra miaraka amin'ny saha vaovao ny fampiharana vaovao, fa ny taloha dia tsy mbola mahafantatra momba ireo sehatra ireo. Ary miaraka amin'izay koa, ny fampiharana vaovao dia mamaky zavatra nosoratan'ny fampiharana taloha izay tsy manana sehatra vaovao. Mikarakara toe-javatra toy izany izahay ao anatin'ny fampiharana, fa ho an'ny fahatsorana dia tsy manova na mamafa saha izahay, manitatra ny kilasy amin'ny fampidirana saha vaovao ihany izahay.

Ahoana no hiantohanay fahombiazana ambony

Dia efatra mankany Hazelcast - tsara, roa mankany amin'ny angon-drakitra - ratsy

Ny fandehanana any amin'ny cache ho an'ny angona dia tsara kokoa noho ny fandehanana any amin'ny angon-drakitra, saingy tsy te-hitahiry rakitsoratra tsy ampiasaina koa ianao. Avelantsika ny fanapahan-kevitra momba izay tokony ho cache mandra-pahatongan'ny dingana farany amin'ny fampandrosoana. Rehefa asiana kaody ny fampiasa vaovao, dia velominay ny fandraketana ny fanontaniana rehetra ao amin'ny PostgreSQL (log_min_duration_statement to 0) ary manao fitiliana entana mandritra ny minitra 20. Amin'ny fampiasana ny logs voaangona, ny fitaovana toy ny pgFouine sy pgBadger dia afaka manangana tatitra momba ny fanadihadiana. Ao amin'ny tatitra dia mitady fanontaniana miadana sy matetika izahay. Ho an'ny fanontaniana miadana dia manangana drafitry ny fanatanterahana (EXPLAIN) izahay ary manombana raha azo atao haingana ny fangatahana toy izany. Ny fangatahana matetika ho an'ny angona fampidirana mitovy dia mifanaraka tsara amin'ny cache. Miezaka mitazona fanontaniana "fisaka" izahay, latabatra iray isaky ny fangatahana.

fitrandrahana

SV ho serivisy an-tserasera dia napetraka tamin'ny lohataonan'ny 2017, ary ho toy ny vokatra misaraka, navoaka ny SV tamin'ny Novambra 2017 (tamin'izany fotoana izany tamin'ny sata version beta).

Tao anatin'ny herintaona mahery niasana, tsy nisy olana goavana teo amin'ny fampandehanana ny serivisy CB an-tserasera. Manara-maso ny serivisy an-tserasera amin'ny alàlan'ny Zabbix, manangona sy manaparitaka avy amin'ny Bamboo.

Ny fizarana mpizara SV dia omena amin'ny endrika fonosana teratany: RPM, DEB, MSI. Plus ho an'ny Windows dia manome installer tokana amin'ny endrika EXE tokana izay mametraka ny server, Hazelcast ary Elasticsearch amin'ny milina iray. Nantsoinay tamin'ny voalohany ity dikan-tenin'ny fametrahana ity ho ny dikan-teny "demo", saingy izao dia nanjary nazava fa io no safidy fandefasana malaza indrindra.

Source: www.habr.com

Add a comment