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.
ʻ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
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:
- i kēia manawa pono e hoʻokō ka lawelawe i nā noi ma 5 cluster nodes,
- hiki ke hana i nā hana hoʻoponopono hope,
- 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 nosticky
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
'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
Ma ka paukū 6.14.1.2.1.2.2. Hōʻike ka palapala kumu i ka hopena o ka RPC CAST:
ʻ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
Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi.
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