Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast

Hauv tsab xov xwm no peb yuav tham txog yuav ua li cas thiab vim li cas peb thiaj li tsim Kev sib tham System - lub tshuab uas hloov cov ntaub ntawv ntawm cov neeg siv khoom siv thiab 1C: Kev lag luam servers - los ntawm kev teeb tsa txoj haujlwm rau kev xav los ntawm cov qauv tsim thiab kev siv cov ntsiab lus.

Qhov Kev Sib Tham Sib Tham (tom qab no hu ua SV) yog ib qho kev xa tawm tsis raug cai nrog kev lees paub kev xa khoom. SV yog tsim los ua kev pabcuam siab nrog kev ua haujlwm siab, muaj ob qho tib si raws li kev pabcuam online (muab los ntawm 1C) thiab ua cov khoom tsim tawm loj uas tuaj yeem xa mus rau koj tus kheej cov chaw pabcuam.

SV siv cov khoom faib hazelcast thiab nrhiav cav Elasticsearch. Peb tseem yuav tham txog Java thiab yuav ua li cas peb horizontally scale PostgreSQL.
Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast

Nqe lus ntawm qhov teeb meem

Txhawm rau kom paub meej tias vim li cas peb thiaj tsim Kev Sib Tham Sib Tham, Kuv yuav qhia koj me ntsis txog kev txhim kho kev lag luam hauv 1C ua haujlwm li cas.

Pib nrog, me ntsis txog peb rau cov neeg uas tseem tsis tau paub tias peb ua dab tsi :) Peb tab tom ua 1C: Kev Lag Luam thev naus laus zis platform. Lub platform muaj xws li kev lag luam daim ntawv thov kev txhim kho cov cuab yeej, nrog rau lub sijhawm ua haujlwm uas tso cai rau cov ntawv thov kev lag luam khiav hauv qhov chaw hla kev.

Client-server txoj kev loj hlob paradigm

Cov ntawv thov kev lag luam tsim los ntawm 1C: Kev lag luam ua haujlwm hauv peb theem neeg siv-server architecture "DBMS - daim ntawv thov server - neeg siv". Daim ntawv thov code sau rau hauv built-in 1C lus, tuaj yeem ua tiav ntawm daim ntawv thov server lossis ntawm tus neeg siv khoom. Txhua yam ua haujlwm nrog cov khoom siv (cov ntawv qhia, cov ntaub ntawv, thiab lwm yam), nrog rau kev nyeem thiab sau cov ntaub ntawv, tsuas yog ua rau ntawm lub server. Lub functionality ntawm cov ntaub ntawv thiab hais kom ua interface kuj yog siv nyob rau hauv lub server. Tus neeg siv khoom tau txais, qhib thiab nthuav tawm cov ntaub ntawv, "kev sib txuas lus" nrog tus neeg siv (cov lus ceeb toom, cov lus nug ...), kev suav me me hauv cov ntawv uas xav tau cov lus teb ceev (piv txwv li, muab tus nqi sib npaug ntawm qhov ntau), ua haujlwm nrog cov ntaub ntawv hauv zos, ua haujlwm nrog cov khoom siv.

Nyob rau hauv daim ntawv thov code, lub headers ntawm cov txheej txheem thiab kev ua hauj lwm yuav tsum qhia meej tias qhov twg code yuav raug tua - siv lub &AtClient / &AtServer cov lus qhia (&AtClient / &AtServer hauv lus Askiv version ntawm hom lus). 1C cov neeg tsim tawm tam sim no yuav kho kuv los ntawm kev hais tias cov lus qhia tiag tiag ntau tshaj, tab sis rau peb qhov no tsis tseem ceeb tam sim no.

Koj tuaj yeem hu rau server code los ntawm tus neeg siv code, tab sis koj tsis tuaj yeem hu tus neeg siv khoom los ntawm tus lej server. Qhov no yog qhov kev txwv tseem ceeb uas peb tau ua rau ntau qhov laj thawj. Tshwj xeeb, vim hais tias tus neeg rau zaub mov code yuav tsum tau sau nyob rau hauv xws li ib txoj kev uas nws executes tib txoj kev txawm nyob qhov twg nws yog hu ua - los ntawm tus neeg siv los yog los ntawm lub server. Thiab nyob rau hauv cov ntaub ntawv ntawm kev hu rau server code los ntawm lwm tus neeg rau zaub mov code, tsis muaj tus neeg siv li ntawd. Thiab vim hais tias thaum lub sij hawm ua tiav ntawm tus neeg rau zaub mov code, tus neeg siv hu nws tuaj yeem kaw, tawm hauv daim ntawv thov, thiab lub server yuav tsis muaj leej twg hu.

Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast
Code uas tuav lub pob nyem: hu rau tus txheej txheem server los ntawm tus neeg siv yuav ua haujlwm, hu rau tus neeg siv khoom tus txheej txheem los ntawm tus neeg rau zaub mov yuav tsis

Qhov no txhais tau hais tias yog tias peb xav xa qee cov lus los ntawm cov neeg rau zaub mov mus rau daim ntawv thov tus neeg siv khoom, piv txwv li, tias tiam ntawm daim ntawv tshaj tawm "ntev" tau ua tiav thiab daim ntawv tshaj tawm tuaj yeem pom, peb tsis muaj txoj hauv kev zoo li no. Koj yuav tsum siv dag zog, piv txwv li, ib ntus tshawb xyuas tus neeg rau zaub mov los ntawm tus neeg siv khoom. Tab sis qhov no mus kom ze loads lub kaw lus nrog kev hu tsis tsim nyog, thiab feem ntau tsis zoo nkauj heev.

Thiab tseem muaj qhov xav tau, piv txwv li, thaum hu xov tooj tuaj txog SIP- Thaum hu xov tooj, ceeb toom rau tus neeg siv daim ntawv thov txog qhov no kom nws tuaj yeem siv tus neeg hu xov tooj kom pom nws hauv cov ntaub ntawv sib koom tes thiab qhia cov neeg siv cov ntaub ntawv hais txog kev hu xov tooj. Los yog, piv txwv li, thaum ib qho kev txiav txim tuaj txog ntawm lub tsev khaws khoom, ceeb toom rau tus neeg siv khoom daim ntawv thov txog qhov no. Feem ntau, muaj ntau qhov xwm txheej zoo li no yuav muaj txiaj ntsig zoo.

Kev tsim khoom nws tus kheej

Tsim ib lub tshuab xa xov. Fast, txhim khu kev qha, nrog guaranteed tus me nyuam, nrog lub peev xwm mus flexibly tshawb rau cov lus. Raws li cov txheej txheem, siv tus xa xov (cov lus, hu xov tooj) khiav hauv 1C daim ntawv thov.

Tsim qhov system kom horizontally scalable. Qhov nce load yuav tsum tau them los ntawm kev nce tus naj npawb ntawm cov nodes.

Kev siv

Peb txiav txim siab tsis koom ua ke cov neeg rau zaub mov ntawm SV ncaj qha rau hauv 1C: Kev Lag Luam platform, tab sis los siv nws ua cov khoom sib cais, API uas tuaj yeem raug hu los ntawm cov cai ntawm 1C daim ntawv thov kev daws teeb meem. Qhov no tau ua tiav rau ntau qhov laj thawj, qhov tseem ceeb yog qhov kuv xav kom nws tuaj yeem sib pauv lus ntawm 1C daim ntawv thov sib txawv (piv txwv li, ntawm Kev Tswj Lag Luam thiab Kev Lag Luam). Cov ntawv thov sib txawv 1C tuaj yeem khiav ntawm ntau qhov sib txawv ntawm 1C: Kev lag luam platform, nyob ntawm cov servers sib txawv, thiab lwm yam. Hauv cov xwm txheej zoo li no, kev siv SV raws li cov khoom sib cais nyob hauv "sab" ntawm 1C kev teeb tsa yog qhov kev daws teeb meem zoo.

Yog li, peb txiav txim siab los ua SV ua ib qho khoom sib cais. Peb pom zoo kom cov tuam txhab me siv CB server uas peb tau teeb tsa hauv peb huab (wss: // 1cdialog.com) kom tsis txhob muaj cov nqi siv nyiaj siv ua haujlwm nrog kev teeb tsa hauv zos thiab teeb tsa ntawm lub server. Cov neeg siv khoom loj tuaj yeem pom tias nws tsim nyog rau nruab lawv tus kheej CB server ntawm lawv cov chaw. Peb siv txoj hauv kev zoo sib xws hauv peb cov khoom lag luam huab SaaS 1c Fresh - Nws yog tsim los ua cov khoom tsim tawm loj rau kev teeb tsa ntawm cov neeg siv khoom qhov chaw, thiab tseem tau muab tso rau hauv peb cov huab https://1cfresh.com/.

Daim ntawv thov

Txhawm rau faib cov khoom thauj thiab kev ua txhaum cai, peb yuav siv tsis yog ib daim ntawv thov Java, tab sis ob peb, nrog rau cov khoom sib npaug rau pem hauv ntej ntawm lawv. Yog tias koj xav hloov cov lus ntawm node mus rau ntawm node, siv luam tawm / sau npe hauv Hazelcast.

Kev sib txuas lus ntawm tus neeg siv khoom thiab lub server yog ntawm websocket. Nws zoo haum rau lub sijhawm tiag tiag.

Distributed cache

Peb xaiv ntawm Redis, Hazelcast thiab Ehcache. Nws yog 2015. Redis nyuam qhuav tso tawm ib pawg tshiab (tshiab dhau, txaus ntshai), muaj Sentinel nrog ntau qhov kev txwv. Ehcache tsis paub yuav ua li cas sib sau ua ke hauv pawg (qhov kev ua haujlwm no tshwm sim tom qab). Peb txiav txim siab sim nws nrog Hazelcast 3.4.
Hazelcast tau sib sau ua ke rau hauv ib pawg tawm ntawm lub thawv. Nyob rau hauv ib lub node hom, nws tsis yog heev pab tau thiab tsuas yog siv tau raws li ib tug cache - nws tsis paub yuav ua li cas pov tseg cov ntaub ntawv rau disk, yog hais tias koj poob lub xwb node, koj poob cov ntaub ntawv. Peb xa ntau Hazelcasts, ntawm qhov uas peb backup cov ntaub ntawv tseem ceeb. Peb tsis thaub qab lub cache - peb tsis mloog nws.

Rau peb, Hazelcast yog:

  • Cia cov neeg siv sijhawm. Nws yuav siv sij hawm ntev mus rau hauv cov ntaub ntawv rau kev sib tham txhua zaus, yog li peb muab tag nrho cov kev sib tham hauv Hazelcast.
  • Cache. Yog tias koj tab tom nrhiav rau tus neeg siv profile, kos lub cache. Sau cov lus tshiab - muab tso rau hauv lub cache.
  • Cov ntsiab lus rau kev sib txuas lus ntawm cov ntawv thov piv txwv. Cov node tsim ib qho kev tshwm sim thiab muab tso rau hauv lub ntsiab lus Hazelcast. Lwm daim ntawv thov nodes sau npe rau lub ncauj lus no tau txais thiab ua tiav qhov kev tshwm sim.
  • Cluster xauv. Piv txwv li, peb tsim kev sib tham siv tus yuam sij tshwj xeeb (singleton kev sib tham hauv 1C database):

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

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

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

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

Peb tau txheeb xyuas tias tsis muaj channel. Peb muab lub xauv, kuaj nws dua, thiab tsim nws. Yog tias koj tsis txheeb xyuas lub xauv tom qab siv lub xauv, ces muaj lub caij nyoog uas lwm cov xov kuj tau tshawb xyuas lub sijhawm ntawd thiab tam sim no yuav sim tsim tib qhov kev sib tham - tab sis nws twb muaj lawm. Koj tsis tuaj yeem xauv siv synchronized lossis tsis tu ncua java Lock. Los ntawm cov ntaub ntawv - nws qeeb, thiab nws yog kev hlub rau cov ntaub ntawv; los ntawm Hazelcast - qhov ntawd yog qhov koj xav tau.

Xaiv DBMS

Peb muaj kev paub dhau los thiab ua tiav ua haujlwm nrog PostgreSQL thiab koom tes nrog cov tsim tawm ntawm DBMS no.

Nws tsis yooj yim nrog PostgreSQL pawg - muaj XL, XC, Citus, tab sis feem ntau cov no tsis yog NoSQLs uas teev tawm ntawm lub thawv. Peb tsis tau txiav txim siab NoSQL ua qhov tseem ceeb cia; nws txaus uas peb coj Hazelcast, uas peb tsis tau ua haujlwm nrog ua ntej.

Yog hais tias koj xav tau scale ib relational database, nws txhais tau tias kev sib faib. Raws li koj paub, nrog sharding peb faib cov ntaub ntawv rau hauv nyias qhov chaw kom lawv txhua tus tuaj yeem muab tso rau hauv ib lub server cais.

Thawj version ntawm peb sharding xav tias muaj peev xwm faib txhua lub rooj ntawm peb daim ntawv thov hla cov servers sib txawv hauv qhov sib txawv. Muaj ntau cov lus ntawm tus neeg rau zaub mov A - thov, cia peb txav ib feem ntawm lub rooj no mus rau tus neeg rau zaub mov B. Qhov kev txiav txim siab no tsuas yog qw txog kev ua kom zoo ntxov ntxov, yog li peb txiav txim siab txwv peb tus kheej mus rau ntau tus neeg xauj tsev mus kom ze.

Koj tuaj yeem nyeem txog ntau tus neeg xauj tsev, piv txwv li, ntawm lub vev xaib Citus Data.

SV muaj cov ntsiab lus ntawm daim ntawv thov thiab cov neeg siv khoom. Ib daim ntawv thov yog kev teeb tsa tshwj xeeb ntawm daim ntawv thov kev lag luam, xws li ERP lossis Accounting, nrog nws cov neeg siv thiab cov ntaub ntawv lag luam. Ib tus neeg siv khoom yog ib lub koom haum lossis ib tus neeg uas nws sawv cev rau daim ntawv thov tau sau npe hauv SV server. Cov neeg siv khoom tuaj yeem muaj ntau daim ntawv thov sau npe, thiab cov ntawv thov no tuaj yeem sib pauv lus sib tham. Cov neeg siv khoom tau dhau los ua tus neeg xauj tsev hauv peb qhov system. Cov lus los ntawm ntau tus neeg siv khoom tuaj yeem nyob hauv ib lub cev database; Yog tias peb pom tias tus neeg siv khoom tau pib tsim ntau lub tsheb, peb txav nws mus rau qhov chaw sib cais ntawm lub cev (lossis txawm tias cais cov neeg siv khoom database).

Peb muaj cov ntaub ntawv tseem ceeb uas lub rooj routing khaws cia nrog cov ntaub ntawv hais txog qhov chaw ntawm txhua tus neeg siv khoom databases.

Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast

Txhawm rau tiv thaiv cov ntaub ntawv tseem ceeb los ntawm kev ua lub hauv paus, peb khaws lub rooj sib tham (thiab lwm yam ntaub ntawv xav tau ntau zaus) hauv ib lub cache.

Yog hais tias tus neeg siv khoom lub database pib qeeb, peb yuav txiav nws mus rau hauv partitions hauv. Hauv lwm qhov project peb siv pg_cov.

Txij li thaum poob cov neeg siv cov lus tsis zoo, peb khaws peb cov ntaub ntawv nrog cov ntawv luam tawm. Kev sib xyaw ua ke ntawm synchronous thiab asynchronous replicas tso cai rau koj los xyuas koj tus kheej thaum poob ntawm lub ntsiab database. Cov lus poob tsuas yog tshwm sim yog tias cov ntaub ntawv tseem ceeb thiab nws cov ntaub ntawv synchronous ua tsis tiav ib txhij.

Yog hais tias lub synchronous replica ploj lawm, lub asynchronous replica yuav synchronous.
Yog hais tias lub ntsiab database ploj lawm, lub synchronous replica ua lub ntsiab database, thiab lub asynchronous replica ua ib tug synchronous replica.

Elasticsearch rau kev tshawb nrhiav

Txij li thaum, ntawm lwm yam, SV kuj yog ib tug tub txib, nws yuav tsum tau ib tug ceev, yooj yim thiab saj zawg zog nrhiav, coj mus rau hauv tus account morphology, siv imprecise ntais ntawv. Peb txiav txim siab tsis rov tsim lub log thiab siv lub tshuab tshawb nrhiav dawb Elasticsearch, tsim los ntawm lub tsev qiv ntawv Lucene. Peb kuj siv Elasticsearch hauv ib pawg (tus tswv - cov ntaub ntawv - cov ntaub ntawv) txhawm rau tshem tawm cov teeb meem thaum tsis ua haujlwm ntawm daim ntawv thov nodes.

Hauv github peb pom Lavxias teb sab morphology plugin rau Elasticsearch thiab siv nws. Hauv Elasticsearch index peb khaws cov lus hauv paus (uas lub plugin txiav txim siab) thiab N-grams. Raws li tus neeg siv nkag mus rau cov ntawv nyeem, peb nrhiav cov ntawv ntaus ntawv ntawm N-grams. Thaum khaws cia rau qhov ntsuas, lo lus "cov ntawv" yuav muab faib ua N-grams hauv qab no:

[cov, tek, tex, text, texts, ek, ex, ext, texts, ks, kst, ksty, st, sty, koj],

Thiab lub hauv paus ntawm lo lus "ntawv" tseem yuav khaws cia. Txoj hauv kev no tso cai rau koj los tshawb nrhiav thaum pib, nruab nrab, thiab thaum kawg ntawm lo lus.

Daim duab loj

Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast
Rov ua daim duab los ntawm qhov pib ntawm tsab xov xwm, tab sis nrog cov lus piav qhia:

  • Balancer nthuav tawm hauv Is Taws Nem; peb muaj nginx, nws tuaj yeem yog ib qho.
  • Java daim ntawv thov piv txwv sib txuas lus nrog ib leeg ntawm Hazelcast.
  • Txhawm rau ua haujlwm nrog lub qhov (socket) peb siv netty.
  • Daim ntawv thov Java yog sau rau hauv Java 8 thiab muaj cov pob OSGi. Cov phiaj xwm suav nrog kev tsiv mus rau Java 10 thiab hloov mus rau cov qauv.

Kev txhim kho thiab kev sim

Nyob rau hauv tus txheej txheem ntawm kev tsim thiab sim SV, peb tuaj hla ib tug xov tooj ntawm nthuav nta ntawm cov khoom uas peb siv.

Load xeem thiab nco xau

Kev tso tawm ntawm txhua qhov kev tso tawm SV suav nrog kev sim thauj khoom. Nws ua tiav thaum:

  • Qhov kev sim ua haujlwm tau ob peb hnub thiab tsis muaj kev pabcuam tsis ua haujlwm
  • Lub sij hawm teb rau cov haujlwm tseem ceeb tsis tau tshaj qhov pib nyiam
  • Kev ua haujlwm tsis zoo piv rau yav dhau los version tsis ntau tshaj 10%

Peb sau cov ntaub ntawv xeem nrog cov ntaub ntawv - ua qhov no, peb tau txais cov ntaub ntawv hais txog cov neeg siv khoom nquag tshaj plaws los ntawm cov neeg siv khoom tsim khoom, muab nws cov lej los ntawm 5 (tus naj npawb ntawm cov lus, kev sib tham, cov neeg siv) thiab sim nws li ntawd.

Peb ua cov kev kuaj load ntawm kev sib cuam tshuam system nyob rau hauv peb configurations:

  1. xeem kev nyuaj siab
  2. Kev sib txuas nkaus xwb
  3. Pab subscriber

Thaum lub sij hawm ntsuas kev ntxhov siab, peb tso ntau pua xov, thiab lawv thauj cov kab ke tsis tas yuav tsum tau: sau cov lus, tsim kev sib tham, tau txais cov npe ntawm cov lus. Peb simulate cov kev ua ntawm cov neeg siv zoo tib yam (tau txais cov npe ntawm kuv cov lus tsis tau nyeem, sau rau ib tus neeg) thiab cov kev daws teeb meem software (xa tawm ib pob ntawm cov kev teeb tsa sib txawv, ua haujlwm ceeb toom).

Piv txwv li, qhov no yog ib feem ntawm qhov kev ntsuam xyuas kev ntxhov siab zoo li:

  • Cov neeg siv nkag rau hauv
    • Thov koj qhov kev sib tham tsis tau nyeem
    • 50% yuav nyeem cov lus
    • 50% zoo li ntawv
    • Tom ntej no tus neeg siv:
      • Muaj 20% txoj hauv kev los tsim kev sib tham tshiab
      • Randomly xaiv ib qho ntawm nws cov kev sib tham
      • Mus rau hauv
      • Thov cov lus, cov neeg siv profiles
      • Tsim tsib cov lus hais rau cov neeg siv random los ntawm kev sib tham no
      • Tawm kev sib tham
      • Rov ua dua 20 zaug
      • Logs tawm, rov qab mus rau qhov pib ntawm tsab ntawv

    • Ib tug chatbot nkag mus rau hauv lub system (emulates messaging los ntawm daim ntawv thov code)
      • Muaj 50% txoj hauv kev los tsim cov channel tshiab rau kev sib pauv ntaub ntawv (kev sib tham tshwj xeeb)
      • 50% zoo li yuav sau cov lus rau ib qho ntawm cov channel uas twb muaj lawm

Qhov xwm txheej "Kev Sib Txuas nkaus xwb" tshwm sim vim li cas. Muaj qhov xwm txheej: cov neeg siv tau txuas nrog lub kaw lus, tab sis tseem tsis tau koom nrog. Txhua tus neeg siv hloov lub computer thaum 09:00 sawv ntxov, tsim kev sib txuas rau lub server thiab nyob twj ywm. Cov txiv neej no txaus ntshai, muaj ntau ntawm lawv - tsuas yog cov pob khoom uas lawv muaj yog PING / PONG, tab sis lawv khaws kev sib txuas rau lub server (lawv tsis tuaj yeem khaws nws - dab tsi yog tias muaj lus tshiab). Qhov kev sim rov tsim dua qhov xwm txheej uas ntau tus neeg siv zoo li no sim nkag mus rau hauv qhov system hauv ib nrab teev. Nws zoo ib yam li kev ntsuas kev ntxhov siab, tab sis nws lub hom phiaj yog qhov tseeb ntawm qhov kev tawm tswv yim thawj zaug - kom tsis muaj qhov ua tsis tiav (ib tus neeg tsis siv lub kaw lus, thiab nws twb poob lawm - nws nyuaj rau xav txog tej yam phem dua).

Daim ntawv sau npe tus neeg siv khoom pib los ntawm thawj zaug tso tawm. Peb tau ua qhov kev ntsuam xyuas kev ntxhov siab thiab paub tseeb tias lub kaw lus tsis qeeb qeeb thaum sau ntawv. Tab sis cov neeg siv tuaj thiab cov ntawv sau npe pib ua tsis tiav vim lub sijhawm sijhawm. Thaum sau npe peb siv / dev / Random, uas muaj feem xyuam rau lub entropy ntawm lub system. Tus neeg rau zaub mov tsis muaj sijhawm los sau cov entropy txaus thiab thaum thov kom SecureRandom tshiab, nws khov rau kaum vib nas this. Muaj ntau txoj hauv kev tawm ntawm qhov xwm txheej no, piv txwv li: hloov mus rau qhov tsis muaj kev nyab xeeb dua / dev / urandom, nruab ib lub rooj tsav xwm tshwj xeeb uas tsim cov entropy, tsim cov lej random ua ntej thiab khaws cia rau hauv lub pas dej. Peb ib ntus kaw qhov teeb meem nrog lub pas dej ua ke, tab sis txij thaum ntawd los peb tau khiav ib qho kev sim cais rau kev sau npe cov neeg siv tshiab.

Peb siv raws li ib tug load generator JMeter. Nws tsis paub yuav ua li cas nrog websocket; nws xav tau lub plugin. Thawj qhov kev tshawb nrhiav rau cov lus nug "jmeter websocket" yog: cov khoom los ntawm BlazeMeter, uas pom zoo plugin los ntawm Maciej Zaleski.

Qhov ntawd yog qhov uas peb txiav txim siab pib.

Yuav luag tam sim ntawd tom qab pib qhov kev sim loj, peb pom tias JMeter pib xau nco.

Lub plugin yog ib zaj dab neeg loj cais; nrog 176 hnub qub, nws muaj 132 diav rawg ntawm github. Tus sau nws tus kheej tsis tau cog lus rau nws txij li xyoo 2015 (peb tau coj nws hauv 2015, tom qab ntawd nws tsis tau tsa qhov kev xav tsis thoob), ntau qhov teeb meem github hais txog kev nco qab, 7 qhov kev thov rub tawm tsis tau kaw.
Yog tias koj txiav txim siab ua qhov kev sim load siv cov plugin no, thov ua tib zoo mloog cov lus hauv qab no:

  1. Nyob rau hauv ib puag ncig ntau txoj xov, ib qho LinkedList ib txwm siv, thiab qhov tshwm sim yog NPE hauv runtime. Qhov no tuaj yeem daws tau los ntawm kev hloov mus rau ConcurrentLinkedDeque lossis los ntawm synchronized blocks. Peb xaiv thawj qhov kev xaiv rau peb tus kheej (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Memory leak; thaum disconnecting, cov ntaub ntawv kev twb kev txuas yuav tsis deleted (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. Hauv hom streaming (thaum lub websocket tsis raug kaw thaum kawg ntawm tus qauv, tab sis siv tom qab hauv txoj kev npaj), Cov qauv teb tsis ua haujlwm (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

Nov yog ib qho ntawm cov hauv github. Peb ua dab tsi:

  1. Tau noj Elyran Kogan tau txais kev cawmdim (@elyrank) - nws kho cov teeb meem 1 thiab 3
  2. daws teeb meem 2
  3. Hloov kho dav hlau los ntawm 9.2.14 txog 9.3.12
  4. Qhwv SimpleDateFormat hauv ThreadLocal; SimpleDateFormat tsis yog xov-zoo, uas coj mus rau NPE ntawm lub sijhawm ua haujlwm
  5. Kho lwm lub cim xeeb xau (qhov kev sib txuas raug kaw tsis raug thaum txiav tawm)

Thiab tseem nws ntws!

Nco pib khiav tsis nyob rau hauv ib hnub, tab sis nyob rau hauv ob. Tsis muaj sij hawm dhau mus, yog li peb tau txiav txim siab tso cov xov tsawg dua, tab sis ntawm plaub tus neeg sawv cev. Qhov no yuav tsum tau txaus tsawg kawg ib lub lim tiam.

Ob hnub dhau lawm...

Tam sim no Hazelcast tab tom khiav tawm ntawm kev nco. Cov cav tau pom tias tom qab ob peb hnub ntawm kev sim, Hazelcast pib yws txog qhov tsis nco qab, thiab tom qab qee lub sijhawm cov pawg poob sib nrug, thiab cov nodes txuas ntxiv tuag ib zaug. Peb txuas JVisualVM rau hazelcast thiab pom "nce pom" - nws tsis tu ncua hu ua GC, tab sis tsis tuaj yeem tshem lub cim xeeb.

Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast

Nws muab tawm tias nyob rau hauv hazelcast 3.4, thaum rho tawm ib daim ntawv qhia / multiMap (map.destroy()), lub cim xeeb tsis pub dawb kiag li:

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

Cov kab mob tam sim no tau kho hauv 3.5, tab sis nws yog ib qho teeb meem rov qab los. Peb tsim tshiab multiMaps nrog cov npe dynamic thiab tshem tawm raws li peb cov logic. Lub code ntsia ib yam dab tsi zoo li no:

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

Saib:

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

multiMap tau tsim rau txhua qhov kev tso npe thiab tshem tawm thaum nws tsis xav tau. Peb txiav txim siab tias peb yuav pib Map , tus yuam sij yuav yog lub npe ntawm qhov kev tso npe, thiab cov txiaj ntsig yuav yog cov cim kev sib tham (los ntawm qhov koj tuaj yeem tau txais cov neeg siv tus cim, yog tias tsim nyog).

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

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

Cov kab kos tau txhim kho.

Yuav ua li cas thiab yog vim li cas peb sau ib tug high-load scalable kev pab cuam rau 1C: Enterprise: Java, PostgreSQL, Hazelcast

Dab tsi ntxiv peb tau kawm txog kev kuaj load?

  1. JSR223 yuav tsum tau sau nyob rau hauv groovy thiab suav nrog muab tso ua ke cache - nws sai dua. txuas.
  2. Jmeter-Plugins graphs yooj yim to taub dua li cov qauv. txuas.

Hais txog peb qhov kev paub nrog Hazelcast

Hazelcast yog ib yam khoom tshiab rau peb, peb pib ua hauj lwm nrog nws los ntawm version 3.4.1, tam sim no peb cov neeg rau zaub mov tsim tau khiav version 3.9.2 (thaum lub sijhawm sau ntawv, qhov tseeb version ntawm Hazelcast yog 3.10).

ID tiam

Peb pib nrog integer identifiers. Cia peb xav txog tias peb xav tau lwm Qhov Ntev rau ib qho chaw tshiab. Ib ntus hauv cov ntaub ntawv tsis tsim nyog, cov ntxhuav tau koom nrog hauv kev sib faib - nws hloov tawm tias muaj cov lus ID = 1 hauv DB1 thiab cov lus ID = 1 hauv DB2, koj tsis tuaj yeem tso tus ID no hauv Elasticsearch, lossis hauv Hazelcast. , tab sis qhov phem tshaj plaws yog tias koj xav muab cov ntaub ntawv los ntawm ob lub databases rau hauv ib qho (piv txwv li, txiav txim siab tias ib qho database txaus rau cov neeg siv khoom no). Koj tuaj yeem ntxiv ob peb AtomicLongs rau Hazelcast thiab khaws lub txee rau ntawd, tom qab ntawd qhov kev ua tau zoo ntawm kev tau txais tus ID tshiab yog nce ntxivAndGet ntxiv rau lub sijhawm thov rau Hazelcast. Tab sis Hazelcast muaj qee yam zoo dua - FlakeIdGenerator. Thaum hu rau txhua tus neeg siv khoom, lawv tau muab tus ID ntau, piv txwv li, thawj tus - los ntawm 1 txog 10, qhov thib ob - los ntawm 000 txog 10, thiab lwm yam. Tam sim no tus neeg siv khoom tuaj yeem tshaj tawm cov cim tshiab ntawm nws tus kheej kom txog thaum qhov ntau yam muab rau nws xaus. Nws ua haujlwm sai, tab sis thaum koj rov pib dua daim ntawv thov (thiab Hazelcast tus neeg siv), ib ntu tshiab pib - yog li qhov hla, thiab lwm yam. Tsis tas li ntawd, cov neeg tsim khoom tsis tshua nkag siab tias vim li cas cov IDs yog cov lej, tab sis tsis sib xws. Peb ntsuas txhua yam thiab hloov mus rau UUIDs.

Los ntawm txoj kev, rau cov neeg uas xav ua zoo li Twitter, muaj xws li lub tsev qiv ntawv Snowcast - qhov no yog ib qho kev siv ntawm Snowflake saum Hazelcast. Koj tuaj yeem saib nws ntawm no:

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

Tab sis peb tsis tau paub txog nws lawm.

TransactionalMap.replace

Lwm qhov xav tsis thoob: TransactionalMap.replace tsis ua haujlwm. Nov yog qhov kev sim:

@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

Kuv yuav tsum sau kuv tus kheej hloov siv 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);
}

Kuaj tsis yog cov ntaub ntawv tsis tu ncua, tab sis kuj lawv cov kev hloov pauv hloov pauv. Nws tshwm sim tias IMap ua haujlwm, tab sis TransactionalMap tsis muaj lawm.

Ntxig lub JAR tshiab yam tsis muaj sijhawm poob

Ua ntej, peb txiav txim siab sau cov khoom ntawm peb cov chav kawm hauv Hazelcast. Piv txwv li, peb muaj chav kawm ntawv thov, peb xav txuag thiab nyeem nws. Txuag:

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

Lub sij hawm:

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

Txhua yam ua haujlwm. Tom qab ntawd peb txiav txim siab los tsim qhov Performance index hauv Hazelcast los tshawb nrhiav los ntawm:

map.addIndex("subscriberId", false);

Thiab thaum sau ib qhov chaw tshiab, lawv pib tau txais ClassNotFoundException. Hazelcast sim ntxiv rau qhov ntsuas, tab sis tsis paub dab tsi txog peb cov chav kawm thiab xav tau JAR nrog cov chav kawm no kom muab rau nws. Peb ua li ntawd, txhua yam ua haujlwm, tab sis qhov teeb meem tshiab tshwm sim: yuav ua li cas hloov kho JAR yam tsis muaj kev txwv tag nrho? Hazelcast tsis tuaj yeem nqa JAR tshiab thaum lub sijhawm hloov kho node-by-node. Lub sijhawm no peb txiav txim siab tias peb tuaj yeem nyob yam tsis muaj kev tshawb nrhiav. Tom qab tag nrho, yog tias koj siv Hazelcast ua lub khw tseem ceeb, ces txhua yam yuav ua haujlwm? Tsis yog tiag. Ntawm no dua tus cwj pwm ntawm IMap thiab TransactionalMap txawv. Qhov twg IMap tsis quav ntsej, TransactionalMap cuam tshuam qhov yuam kev.

IMap. Peb sau 5000 yam khoom, nyeem lawv. Txhua yam xav tau.

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

Tab sis nws tsis ua haujlwm hauv kev lag luam, peb tau txais 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();
        }
    });
}

Hauv 3.8, Cov Neeg Siv Khoom Siv Khoom Siv tau tshwm sim. Koj tuaj yeem xaiv ib tus tswv node thiab hloov kho JAR cov ntaub ntawv ntawm nws.

Tam sim no peb tau hloov tag nrho peb txoj hauv kev: peb muab nws tus kheej rau hauv JSON thiab txuag nws hauv Hazelcast. Hazelcast tsis tas yuav paub cov qauv ntawm peb cov chav kawm, thiab peb tuaj yeem hloov kho yam tsis muaj sijhawm poob. Versioning ntawm cov khoom sau yog tswj los ntawm daim ntawv thov. Cov ntawv sib txawv ntawm daim ntawv thov tuaj yeem ua haujlwm tib lub sijhawm, thiab qhov xwm txheej tuaj yeem ua tau thaum daim ntawv thov tshiab sau cov khoom nrog cov teb tshiab, tab sis tus qub tseem tsis tau paub txog cov teb no. Thiab tib lub sijhawm, daim ntawv thov tshiab nyeem cov khoom sau los ntawm daim ntawv thov qub uas tsis muaj cov teb tshiab. Peb tuav cov xwm txheej zoo li no hauv daim ntawv thov, tab sis rau qhov yooj yim peb tsis hloov lossis tshem tawm cov teb, peb tsuas yog nthuav cov chav kawm los ntawm kev ntxiv cov teb tshiab.

Yuav ua li cas peb xyuas kom muaj kev ua haujlwm siab

Plaub qhov kev mus ncig rau Hazelcast - zoo, ob mus rau database - phem

Mus rau lub cache rau cov ntaub ntawv yeej ib txwm zoo dua li mus rau hauv cov ntaub ntawv, tab sis koj tsis xav khaws cov ntaub ntawv tsis siv thiab. Peb tawm ntawm qhov kev txiav txim siab txog dab tsi yuav cache mus txog rau theem kawg ntawm kev txhim kho. Thaum lub functionality tshiab yog coded, peb tig rau logging ntawm tag nrho cov lus nug nyob rau hauv PostgreSQL (log_min_duration_statement rau 0) thiab khiav load testing rau 20 feeb. Siv cov ntaub ntawv sau, cov khoom siv xws li pgFouine thiab pgBadger tuaj yeem tsim cov ntaub ntawv txheeb xyuas. Hauv cov ntawv ceeb toom, peb feem ntau nrhiav qeeb thiab nquag nug. Rau cov lus nug qeeb, peb tsim ib txoj kev npaj ua tiav (Qhia) thiab tshuaj xyuas seb cov lus nug no puas tuaj yeem nrawm dua. Kev thov nquag rau tib cov ntaub ntawv tawm tswv yim haum zoo rau hauv cache. Peb sim khaws cov lus nug "paj", ib lub rooj rau ib qho lus nug.

Ua haujlwm

SV raws li kev pabcuam online tau muab tso rau hauv kev ua haujlwm thaum lub caij nplooj ntoo hlav xyoo 2017, thiab raws li cov khoom sib cais, SV tau tso tawm thaum Lub Kaum Ib Hlis 2017 (thaum lub sijhawm ntawd hauv beta version).

Hauv ntau tshaj li ib xyoos ntawm kev ua haujlwm, tsis muaj teeb meem loj hauv kev ua haujlwm ntawm CB kev pabcuam online. Peb saib xyuas qhov kev pabcuam online ntawm Zabbix, sau thiab deploy los ntawm xyoob.

SV neeg rau zaub mov xa tawm yog muab rau hauv daim ntawv ntawm cov pob khoom ib txwm muaj: RPM, DEB, MSI. Ntxiv rau Windows peb muab ib tus neeg nruab rau hauv daim ntawv ntawm ib qho EXE uas txhim kho lub server, Hazelcast thiab Elasticsearch ntawm ib lub tshuab. Peb thawj zaug xa mus rau qhov kev teeb tsa no raws li "demo" version, tab sis tam sim no nws tau paub meej tias qhov no yog qhov kev xaiv nrov tshaj plaws.

Tau qhov twg los: www.hab.com

Ntxiv ib saib