Pehea a no ke aha mākou i kākau ai i kahi lawelawe scalable kiʻekiʻe no 1C: Enterprise: Java, PostgreSQL, Hazelcast

Ma kēia ʻatikala e kamaʻilio mākou e pili ana i ke kumu a me ke kumu i kūkulu ai mākou Pūnaehana pili - he mīkini e hoʻoili i ka ʻike ma waena o nā noi mea kūʻai aku a me nā kikowaena 1C: Enterprise - mai ka hoʻonohonoho ʻana i kahi hana a hiki i ka noʻonoʻo ʻana ma o ka hoʻolālā a me nā kikoʻī hoʻokō.

ʻO ka Pūnaehana Interaction (i kapa ʻia ma hope aku ʻo SV) he ʻōnaehana memo me ka hoʻopaʻa ʻia ʻana. Hoʻolālā ʻia ʻo SV ma ke ʻano he lawelawe kiʻekiʻe me ka scalability kiʻekiʻe, loaʻa ma ke ʻano he lawelawe pūnaewele (i hāʻawi ʻia e 1C) a ma ke ʻano he huahana i hana nui ʻia e hiki ke kau ʻia ma kāu mau kikowaena kikowaena.

Hoʻohana ʻo SV i kahi waihona i puʻunaue ʻia hazelcast a me ka ʻenekini huli Elasticsearch. E kamaʻilio pū mākou e pili ana iā Java a pehea mākou e hoʻonui ai i ka PostgreSQL.
Pehea a no ke aha mākou i kākau ai i kahi lawelawe scalable kiʻekiʻe no 1C: Enterprise: Java, PostgreSQL, Hazelcast

Ka hoʻokumu ʻana i ka pilikia

No ka hoʻomaopopo ʻana i ke kumu i hana ai mākou i ka Pūnaehana Interaction, e haʻi iki wau iā ʻoe e pili ana i ka hana ʻana o ka hoʻomohala ʻana i nā noi ʻoihana ma 1C.

No ka hoʻomaka ʻana, he wahi liʻiliʻi e pili ana iā mākou no ka poʻe ʻike ʻole i kā mākou hana :) Ke hana nei mākou i ka paepae ʻenehana 1C: Enterprise. Aia ka papahana i kahi mea hana hoʻomohala noiʻi ʻoihana, a me kahi manawa holo e hiki ai i nā noi ʻoihana ke holo i kahi ʻano cross-platform.

ʻO ka hoʻomohala ʻana i nā mea kūʻai aku-server

ʻO nā noi pāʻoihana i hana ʻia ma 1C: E hana ana ʻo Enterprise i ʻekolu pae mea kūʻai aku hale hoʻolālā "DBMS - kikowaena noi - mea kūʻai". Palapala palapala noi i kākau ʻia ma ʻōlelo 1C i kūkulu ʻia, hiki ke hoʻokō ʻia ma ka kikowaena noi a i ʻole ka mea kūʻai aku. ʻO nā hana a pau me nā mea noi (nā papa kuhikuhi, nā palapala, a me nā mea'ē aʻe), a me ka heluhelu a me ke kākauʻana i ka waihona, hana waleʻia ma ka kikowaena. Hoʻokomo pū ʻia ka hana o nā palapala a me ka interface kauoha ma ke kikowaena. Hoʻokō ka mea kūʻai aku i ka loaʻa ʻana, wehe a hōʻike i nā palapala, "kamaʻilio" me ka mea hoʻohana (nā ʻōlelo aʻo, nā nīnau ...), nā helu liʻiliʻi ma nā ʻano e koi ai i ka pane wikiwiki (e like me ka hoʻonui ʻana i ke kumukūʻai ma ka nui), hana me nā faila kūloko, hana me ka lako.

Ma ka palapala noi, pono e kuhikuhi pono nā poʻo o nā kaʻina hana a me nā hana i kahi e hoʻokō ʻia ai ke code - me ka hoʻohana ʻana i nā kuhikuhi &AtClient / &AtServer (&AtClient / &AtServer ma ka mana Pelekane o ka ʻōlelo). E hoʻoponopono nā mea hoʻomohala 1C iaʻu ma ka ʻōlelo ʻana he ʻoiaʻiʻo nā kuhikuhi nui aʻe, akā, ʻaʻole ia he mea nui iā mākou i kēia manawa.

Hiki iā ʻoe ke kāhea i ke code server mai ka code client, akā ʻaʻole hiki iā ʻoe ke kāhea i ka code client mai ka code server. He palena koʻikoʻi kēia a mākou i hana ai no nā kumu he nui. ʻO ka mea nui, no ka mea, pono e kākau ʻia ke code server ma ke ʻano e hoʻokō ai i ke ala like ʻole kahi i hea ʻia ai - mai ka mea kūʻai aku a mai ka kikowaena paha. A i ka hihia o ke kāhea ʻana i ke code server mai kahi code server ʻē aʻe, ʻaʻohe mea kūʻai aku e like me ia. A no ka mea, i ka wā o ka hoʻokō ʻana i ke code server, hiki i ka mea kūʻai aku i kāhea iā ia ke pani, haʻalele i ka palapala noi, a ʻaʻohe mea e kāhea hou i ka server.

Pehea a no ke aha mākou i kākau ai i kahi lawelawe scalable kiʻekiʻe no 1C: Enterprise: Java, PostgreSQL, Hazelcast
ʻO ke code e paʻa ana i kahi kaomi pihi: e hana ana ke kāhea ʻana i ke kaʻina hana kikowaena mai ka mea kūʻai aku, e hana ana ke kāhea ʻana i kahi kaʻina hana mai ka kikowaena.

ʻO ia ke ʻano inā makemake mākou e hoʻouna i kekahi memo mai ke kikowaena i ka noi o ka mea kūʻai aku, no ka laʻana, ua pau ka hanauna o kahi hōʻike "lōʻihi" a hiki ke ʻike ʻia ka hōʻike, ʻaʻohe o mākou ala. Pono ʻoe e hoʻohana i nā hoʻopunipuni, no ka laʻana, koho i ka server mai ka code client. Akā ʻo kēia ala e hoʻouka ai i ka ʻōnaehana me nā kelepona pono ʻole, a ʻaʻole i nānā nani loa.

A aia kekahi pono, no ka laʻana, ke hiki mai ke kelepona e hō mai noʻu- i ke kelepona ʻana, e haʻi aku i ka noi mea kūʻai e pili ana i kēia i hiki iā ia ke hoʻohana i ka helu o ka mea kelepona e ʻimi ai i loko o ka waihona counterparty a hōʻike i ka ʻike mea hoʻohana e pili ana i ka counterparty kelepona. A i ʻole, no ka laʻana, i ka hiki ʻana mai o kahi kauoha i ka hale kūʻai, e hoʻomaopopo i ka noi o ka mea kūʻai aku e pili ana i kēia. Ma keʻano laulā, nui nā hihia kahi e pono ai kēlā ʻano hana.

ʻO ka hana ponoʻī

E hana i kahi hana memo. ʻO ka wikiwiki, hilinaʻi, me ka hōʻoiaʻiʻo i ka hāʻawi ʻana, me ka hiki ke huli maʻalahi i nā memo. Ma muli o ke kaʻina hana, e hoʻokō i kahi ʻelele (nā memo, nā kelepona wikiō) e holo ana i loko o nā noi 1C.

E hoʻolālā i ka ʻōnaehana i hiki ke hoʻonui ʻia. Pono e uhi ʻia ka hoʻonui ʻana i ka nui o nā nodes.

Ka hoʻokō

Ua hoʻoholo mākou ʻaʻole e hoʻopili pololei i ka ʻāpana kikowaena o SV i ka 1C: Enterprise platform, akā e hoʻokō iā ia ma ke ʻano he huahana ʻokoʻa, hiki ke kāhea ʻia ka API mai ke code o nā hoʻonā noi noi 1C. Ua hanaʻia kēia no nā kumu he nui,ʻo ka mea nui i makemake au e hiki ke hoʻololi i nā leka ma waena o nā noi 1C likeʻole (e like me ka laʻana, ma waena o Trade Management a me Accounting). Hiki ke holo nā noi 1C like ʻole ma nā ʻano like ʻole o ka 1C: Enterprise platform, aia ma nā kikowaena like ʻole, etc. Ma ia mau kūlana, ʻo ka hoʻokō ʻana o SV ma ke ʻano he huahana ʻokoʻa aia "ma ka ʻaoʻao" o nā hoʻonohonoho 1C ʻo ia ka hopena maikaʻi loa.

No laila, ua hoʻoholo mākou e hana i ka SV ma ke ʻano he huahana ʻokoʻa. Manaʻo mākou e hoʻohana nā hui liʻiliʻi i ka server CB a mākou i hoʻokomo ai i kā mākou ao (wss://1cdialog.com) e pale aku i nā kumukūʻai o luna e pili ana i ka hoʻonohonoho kūloko a me ka hoʻonohonoho ʻana o ke kikowaena. Hiki i nā mea kūʻai nui ke hoʻokomo i kā lākou kikowaena CB ponoʻī ma kā lākou mau keʻena. Ua hoʻohana mākou i kahi ala like i kā mākou huahana SaaS kapua 1c Hou - hana ʻia ʻo ia ma ke ʻano he huahana i hana nui ʻia no ka hoʻokomo ʻana i nā pūnaewele o nā mea kūʻai aku, a ua kau ʻia hoʻi i kā mākou ao. https://1cfresh.com/.

Ka hoʻohana

No ka hāʻawi ʻana i ka haʻahaʻa a me ka hoʻomanawanui hewa, ʻaʻole mākou e kau i hoʻokahi palapala Java, akā he nui, me kahi mea kaulike i mua o lākou. Inā pono ʻoe e hoʻololi i kahi memo mai ka node a i ka node, e hoʻohana i ka paʻi / kau inoa ma Hazelcast.

ʻO ke kamaʻilio ʻana ma waena o ka mea kūʻai aku a me ke kikowaena ma o ka websocket. He kūpono no nā ʻōnaehana manawa maoli.

Hoʻokaʻawale ʻia kahi huna huna

Ua koho mākou ma waena o Redis, Hazelcast a me Ehcache. ʻO 2015 kēia. Ua hoʻokuʻu wale ʻo Redis i kahi puʻupuʻu hou (hou loa, weliweli), aia ʻo Sentinel me ka nui o nā kapu. ʻAʻole ʻike ʻo Ehcache i ka hui ʻana i loko o kahi pūpū (ua ʻike ʻia kēia hana ma hope). Ua hoʻoholo mākou e hoʻāʻo me Hazelcast 3.4.
Hoʻohui ʻia ʻo Hazelcast i loko o kahi pūʻulu ma waho o ka pahu. Ma ke ʻano node hoʻokahi, ʻaʻole maikaʻi loa ia a hiki ke hoʻohana wale ʻia ma ke ʻano he huna - ʻaʻole ʻike ia pehea e hoʻolei i ka ʻikepili i ka disk, inā e nalowale ʻoe i ka node wale nō, nalowale ʻoe i ka ʻikepili. Hoʻonoho mākou i kekahi mau Hazelcasts, ma waena a mākou e hoʻopaʻa ai i ka ʻikepili koʻikoʻi. ʻAʻole mākou e hoʻihoʻi i ka cache - ʻaʻole mākou manaʻo.

No mākou, ʻo Hazelcast:

  • Ka mālama ʻana i nā kau mea hoʻohana. He lōʻihi ka manawa e hele ai i ka waihona no kahi hālāwai i kēlā me kēia manawa, no laila ke kau nei mākou i nā kau āpau ma Hazelcast.
  • Cache. Inā ʻoe e ʻimi nei i kahi mea hoʻohana, e nānā i ka cache. Ua kākau i kahi memo hou - e hoʻokomo i loko o ka waihona.
  • Nā kumuhana no ke kamaʻilio ʻana ma waena o nā mea noi. Hoʻokumu ka node i kahi hanana a waiho i ke kumuhana Hazelcast. Loaʻa a hoʻopaʻa inoa nā node noi ʻē aʻe i kēia kumuhana.
  • Laka pūʻulu. No ka laʻana, hana mākou i kūkākūkā me ka hoʻohana ʻana i kahi kī kū hoʻokahi (kūkākūkā hoʻokahi i loko o ka waihona 1C):

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

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

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

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

Ua nānā mākou ʻaʻohe ala. Lawe mākou i ka laka, nānā hou, a hana. Inā ʻaʻole ʻoe e nānā i ka laka ma hope o ka lawe ʻana i ka laka, a laila aia kahi manawa i nānā ʻia kekahi pae ʻē aʻe i kēlā manawa a e hoʻāʻo nei e hana i ke kūkākūkā like - akā aia nō. ʻAʻole hiki iā ʻoe ke laka me ka hoʻohana ʻana i ka laka java maʻamau a i ʻole. Ma o ka waihona - ua lohi, a he mea minamina no ka waihona; ma o Hazelcast - ʻo ia kāu mea e pono ai.

Ke koho ʻana i kahi DBMS

Loaʻa iā mākou ka ʻike nui a kūleʻa e hana pū me PostgreSQL a hui pū me nā mea hoʻomohala o kēia DBMS.

ʻAʻole maʻalahi me kahi pūʻulu PostgreSQL - aia XL, XC, Citus, akā ma ka laulā, ʻaʻole kēia mau NoSQL i hoʻonui i waho o ka pahu. ʻAʻole mākou i noʻonoʻo iā NoSQL ma ke ʻano he waihona nui; ua lawa mākou i lawe iā Hazelcast, ka mea a mākou i hana ʻole ai ma mua.

Inā pono ʻoe e hoʻonui i kahi waihona relational, ʻo ia hoʻi ʻāwili ʻana. E like me kāu e ʻike ai, me ka sharding e hoʻokaʻawale mākou i ka waihona i nā ʻāpana ʻokoʻa i hiki ke kau ʻia kēlā me kēia o lākou ma kahi kikowaena kaʻawale.

ʻO ka mana mua o kā mākou sharding i manaʻo i ka hiki ke puʻunaue i kēlā me kēia papa o kā mākou noi ma nā kikowaena like ʻole i nā ʻāpana like ʻole. Nui nā memo ma ke kikowaena A - e ʻoluʻolu, e hoʻoneʻe i kahi ʻāpana o kēia papaʻaina i ka server B. Ua hoʻōho wale kēia hoʻoholo e pili ana i ka hoʻonui mua ʻana, no laila ua hoʻoholo mākou e kaupalena iā mākou iho i kahi ala hoʻolimalima lehulehu.

Hiki iā ʻoe ke heluhelu e pili ana i ka multi-tenant, no ka laʻana, ma ka pūnaewele ʻIkepili Citus.

Loaʻa iā SV nā manaʻo o ka noi a me ka mea kākau inoa. ʻO kahi noi kahi hoʻonohonoho kikoʻī o kahi noi ʻoihana, e like me ERP a i ʻole Accounting, me kāna mau mea hoʻohana a me ka ʻikepili ʻoihana. ʻO ka mea kākau inoa he hui a i ʻole kanaka nona ka inoa i hoʻopaʻa inoa ʻia ma ka kikowaena SV. Hiki i ka mea kākau inoa ke hoʻopaʻa inoa i kekahi mau noi, a hiki i kēia mau noi ke hoʻololi i nā memo me kekahi. Ua lilo ka mea kākau inoa i mea hoʻolimalima ma kā mākou pūnaewele. Hiki ke loaʻa nā memo mai nā mea kākau inoa i hoʻokahi waihona kino; inā ʻike mākou ua hoʻomaka ka mea kākau inoa e hana i ka nui o nā kaʻa, hoʻoneʻe mākou iā ia i kahi ʻikepili kino ʻokoʻa (a i ʻole kahi kikowaena waihona ʻokoʻa).

Loaʻa iā mākou kahi waihona nui kahi e mālama ʻia ai kahi papa kuhikuhi me ka ʻike e pili ana i kahi o nā waihona mea kākau inoa āpau.

Pehea a no ke aha mākou i kākau ai i kahi lawelawe scalable kiʻekiʻe no 1C: Enterprise: Java, PostgreSQL, Hazelcast

No ka pale ʻana i ka ʻikepili nui mai ka bottleneck, mālama mākou i ka papa kuhikuhi (a me nā ʻikepili ʻē aʻe i makemake pinepine ʻia) i loko o kahi huna.

Inā hoʻomaka e lohi ka waihona o ka mea kākau inoa, e ʻoki mākou iā ia i mau ʻāpana i loko. Ma nā papahana ʻē aʻe a mākou e hoʻohana ai pg_pathman.

No ka maikaʻi ʻole o ka nalowale ʻana o nā memo mea hoʻohana, mālama mākou i kā mākou ʻikepili me nā kope. ʻO ka hui pū ʻana o nā replicas synchronous a me asynchronous e hiki ai iā ʻoe ke hōʻoia iā ʻoe iho i ka hihia o ka nalowale o ka waihona kumu. E hoʻopau wale ʻia nā memo inā hāʻule ka waihona kumu mua a me kāna kope hoʻohālikelike i ka manawa like.

Inā nalowale ka hoʻopiʻi like ʻole, lilo ke kope asynchronous i ka synchronous.
Inā nalowale ka ʻikepili nui, lilo ka replica synchronous i ʻikepili nui, a lilo ka replica asynchronous i replica synchronous.

Elasticsearch no ka huli ʻana

No ka mea, ma waena o nā mea ʻē aʻe, he ʻelele hoʻi ʻo SV, pono ia i kahi huli wikiwiki, maʻalahi a maʻalahi hoʻi, e noʻonoʻo ana i ka morphology, me ka hoʻohana ʻana i nā pāʻani kūpono ʻole. Ua hoʻoholo mākou ʻaʻole e hana hou i ka huila a hoʻohana i ka ʻenekini huli manuahi ʻo Elasticsearch, i hana ʻia ma muli o ka waihona ʻO Lucene. Hoʻokomo pū mākou iā Elasticsearch i loko o kahi pūʻulu (master - data - data) e hoʻopau i nā pilikia i ka wā e hiki ʻole ai nā nodes noi.

Ma ka github ua ʻike mākou Pākuʻi morphology Lūkini no Elasticsearch a hoʻohana iā ia. Ma ka Elasticsearch index, mālama mākou i nā aʻa huaʻōlelo (kahi i hoʻoholo ai ka plugin) a me N-grams. Ke komo ka mea hoʻohana i ka kikokikona no ka huli ʻana, ʻimi mākou i ka kikokikona i paʻi ʻia ma waena o nā N-gram. Ke mālama ʻia i ka index, e hoʻokaʻawale ʻia ka huaʻōlelo "texts" i nā N-grams:

[kēlā, tek, tex, kikokikona, kikokikona, ek, ex, ext, kikokikona, ks, kst, ksty, st, sty, ʻoe],

A e mālama pū ʻia ke kumu o ka huaʻōlelo "text". ʻO kēia ala e hiki ai iā ʻoe ke ʻimi ma ka hoʻomaka, ma ka waena, a ma ka hope o ka huaʻōlelo.

ʻO ke kiʻi holoʻokoʻa

Pehea a no ke aha mākou i kākau ai i kahi lawelawe scalable kiʻekiʻe no 1C: Enterprise: Java, PostgreSQL, Hazelcast
E hana hou i ke kiʻi mai ka hoʻomaka ʻana o ka ʻatikala, akā me nā wehewehe:

  • Hōʻike ʻia ka mea kaulike ma ka Pūnaewele; Loaʻa iā mākou ka nginx, hiki i kekahi.
  • Ke kamaʻilio nei nā mea noi Java me kekahi i kekahi ma o Hazelcast.
  • No ka hana ʻana me kahi kumu pūnaewele mākou e hoʻohana ai Kūpono.
  • Ua kākau ʻia ka palapala Java ma Java 8 a loaʻa nā pūʻulu OSGi. Aia nā hoʻolālā i ka neʻe ʻana i Java 10 a me ka hoʻololi ʻana i nā modula.

Hoʻomohala a hoʻāʻo

Ma ke kaʻina o ka hoʻomohala ʻana a me ka hoʻāʻo ʻana i ka SV, ua ʻike mākou i kekahi mau hiʻohiʻona hoihoi o nā huahana a mākou e hoʻohana ai.

Hoʻouka hoʻāʻo a me ka hoʻomanaʻo leaks

ʻO ka hoʻokuʻu ʻana o kēlā me kēia hoʻokuʻu SV e pili ana i ka hoʻāʻo ukana. He holomua ke:

  • Ua hana ka ho'āʻo no kekahi mau lā a ʻaʻohe hāʻule lawelawe
  • ʻAʻole i ʻoi aku ka manawa pane no nā hana koʻikoʻi ma mua o ka paepae ʻoluʻolu
  • ʻAʻole iʻoi aku ka emi o ka hana ma mua o ka 10%

Hoʻopiha mākou i ka ʻikepili hoʻāʻo me ka ʻikepili - e hana i kēia, loaʻa iā mākou ka ʻike e pili ana i ka mea kākau inoa ikaika loa mai ka kikowaena hana, hoʻonui i kāna helu me 5 (ka helu o nā memo, nā kūkākūkā, nā mea hoʻohana) a hoʻāʻo iā ia i kēlā ala.

Lawe mākou i ka hoʻāʻo ʻana o ka ʻōnaehana pili i ʻekolu mau hoʻonohonoho:

  1. hoʻāʻo koʻikoʻi
  2. Nā pilina wale nō
  3. Kakau inoa

I ka wā o ka hoʻāʻo koʻikoʻi, hoʻomaka mākou i nā haneli he nui, a hoʻouka lākou i ka ʻōnaehana me ka ʻole o ka hoʻomaha: kākau ʻana i nā leka, hana i nā kūkākūkā, loaʻa i kahi papa inoa o nā leka. Hoʻohālikelike mākou i nā hana a nā mea hoʻohana maʻamau (loaʻa i ka papa inoa o kaʻu mau leka i heluhelu ʻole ʻia, e kākau i kekahi) a me nā ʻōnaehana polokalamu (hoʻouna i kahi pūʻolo o kahi hoʻonohonoho ʻokoʻa, e hana i kahi makaʻala).

Eia kekahi laʻana, eia ke ʻano o ka hoʻāʻo koʻikoʻi:

  • Hoʻokomo ka mea hoʻohana
    • Noi i kāu mau kūkākūkā heluhelu ʻole ʻia
    • 50% paha e heluhelu i nā memo
    • 50% paha i ka kikokikona
    • Mea hoʻohana aʻe:
      • Loaʻa iā 20% ka manawa e hana i kahi kūkākūkā hou
      • E koho wale i kekahi o kāna mau kūkākūkā
      • Hele i loko
      • Noi i nā memo, nā mea hoʻohana
      • Hoʻokumu i ʻelima mau memo i kuhikuhi ʻia i nā mea hoʻohana maʻamau mai kēia kūkākūkā
      • Haʻalele kūkākūkā
      • Hana hou 20 manawa
      • Logs out, hoʻi i ka hoʻomaka o ka palapala

    • Hoʻokomo ka chatbot i ka ʻōnaehana (emulate me ka leka uila mai ka code application)
      • Loaʻa iā 50% ka manawa e hana ai i kahi ala hou no ka hoʻololi ʻikepili (kūkākūkā kūikawā)
      • ʻO 50% paha e kākau i kahi memo i kekahi o nā kahawai e kū nei

Ua ʻike ʻia ke ʻano "Connections Only" no kahi kumu. Aia kekahi kūlana: ua hoʻopili nā mea hoʻohana i ka ʻōnaehana, akā ʻaʻole i komo. Huli kēlā me kēia mea hoʻohana i ke kamepiula ma 09:00 i ke kakahiaka, hoʻokumu i kahi pilina i ke kikowaena a noho mālie. He pōʻino kēia poʻe, nui lākou - ʻo ka PING/PONG wale nō nā pūʻolo, akā mālama lākou i ka pilina i ke kikowaena (ʻaʻole hiki iā lākou ke hoʻomau - pehea inā he leka hou). Hoʻopuka ka hōʻike i kahi kūlana kahi nui o ia mau mea hoʻohana e hoʻāʻo e komo i ka ʻōnaehana i ka hapalua hola. Ua like ia me ka ho'āʻo koʻikoʻi, akā ʻo kona manaʻo e pili pono ana i kēia hoʻokomo mua - no laila ʻaʻohe hemahema (ʻaʻole hoʻohana ke kanaka i ka ʻōnaehana, a hāʻule mua ia - paʻakikī ke noʻonoʻo i kahi mea ʻino).

Hoʻomaka ka palapala kākau inoa mai ka hoʻomaka mua ʻana. Ua hana mākou i kahi hoʻāʻo koʻikoʻi a maopopo mākou ʻaʻole lohi ka ʻōnaehana i ka wā o ka leka. Akā ua hele mai nā mea hoʻohana a ua hoʻomaka ka hoʻopaʻa inoa ʻana ma muli o kahi manawa. I ke kau inoa ʻana ua hoʻohana mākou / dev / kaulele, pili i ka entropy o ka ʻōnaehana. ʻAʻole i loaʻa i ke kikowaena ka manawa e hōʻiliʻili ai i ka entropy a i ka wā i noi ʻia ai kahi SecureRandom hou, ua maloʻo ia no nā ʻumi kekona. Nui nā ala i waho o kēia kūlana, no ka laʻana: e hoʻololi i ka mea paʻa ʻole / dev / urandom, e hoʻokomo i kahi papa kūikawā e hoʻopuka ai i ka entropy, e hana i nā helu maʻamau ma mua a mālama iā lākou i loko o kahi wai. Ua pani mākou i ka pilikia me ka loko, akā mai ia manawa ua hoʻāʻo mākou i kahi hoʻāʻo ʻokoʻa no ka hoʻopaʻa inoa ʻana i nā mea kākau inoa hou.

Hoʻohana mākou ma ke ʻano he mea hana hoʻouka ʻO JMeter. ʻAʻole maopopo ia pehea e hana ai me ka websocket; pono ia i kahi plugin. ʻO ka mua ma nā hualoaʻa no ka nīnau "jmeter websocket" ʻo ia: nā ʻatikala mai BlazeMeter, ka mea paipai plugin na Maciej Zaleski.

Ma laila mākou i hoʻoholo ai e hoʻomaka.

Ma hope koke iho o ka hoʻomaka ʻana i ka hoʻāʻo koʻikoʻi, ua ʻike mākou ua hoʻomaka ʻo JMeter e leak i ka hoʻomanaʻo.

He moʻolelo nui ʻokoʻa ka plugin; me nā hōkū 176, loaʻa iā ia he 132 forks ma github. ʻAʻole i hoʻohiki ka mea kākau iā ia mai ka makahiki 2015 (ua lawe mākou iā ia i ka makahiki 2015, a laila ʻaʻole ia i hāpai i nā kānalua), he nui nā pilikia github e pili ana i nā leaks hoʻomanaʻo, 7 mau noi huki ʻole.
Inā hoʻoholo ʻoe e hana i ka hoʻāʻo ʻana me ka hoʻohana ʻana i kēia plugin, e ʻoluʻolu e hoʻolohe i nā kūkākūkā aʻe:

  1. Ma kahi kaiapuni multi-threaded, ua hoʻohana ʻia kahi LinkedList maʻamau, a ʻo ka hopena NPE i ka manawa holo. Hiki ke hoʻoholo ʻia kēia ma ka hoʻololi ʻana iā ConcurrentLinkedDeque a i ʻole ma nā poloka i hoʻonohonoho ʻia. Ua koho mākou i ka koho mua no mākou iho (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. Leak memo; i ka wā e hemo ai, ʻaʻole holoi ʻia ka ʻike pili (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. Ma ke ʻano streaming (inā ʻaʻole i pani ʻia ka websocket ma ka hope o ka laʻana, akā hoʻohana ʻia ma hope o ka hoʻolālā), ʻaʻole hana nā ʻano pane (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

ʻO kēia kekahi o nā mea ma github. He aha kā mākou i hana ai:

  1. Ua lawe fork Elyran Kogan (@elyrank) - hoʻoponopono ia i nā pilikia 1 a me 3
  2. Hoʻoholo ʻia ka pilikia 2
  3. Hōʻano hou ʻia ka jetty mai 9.2.14 a i 9.3.12
  4. Hoʻopili ʻia ka SimpleDateFormat ma ThreadLocal; ʻAʻole palekana ʻo SimpleDateFormat, i alakaʻi iā NPE i ka wā holo
  5. Hoʻopaʻa i kahi leak hoʻomanaʻo ʻē aʻe (ua pani pololei ʻia ka pilina ke hemo ʻia)

A ke kahe nei nae!

Hoʻomaka ka hoʻomanaʻo e pau ʻaʻole i hoʻokahi lā, akā i ʻelua. ʻAʻohe manawa i koe, no laila ua hoʻoholo mākou e hoʻomaka i nā kaula liʻiliʻi, akā ma ʻehā mau mea hana. Ua lawa kēia no hoʻokahi pule.

Ua hala nā lā ʻelua...

I kēia manawa ua pau ka hoʻomanaʻo ʻana o Hazelcast. Ua hōʻike nā lāʻau ma hope o ʻelua mau lā o ka hoʻāʻo ʻana, hoʻomaka ʻo Hazelcast e hoʻopiʻi no ka nele o ka hoʻomanaʻo, a ma hope o kekahi manawa ua hāʻule ka puʻupuʻu, a hoʻomau ka make ʻana o nā nodes. Hoʻopili mākou iā JVisualVM i ka hazelcast a ʻike mākou i kahi "rising saw" - ua kapa mau ʻia ʻo ia ka GC, akā ʻaʻole hiki ke hoʻomaʻemaʻe i ka hoʻomanaʻo.

Pehea a no ke aha mākou i kākau ai i kahi lawelawe scalable kiʻekiʻe no 1C: Enterprise: Java, PostgreSQL, Hazelcast

Ua ʻike ʻia ma ka hazelcast 3.4, i ka wā e holoi ai i kahi palapala / multiMap (map.destroy()), ʻaʻole i hoʻokuʻu ʻia ka hoʻomanaʻo:

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

Ua hoʻopaʻa ʻia ka bug i ka 3.5, akā he pilikia ia i kēlā manawa. Ua hana mākou i nā multiMaps hou me nā inoa ikaika a holoi iā lākou e like me kā mākou loiloi. Ua like ke code me kēia:

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

Kāhea:

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

Ua hana ʻia ka multiMap no kēlā me kēia kau inoa a holoi ʻia inā ʻaʻole pono. Ua hoʻoholo mākou e hoʻomaka mākou i ka Map , ʻo ke kī ka inoa o ke kau inoa, a ʻo nā waiwai e lilo i mau ʻike manawa (mai kahi e loaʻa ai iā ʻoe nā mea hoʻohana, inā pono).

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

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

Ua maikaʻi nā pakuhi.

Pehea a no ke aha mākou i kākau ai i kahi lawelawe scalable kiʻekiʻe no 1C: Enterprise: Java, PostgreSQL, Hazelcast

He aha hou aʻe kā mākou i aʻo ai e pili ana i ka hoʻāʻo ʻana i ka ukana?

  1. Pono e kākau ʻia ʻo JSR223 i loko o ka groovy a hoʻokomo i ka cache compilation - ʻoi aku ka wikiwiki. loulou.
  2. ʻOi aku ka maʻalahi o ka hoʻomaopopo ʻana i nā kiʻi Jmeter-Plugins ma mua o nā kiʻi maʻamau. loulou.

E pili ana i kā mākou ʻike me Hazelcast

He huahana hou ʻo Hazelcast no mākou, ua hoʻomaka mākou e hana me ia mai ka mana 3.4.1, i kēia manawa ke holo nei kā mākou kikowaena hana i ka mana 3.9.2 (i ka manawa kākau, ʻo ka mana hou o Hazelcast ʻo 3.10).

Hanana ID

Hoʻomaka mākou me nā helu helu helu. E noʻonoʻo kākou e pono ana mākou i kahi Long no kahi hui hou. ʻAʻole kūpono ka sequence i ka waihona, pili nā papa i ka sharding - ua ʻike ʻia aia kahi memo ID = 1 ma DB1 a me kahi memo ID = 1 ma DB2, ʻaʻole hiki iā ʻoe ke kau i kēia ID ma Elasticsearch, ʻaʻole hoʻi ma Hazelcast , akā ʻo ka mea ʻino loa inā makemake ʻoe e hoʻohui i ka ʻikepili mai ʻelua mau waihona i hoʻokahi (e like me ka hoʻoholo ʻana i lawa ka waihona no kēia mau mea kākau inoa). Hiki iā ʻoe ke hoʻohui i kekahi mau AtomicLongs iā Hazelcast a mālama i ka counter ma laila, a laila ʻo ka hana o ka loaʻa ʻana o kahi ID hou he incrementAndGet me ka manawa no kahi noi iā Hazelcast. Akā ʻoi aku ka maikaʻi o Hazelcast - FlakeIdGenerator. Ke hoʻokaʻaʻike aku i kēlā me kēia mea kūʻai aku, hāʻawi ʻia lākou i kahi laulā ID, no ka laʻana, ka mea mua - mai 1 a 10, ʻo ka lua - mai 000 a 10, a pēlā aku. I kēia manawa hiki i ka mea kūʻai ke hoʻopuka i nā mea hōʻike hou iā ia iho a hiki i ka pau ʻana o ka laulā i hāʻawi ʻia iā ia. E hana wikiwiki ana, akā ke hoʻomaka hou ʻoe i ka noi (a me ka mea kūʻai aku ʻo Hazelcast), hoʻomaka kahi kaʻina hou - no laila nā skips, etc. Eia kekahi, ʻaʻole maopopo ka poʻe hoʻomohala i ke kumu o ka helu helu ʻana o nā ID, akā like ʻole. Ua kaupaona mākou i nā mea āpau a hoʻololi i nā UUID.

Ma ke ala, no ka poʻe makemake e like me Twitter, aia kahi waihona Snowcast - he hoʻokō kēia o Snowflake ma luna o Hazelcast. Hiki iā ʻoe ke ʻike ma aneʻi:

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

Akā ʻaʻole mākou i ʻike hou aku.

TransactionalMap.replace

Kahaha hou: ʻAʻole hana ʻo TransactionalMap.replace. Eia kahi ho'āʻo:

@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

Pono wau e kākau i koʻu hoʻololi me ka hoʻohana ʻana i 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);
}

E hoʻāʻo ʻaʻole wale i nā hoʻolālā ʻikepili maʻamau, akā i kā lākou mau mana transactional. Hiki ke hana ʻo IMap, akā ʻaʻole i noho hou ʻo TransactionalMap.

E hoʻokomo i kahi JAR hou me ka wā hoʻomaha

ʻO ka mea mua, ua hoʻoholo mākou e hoʻopaʻa i nā mea o kā mākou papa ma Hazelcast. No ka laʻana, loaʻa iā mākou kahi papa noi, makemake mākou e mālama a heluhelu. Mālama:

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

Heluhelu mākou:

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

Ke hana nei nā mea a pau. A laila ua hoʻoholo mākou e kūkulu i kahi papa kuhikuhi ma Hazelcast e ʻimi e:

map.addIndex("subscriberId", false);

A i ke kākau ʻana i kahi hui hou, hoʻomaka lākou e loaʻa iā ClassNotFoundException. Ua hoʻāʻo ʻo Hazelcast e hoʻohui i ka papa kuhikuhi, akā ʻaʻole ʻike i kekahi mea e pili ana i kā mākou papa a makemake ʻo ia e hāʻawi ʻia kahi JAR me kēia papa. Hana mākou i kēlā, hana nā mea āpau, akā ua ʻike ʻia kahi pilikia hou: pehea e hoʻonui ai i ka JAR me ka ʻole o ka pau ʻana o ka hui? ʻAʻole ʻohi ʻo Hazelcast i ka JAR hou i ka wā o ka node-by-node update. I kēia manawa ua hoʻoholo mākou e hiki ke ola me ka ʻole o ka huli ʻana i ka index. Ma hope o nā mea a pau, inā ʻoe e hoʻohana iā Hazelcast ma kahi hale kūʻai waiwai nui, a laila e hana nā mea āpau? ʻaʻole naʻe. Eia hou, ʻokoʻa ka ʻano o IMap a me TransactionalMap. Ma kahi e mālama ʻole ai ʻo IMap, hoʻolei ʻo TransactionalMap i kahi hewa.

IMap. Kākau mākou i 5000 mau mea, heluhelu iā lākou. Manaʻo ʻia nā mea a pau.

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

Akā ʻaʻole ia e hana i kahi kālepa, loaʻa iā mākou kahi 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();
        }
    });
}

Ma 3.8, ua ʻike ʻia ka mīkini hoʻohana papa hana. Hiki iā ʻoe ke koho i hoʻokahi kumu kumu a hoʻohou i ka faila JAR ma luna.

I kēia manawa ua hoʻololi mākou i kā mākou ala: hoʻonohonoho mākou iā mākou iho i JSON a mālama iā ia ma Hazelcast. ʻAʻole pono ʻo Hazelcast e ʻike i ke ʻano o kā mākou papa, a hiki iā mākou ke hōʻano hou me ka ʻole o ka manawa hoʻomaha. Hoʻoponopono ʻia ka hoʻololi ʻana o nā mea kikowaena e ka noi. Hiki ke holo nā ʻano like ʻole o ka noi i ka manawa like, a hiki i kahi kūlana ke kākau ka palapala noi hou i nā mea me nā kahua hou, akā ʻaʻole ʻike ka mea kahiko i kēia mau kahua. A i ka manawa like, heluhelu ka palapala noi hou i nā mea i kākau ʻia e ka noi kahiko i loaʻa ʻole nā ​​kahua hou. Mālama mākou i kēlā mau kūlana i loko o ka noi, akā no ka maʻalahi ʻaʻole mākou e hoʻololi a holoi i nā kahua, hoʻonui wale mākou i nā papa ma ka hoʻohui ʻana i nā kahua hou.

Pehea mākou e hōʻoia ai i ka hana kiʻekiʻe

ʻEhā huakaʻi i Hazelcast - maikaʻi, ʻelua i ka waihona - ʻino

ʻOi aku ka maikaʻi o ka hele ʻana i ka waihona no ka ʻikepili ma mua o ka hele ʻana i ka waihona, akā ʻaʻole ʻoe makemake e mālama i nā moʻolelo i hoʻohana ʻole ʻia. Haʻalele mākou i ka hoʻoholo e pili ana i ka mea e hūnā a hiki i ka pae hope o ka hoʻomohala ʻana. Ke hoʻopaʻa inoa ʻia ka hana hou, hoʻāla mākou i ka logging o nā nīnau a pau ma PostgreSQL (log_min_duration_statement to 0) a holo i ka hoʻāʻo ʻana no nā minuke 20. Me ka hoʻohana ʻana i nā lāʻau i hōʻiliʻili ʻia, hiki i nā mea pono e like me pgFouine a me pgBadger ke kūkulu i nā hōʻike analytical. Ma nā hōʻike, ʻimi nui mākou i nā nīnau lohi a pinepine. No nā nīnau lohi, kūkulu mākou i kahi hoʻolālā hoʻokō (EXPLAIN) a loiloi inā hiki ke hoʻolōʻihi ʻia kēlā nīnau. ʻO nā noi pinepine no ka ʻikepili hoʻokomo like i kūpono i loko o ka huna huna. Ho'āʻo mākou e mālama i nā nīnau "paʻa", hoʻokahi papaʻaina no kēlā me kēia nīnau.

ʻO ka hana

Ua hoʻokomo ʻia ʻo SV ma ke ʻano he lawelawe pūnaewele i ka pūnāwai o 2017, a ma ke ʻano he huahana ʻokoʻa, ua hoʻokuʻu ʻia ʻo SV i Nowemapa 2017 (i kēlā manawa i ke kūlana beta version).

Ma mua o hoʻokahi makahiki o ka hana, ʻaʻohe pilikia koʻikoʻi i ka hana o ka lawelawe pūnaewele CB. Mālama mākou i ka lawelawe pūnaewele ma o ʻO Zabbix, hōʻiliʻili a kau mai Ka Pulu.

Hāʻawi ʻia ka māhele kikowaena SV ma ke ʻano o nā pūʻolo maoli: RPM, DEB, MSI. Hoʻohui no Windows mākou e hāʻawi i hoʻokahi mea hoʻonohonoho ma ke ʻano o kahi EXE hoʻokahi e hoʻokomo i ka kikowaena, Hazelcast a me Elasticsearch ma hoʻokahi mīkini. Ua kuhikuhi mua mākou i kēia mana o ka hoʻonohonoho ʻana ma ke ʻano he "demo", akā ua maopopo i kēia manawa ʻo ia ka koho hoʻolaha kaulana loa.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka