Nā papa kūkulu o nā noi i hoʻolaha ʻia. Hoʻopili ʻelua

Hoʻolaha

E nā hoa hana, i ka waena o ke kauwela ke hoʻolālā nei au e hoʻokuʻu i kahi ʻatikala ʻē aʻe e pili ana i ka hoʻolālā ʻana o nā ʻōnaehana queuing: "The VTrade Experiment" - kahi hoʻāʻo e kākau i kahi hoʻolālā no nā ʻōnaehana kālepa. E nānā ka moʻo i ke kumumanaʻo a me ka hana o ke kūkulu ʻana i kahi hoʻololi, kūʻai aku a me ka hale kūʻai. Ma ka hopena o ka ʻatikala, kono wau iā ʻoe e koho balota i nā kumuhana āu e makemake nui ai.

Nā papa kūkulu o nā noi i hoʻolaha ʻia. Hoʻopili ʻelua

ʻO kēia ka ʻatikala hope loa i ka moʻo e pili ana i nā noi reactive i hāʻawi ʻia ma Erlang/Elixir. IN ʻatikala mua hiki iā ʻoe ke ʻike i nā kumu kumu o ka hoʻolālā reactive. ʻatikala ʻelua hōʻike i nā ʻano kumu a me nā mīkini no ke kūkulu ʻana i ia ʻōnaehana.

I kēia lā e hāpai mākou i nā pilikia o ka hoʻomohala ʻana i ke kumu code a me nā papahana ma ka laulā.

Hoʻonohonoho i nā lawelawe

I ke ola maoli, i ka wā e hoʻomohala ai i kahi lawelawe, pono ʻoe e hoʻohui i kekahi mau hiʻohiʻona pili i hoʻokahi kaohi. No ka laʻana, ʻo ka lawelawe mea hoʻohana, ka mea e hoʻonā i ka pilikia o ka hoʻokele ʻana i nā ʻaoʻao mea hoʻohana papahana, pono e pane i nā noi req-resp a hōʻike i nā mea hou o ka ʻike ma o ka pub-sub. He mea maʻalahi kēia hihia: ma hope o ka memo, aia kahi mea hoʻoponopono e hoʻokō i ka loiloi lawelawe a hoʻopuka i nā mea hou.

ʻOi aku ka paʻakikī o ke kūlana inā pono mākou e hoʻokō i kahi lawelawe puʻupuʻu hewa. E noʻonoʻo kākou ua loli nā koi no nā mea hoʻohana:

  1. i kēia manawa pono e hoʻokō ka lawelawe i nā noi ma 5 cluster nodes,
  2. hiki ke hana i nā hana hoʻoponopono hope,
  3. a hiki nō hoʻi ke hoʻokele ikaika i nā papa inoa inoa no ka hoʻonui ʻana i ka ʻike.

Manaʻo: ʻAʻole mākou e noʻonoʻo i ka pilikia o ka mālama ʻana a me ka hoʻopili ʻana i ka ʻikepili. E noʻonoʻo kākou ua hoʻoholo mua ʻia kēia mau pilikia a ua loaʻa i ka ʻōnaehana kahi papa mālama hilinaʻi a hiki ke hoʻonui ʻia, a loaʻa i nā mea lawelawe nā hana e launa pū me ia.

Ua maʻalahi ka wehewehe kikoʻī o ka lawelawe mea hoʻohana. Mai ka manaʻo o ka mea papahana, he liʻiliʻi nā loli ma muli o ka hoʻohana ʻana i ka leka uila. No ka hoʻokō ʻana i ka koi mua, pono mākou e hoʻonohonoho i ke kaupaona ʻana ma ka wahi hoʻololi req-resp.

Loaʻa pinepine ka pono e hoʻoponopono i nā hana hope. I nā mea hoʻohana, hiki ke nānā i nā palapala mea hoʻohana, ka hoʻoponopono ʻana i ka multimedia i hoʻoiho ʻia, a i ʻole ka hoʻonohonoho ʻana i ka ʻikepili me ka pāpaho pūnaewele. nā pūnaewele. Pono e māhele ʻia kēia mau hana i loko o ka pūʻulu a nānā ʻia ka holomua o ka hoʻokō. No laila, ʻelua mau koho hoʻonā: e hoʻohana paha i ka template hoʻohele hana mai ka ʻatikala mua, a i ʻole, inā ʻaʻole kūpono, e kākau i kahi mea hoʻonohonoho hana maʻamau e hoʻokele i ka loko o nā kaʻina hana e like me kā mākou e pono ai.

Pono ka helu 3 i ka hoʻonui ʻia ʻana o ka template pub-sub. A no ka hoʻokō ʻana, ma hope o ka hana ʻana i kahi wahi hoʻololi pub-sub, pono mākou e hoʻomaka hou i ka mea hoʻokele o kēia wahi i loko o kā mākou lawelawe. No laila, me he mea lā ke neʻe nei mākou i ka loiloi no ka hoʻoili ʻana i nā inoa inoa a me ka wehe ʻole ʻana mai ka papa leka uila i ka hoʻokō ʻana o nā mea hoʻohana.

ʻO ka hopena, ua hōʻike ʻia ka decomposition o ka pilikia i mea e hoʻokō ai i nā koi, pono mākou e hoʻomaka i nā manawa 5 o ka lawelawe ma nā nodes like ʻole a hana i kahi hui hou - kahi pub-sub controller, kuleana no ke kau inoa.
No ka holo ʻana i nā mea lawelawe 5, ʻaʻole pono ʻoe e hoʻololi i ke code lawelawe. ʻO ka hana hou wale nō ka hoʻonohonoho ʻana i nā lula kaulike ma ka wahi hoʻololi, a mākou e kamaʻilio ai ma hope.
Aia kekahi paʻakikī hou aʻe: pono e hana ka pub-sub controller a me ka mea hoʻonohonoho hana maʻamau i hoʻokahi kope. Eia hou, ʻo ka lawelawe memo, ma ke ʻano he kumu nui, pono e hāʻawi i kahi hana no ke koho ʻana i kahi alakaʻi.

Koho alakaʻi

Ma nā ʻōnaehana puʻunaue, ʻo ke koho alakaʻi ke kaʻina hana no ka koho ʻana i kahi kaʻina hana hoʻokahi kuleana no ka hoʻonohonoho ʻana i ka hoʻoili ʻana i kekahi ukana.

I nā ʻōnaehana i kūpono ʻole i ka centralization, hoʻohana ʻia nā algorithm e pili ana i ka honua a me ka consensus, e like me ka paxos a i ʻole raft.
No ka mea ʻo ka leka uila he mea hoʻopili a he mea koʻikoʻi, ʻike ia e pili ana i nā mea hoʻokele lawelawe āpau - nā alakaʻi moho. Hiki i ka leka ke koho i alakaʻi me ke koho ʻole.

Ma hope o ka hoʻomaka ʻana a me ka hoʻopili ʻana i ka wahi hoʻololi, loaʻa nā lawelawe āpau i kahi memo ʻōnaehana #'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}. Ina LeaderPid ua pili pū me pid kaʻina hana i kēia manawa, ua koho ʻia ʻo ia i alakaʻi, a me ka papa inoa Servers e komo pū ana nā nodes a me ko lākou mau palena.
I ka manawa e ʻike ʻia ai kahi mea hou a wehe ʻia kahi puʻupuʻu puʻupuʻu hana, loaʻa i nā mea hoʻokele lawelawe āpau #'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts} и #'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts} ʻo kēlā me kēia.

Ma kēia ala, ʻike nā ʻāpana āpau i nā loli āpau, a ua hōʻoia ʻia ka pūʻulu e loaʻa i hoʻokahi alakaʻi i kēlā me kēia manawa.

Nā mea kūwaena

No ka hoʻokō ʻana i nā kaʻina hana hoʻoili paʻakikī, a me nā pilikia o ka hoʻonui ʻana i kahi hoʻolālā e kū nei, maʻalahi ka hoʻohana ʻana i nā intermediaries.
I ʻole e hoʻololi i ka code service a hoʻoponopono, no ka laʻana, nā pilikia o ka hoʻoponopono hou ʻana, ke alahele a i ʻole ka hoʻopaʻa inoa ʻana i nā memo, hiki iā ʻoe ke hoʻololi i kahi mea lawelawe proxy ma mua o ka lawelawe, nāna e hana i nā hana hou aʻe.

ʻO kahi hiʻohiʻona maʻamau o ka pub-sub optimization he palapala hoʻolaha me kahi ʻoihana ʻoihana e hoʻopuka i nā hanana hou, e like me nā loli kumukūʻai ma ka mākeke, a me kahi papa komo - N nā kikowaena e hāʻawi i kahi API websocket no nā mea kūʻai pūnaewele.
Inā hoʻoholo ʻoe i ke poʻo, a laila e like me kēia ka lawelawe mea kūʻai aku:

  • hoʻokumu ka mea kūʻai aku i nā pilina me ka paepae. Ma ka ʻaoʻao o ke kikowaena e hoʻopau i ke kaʻa, hoʻomaka ʻia kahi kaʻina hana e lawelawe i kēia pili.
  • Ma ka pōʻaiapili o ke kaʻina hana, loaʻa ka ʻae a me ke kau inoa ʻana i nā mea hou. Kāhea ke kaʻina hana i ke ʻano kākau inoa no nā kumuhana.
  • Ke hana ʻia kahi hanana i loko o ka kernel, hāʻawi ʻia ia i nā kaʻina hana e lawelawe ana i nā pilina.

E noʻonoʻo mākou he 50000 mau mea kākau inoa i ke kumuhana "news". Hoʻokaʻawale ʻia nā mea kākau inoa ma nā kikowaena 5. ʻO ka hopena, ʻo kēlā me kēia hōʻano hou, e hōʻea ana i ka wahi hoʻololi, e hana hou ʻia i nā manawa 50000: 10000 mau manawa ma kēlā me kēia kikowaena, e like me ka helu o nā mea kākau ma luna. ʻAʻole ia he hoʻolālā maikaʻi loa, ʻeā?
No ka hoʻomaikaʻi ʻana i ke kūlana, e hoʻolauna i kahi mea koho i loaʻa ka inoa like me ka wahi hoʻololi. Pono ka mea kākau inoa honua e hoʻihoʻi i ke kaʻina hana kokoke loa ma ka inoa, he mea nui kēia.

E hoʻomaka kākou i kēia proxy ma nā kikowaena papa komo, a ʻo kā mākou kaʻina hana a pau e lawelawe ana i ka websocket api e kau inoa iā ia, ʻaʻole i ke kumu kūʻai pub-sub kumu i loko o ka kernel. Hoʻopaʻa inoa ʻo Proxy i ke kumu wale nō inā loaʻa kahi inoa kūʻokoʻa a hoʻihoʻi hou i ka memo e hiki mai ana i kāna poʻe kākau inoa.
ʻO ka hopena, e hoʻouna ʻia nā memo 5 ma waena o ka kernel a me nā kikowaena komo, ma kahi o 50000.

Ke alahele a me ke kaulike

Req-Resp

I ka hoʻokō memo i kēia manawa, aia 7 mau hoʻolālā hoʻolaha noi:

  • default. Hoʻouna ʻia ka noi i nā mea hoʻoponopono āpau.
  • round-robin. Ua helu ʻia nā noi a hoʻohele ʻia ma waena o nā mea hoʻoponopono.
  • consensus. Hoʻokaʻawale ʻia nā mea hoʻokele e lawelawe nei i nā alakaʻi a me nā kauā. Hoʻouna ʻia nā noi i ke alakaʻi wale nō.
  • consensus & round-robin. He alakaʻi ko ka hui, akā hāʻawi ʻia nā noi ma waena o nā lālā a pau.
  • sticky. Ua helu ʻia ka hana hash a hāʻawi ʻia i kahi mea hoʻokele kikoʻī. ʻO nā noi hope me kēia pūlima e hele i ka mea hoʻohana like.
  • sticky-fun. I ka hoʻomaka ʻana i ka helu hoʻololi, ka hana helu hash no sticky kaulike ana.
  • fun. E like me ka leʻaleʻa sticky, hiki iā ʻoe ke hoʻihoʻi hou, hōʻole a hana mua paha.

Hoʻonohonoho ʻia ka hoʻolālā hoʻolaha i ka wā e hoʻomaka ai ka helu hoʻololi.

Ma waho aʻe o ke kaupaona ʻana, ʻae ka memo iā ʻoe e hōʻailona i nā hui. E nānā kākou i ke ʻano o nā hōʻailona ma ka ʻōnaehana:

  • Lepili hoʻohui. Hāʻawi iā ʻoe e hoʻomaopopo i ka pilina i hiki mai ai nā hanana. Hoʻohana ʻia i ka wā e hoʻopili ai kahi kaʻina hana hoʻomalu i kahi wahi hoʻololi like, akā me nā kī ala ʻokoʻa.
  • Lepe lawelawe. Hāʻawi iā ʻoe e hoʻohui i nā mea lawelawe i nā pūʻulu no hoʻokahi lawelawe a hoʻonui i ke ala ala a me ke kaulike. No ke kumu req-resp, he laina laina ke alahele. Hoʻouna mākou i kahi noi i ka wahi hoʻololi, a laila hāʻawi ia i ka lawelawe. Akā inā pono mākou e hoʻokaʻawale i nā mea lawelawe i nā pūʻulu logical, a laila hana ʻia ka hoʻokaʻawale ʻana me ka hoʻohana ʻana i nā hōʻailona. Ke kuhikuhi ʻia kahi hōʻailona, ​​​​e hoʻouna ʻia ka noi i kahi pūʻulu o nā mea hoʻoponopono.
  • Noi lepe. Hiki iā ʻoe ke hoʻokaʻawale i waena o nā pane. No ka mea, he asynchronous kā mākou ʻōnaehana, no ka hoʻoponopono ʻana i nā pane lawelawe pono mākou e hiki ke kuhikuhi i kahi RequestTag i ka wā e hoʻouna ai i kahi noi. Mai ia mea e hiki ai iā mākou ke hoʻomaopopo i ka pane o ka noi i hiki mai iā mākou.

Pub-sub

No ka pub-sub ua maʻalahi nā mea a pau. Loaʻa iā mākou kahi wahi hoʻololi e paʻi ʻia ai nā memo. Hāʻawi ka wahi hoʻololi i nā memo ma waena o nā mea kākau inoa i nā kī ala e pono ai lākou (hiki iā mākou ke ʻōlelo he like kēia me nā kumuhana).

Scalability a me ka hoʻomanawanui hewa

ʻO ka scalability o ka ʻōnaehana holoʻokoʻa e pili ana i ke kiʻekiʻe o ka scalability o nā papa a me nā ʻāpana o ka ʻōnaehana:

  • Hoʻonui ʻia nā lawelawe ma ka hoʻohui ʻana i nā node hou i ka pūʻulu me nā mea lawelawe no kēia lawelawe. I ka wā hoʻokolokolo, hiki iā ʻoe ke koho i ke kulekele kaulike maikaʻi loa.
  • Hoʻonui ʻia ka lawelawe memo i loko o kahi puʻupuʻu ʻokoʻa ma o ka neʻe ʻana i nā wahi hoʻololi i hoʻouka ʻia e hoʻokaʻawale i nā node puʻupuʻu, a i ʻole ma ka hoʻohui ʻana i nā kaʻina hana koho i nā wahi i hoʻouka ʻia o ka pūʻulu.
  • ʻO ka scalability o ka ʻōnaehana holoʻokoʻa ma ke ʻano he hiʻohiʻona e pili ana i ka maʻalahi o ka hoʻolālā a me ka hiki ke hoʻohui i nā puʻupuʻu hoʻokahi i loko o kahi hui loiloi maʻamau.

ʻO ka holomua o kahi papahana ma muli o ka maʻalahi a me ka wikiwiki o ka hoʻonui ʻana. Ke ulu nei ka memo i kona mana o kēia manawa me ka noi. ʻOiai inā nele mākou i kahi hui o 50-60 mau mīkini, hiki iā mākou ke hoʻohana i ka federation. ʻO ka mea pōʻino, ʻoi aku ka nui o ke kumuhana o ka federation ma waho o ke ʻano o kēia ʻatikala.

Hoʻopaʻa

I ka nānā ʻana i ka load balancing, ua kūkākūkā mua mākou i ka redundancy o nā mea hoʻokele lawelawe. Eia naʻe, pono e mālama ʻia ka memo. I ka hopena o ka node a i ʻole ka mīkini ulia, pono e hoʻihoʻi ʻia ka memo, a i ka manawa pōkole loa.

Ma kaʻu mau papahana hoʻohana au i nā node hou e lawe i ka ukana inā hāʻule. Loaʻa iā Erlang kahi hoʻokō ʻano hoʻolaha maʻamau no nā noi OTP. Hana ʻia ke ʻano hoʻokaʻawale i ka hoʻihoʻi ʻana i ka wā o ka hāʻule ʻana ma ka hoʻokuʻu ʻana i ka noi hāʻule ma kekahi node i hoʻomaka mua ʻia. Akaka ke kaʻina hana; ma hope o ka hāʻule ʻole, neʻe koke ka noi i ka failover node. Hiki iā ʻoe ke heluhelu hou aʻe e pili ana i kēia hana maanei.

'Ohanahana

E hoʻāʻo kākou e hoʻohālikelike i ka hana a rabbitmq a me kā mākou leka maʻamau.
Ua loaʻa iaʻu nā hopena kūhelu rabbitmq hoʻāʻo mai ka hui openstack.

Ma ka paukū 6.14.1.2.1.2.2. Hōʻike ka palapala kumu i ka hopena o ka RPC CAST:
Nā papa kūkulu o nā noi i hoʻolaha ʻia. Hoʻopili ʻelua

ʻAʻole mākou e hana i nā hoʻonohonoho hou i ka OS kernel a i ʻole erlang VM ma mua. Nā kūlana no ka hoʻāʻo ʻana:

  • erl koho: +A1 +sbtu.
  • Hoʻoholo ʻia ka hoʻāʻo ʻana i loko o kahi node erlang hoʻokahi ma kahi kamepiula me kahi i7 kahiko ma ka mana kelepona.
  • Hana ʻia nā hoʻokolohua Cluster ma nā kikowaena me kahi pūnaewele 10G.
  • Holo ke code i nā pahu docker. Pūnaewele ma ke ʻano NAT.

Code hoʻāʻo:

req_resp_bench(_) ->
  W = perftest:comprehensive(10000,
    fun() ->
      messaging:request(?EXCHANGE, default, ping, self()),
      receive
        #'$msg'{message = pong} -> ok
      after 5000 ->
        throw(timeout)
      end
    end
  ),
  true = lists:any(fun(E) -> E >= 30000 end, W),
  ok.

Hōʻike 1: Holo ʻia ka hoʻāʻo ʻana ma kahi kamepiula me kahi polokalamu kelepona i7 kahiko. Hoʻokō ʻia ka hoʻāʻo, ka memo a me ka lawelawe ma hoʻokahi node i hoʻokahi pahu Docker:

Sequential 10000 cycles in ~0 seconds (26987 cycles/s)
Sequential 20000 cycles in ~1 seconds (26915 cycles/s)
Sequential 100000 cycles in ~4 seconds (26957 cycles/s)
Parallel 2 100000 cycles in ~2 seconds (44240 cycles/s)
Parallel 4 100000 cycles in ~2 seconds (53459 cycles/s)
Parallel 10 100000 cycles in ~2 seconds (52283 cycles/s)
Parallel 100 100000 cycles in ~3 seconds (49317 cycles/s)

Hōʻike 2: 3 nodes e holo ana ma na mīkini like ole ma lalo o docker (NAT).

Sequential 10000 cycles in ~1 seconds (8684 cycles/s)
Sequential 20000 cycles in ~2 seconds (8424 cycles/s)
Sequential 100000 cycles in ~12 seconds (8655 cycles/s)
Parallel 2 100000 cycles in ~7 seconds (15160 cycles/s)
Parallel 4 100000 cycles in ~5 seconds (19133 cycles/s)
Parallel 10 100000 cycles in ~4 seconds (24399 cycles/s)
Parallel 100 100000 cycles in ~3 seconds (34517 cycles/s)

I nā hihia a pau, ʻaʻole i ʻoi aku ka hoʻohana ʻana o ka CPU ma mua o 250%

Nā hopena

Manaʻo wau ʻaʻole like kēia pōʻaiapuni i ka noʻonoʻo a e lilo koʻu ʻike i ka pōmaikaʻi maoli i nā mea noiʻi ʻelua o nā ʻōnaehana puʻupuʻu a me nā loea i ka hoʻomaka ʻana o ke kūkulu ʻana i nā hale kiʻi i hāʻawi ʻia no kā lākou ʻoihana ʻoihana a ke nānā nei iā Erlang/Elixir me ka hoihoi. , akā kanalua ka waiwai...

Photo @huakaula

Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi. Eʻe, e 'oluʻolu.

He aha nā kumuhana e pono iaʻu e uhi i nā kikoʻī hou aku ma ke ʻano he ʻāpana o ka moʻo VTrade Experiment?

  • Manaʻo: Nā mākeke, nā kauoha a me ko lākou manawa: DAY, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC

  • Buke kauoha. ʻO ka manaʻo a me ka hana o ka hoʻokō ʻana i kahi puke me nā hui pūʻulu

  • Ka ʻike ʻana o ke kālepa: Ticks, bars, resolutions. Pehea e mālama ai a pehea e hoʻopili ai

  • Keena hope. Hoʻolālā a hoʻomohala. Ka nānā ʻana o nā limahana a me ka hoʻokolokolo ʻana i nā hanana

  • API. E noʻonoʻo kākou i nā interface e pono ai a pehea e hoʻokō ai

  • Waihona ʻike: PostgreSQL, Timescale, Tarantool i nā ʻōnaehana kālepa

  • Reactivity ma nā ʻōnaehana kālepa

  • 'ē aʻe. E kākau wau ma nā manaʻo

6 mea hoʻohana i koho. Ua hōʻole nā ​​mea hoʻohana 4.

Source: www.habr.com

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