Hajautettu Elixir ja klusterointi
Yhdistäkää useita Elixir-solmuja klusteriksi, joka mahdollistaa hajautetun prosessiviestinnän ja resurssien jakamisen.
Hajautettu Elixir ja klusterointi on ilmainen Elixir ja Phoenix: skaalautuva backend-kehitys-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Elixir ja Phoenix: skaalautuva backend-kehitys-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Elixir ja Phoenix: skaalautuva backend-kehitys-kurssilla on yhteensä 4 oppituntia.
Miksi Elixiriä hajautetaan?
Tervetuloa hajautetun Elixir-ohjelmoinnin pariin! Tämän tehokkaan ominaisuuden ansiosta sovelluksesi voivat toimia useilla koneilla muodostaen toisiinsa yhteydessä olevien noodien klusterin.
Miksi tämä on tärkeää? Se tarjoaa:
- Vikasietoisuutta: jos yksi noodi vikaantuu, muut voivat jatkaa toimintaa tai ottaa sen tehtävät hoitaakseen.
- Skaalautuvuutta: työ voidaan jakaa useille suorittimille tai palvelimille.
- Samanaikaisuutta: useita samanaikaisia toimintoja voidaan hallita eristettyjen prosessien avulla.
Tämä ominaisuus perustuu Erlang Virtual Machineen (BEAM), jolla Elixir toimii.
Mikä on Elixir-noodi?
Elixirissä ”noodi” on käynnissä oleva Erlang VM:n instanssi, jossa yleensä suoritetaan Elixir-sovellusta. Kun käynnistät iex-ohjelman, käynnistät yhden Elixir-noodin.
Hajautetuissa järjestelmissä noodien on voitava löytää toisensa ja viestiä keskenään. Tämä toteutetaan antamalla niille yksilölliset nimet.
Noodin nimeäminen
Viestinnän mahdollistamiseksi jokaisella noodilla on oltava nimi. Voit käynnistää iex-ohjelman nimellä käyttämällä joko --sname- (lyhyt nimi) tai --name-valitsinta (täysi nimi).
--sname: käytetään samalla isäntäkoneella oleville noodeille (esimerkiksinode1@localhost).--name: käytetään eri isäntäkoneilla oleville noodeille (esimerkiksinode1@your_server_ip).
Tässä oppitunnissa käytämme --sname-valitsinta, koska simuloimme noodeja paikallisella koneellasi.
iex --sname node1 --setcookie mysecret
# In another terminal:
iex --sname node2 --setcookie mysecretNoodiyhteyksien suojaaminen: cookie
Ennen kuin noodit voivat muodostaa yhteyden, niiden on tunnistauduttava toisilleen ”magic cookien” avulla. Se on jaettu salainen merkkijono.
Jos kahdella noodilla on eri cookiet, ne eivät voi muodostaa yhteyttä. Tämä on tärkeä suojausominaisuus, joka estää luvattomia noodeja liittymästä klusteriin.
Asetat cookien käynnistäessäsi iex-ohjelman käyttämällä --setcookie-valitsinta edellisessä esimerkissä esitetyllä tavalla.
Noodien saaminen viestimään: yhdistäminen
Kun kaksi nimettyä iex-istuntoa on käynnissä samalla cookiella, voit yhdistää ne komennolla Node.connect/1. Argumenttina annetaan kohdenoodin täydellinen atom-nimi.
Kokeile suorittaa tämä node1-IEx-istunnossa:
# In node1's IEx session:
Node.connect(:'node2@localhost')
# This attempts to connect to 'node2@localhost'.
# Make sure 'node2' is running with a matching cookie!
IO.puts("Connected to node2: #{Node.connected?(:'node2@localhost')}")Noodin tilan tarkistaminen
Yhteyden muodostamisen jälkeen voit tarkistaa komennolla Node.list/0, mitkä noodit on yhdistetty nykyiseen noodiisi. Nykyisen noodisi nimen saat komennolla Node.self/0.
Suorita tämä missä tahansa yhdistetyssä IEx-istunnossa:
IO.puts("My node: #{inspect(Node.self())}")
IO.puts("Connected nodes: #{inspect(Node.list())}")
# If node1 and node2 are connected,
# Node.list() on node1 would show [:'node2@localhost']Viestien lähettäminen noodien välillä
Kun noodit on yhdistetty, eri noodeissa toimivat prosessit voivat lähettää toisilleen viestejä aivan kuten paikalliset prosessit. Tarvitset vain etäprosessin PID:n.
Tarkastellaan, miten node2-noodissa käynnistetään prosessi ja lähetetään sitten viesti takaisin node1-noodille. Suorita ensimmäinen osa node2-noodissa ja toinen osa node1-noodissa.
# In node2's IEx session:
pid_on_node2 = spawn(fn ->
send(self(), {:hello_from_node2, self()})
receive do
{:reply, msg} -> IO.puts("Node2 received reply: #{msg}")
end
end)
IO.puts("Node2 process ready: #{inspect(pid_on_node2)}")
# In node1's IEx session:
# (assuming node1 received the pid from node2)
receive do
{:hello_from_node2, pid_on_node2} ->
IO.puts("Received from Node2: #{inspect(pid_on_node2)}")
send(pid_on_node2, {:reply, "Thanks, Node2!"})
after 1000 ->
IO.puts("No message received from Node2 yet.")
endProsessien käynnistäminen etänä
Voit myös käynnistää uuden prosessin nimenomaisesti etänoodissa komennolla Node.spawn_link/2 (tai Node.spawn/2). Tämä on perustavanlaatuinen tapa jakaa työ klusterin noodien kesken.
Ensimmäinen argumentti on etänoodin nimi ja toinen argumentti on kyseisessä noodissa suoritettava fun (anonyymi funktio).
# In node1's IEx session:
remote_process_pid = Node.spawn_link(:'node2@localhost', fn ->
IO.puts("I am a process running on #{inspect(Node.self())}!")
Process.sleep(2000) # Simulate work
IO.puts("Process on Node2 finished.")
end)
IO.puts("Spawned process on Node2: #{inspect(remote_process_pid)}")Globaalit nimet globaalia käyttöä varten
Jotta prosessit voidaan löytää helposti nimellä kaikista yhdistetyistä noodeista, voit käyttää komentoa :global.register_name/2. Tällöin prosessi löytyy globaalisti rekisteröidyn nimensä perusteella riippumatta siitä, missä noodissa se toimii.
Vertaa tätä komentoon Process.register/2, joka rekisteröi nimen vain paikallisesti yhdessä noodissa.
# In node2's IEx session:
:global.register_name(:my_global_worker, self())
IO.puts("Node2 registered :my_global_worker: #{inspect(self())}")
# In node1's IEx session:
# Give a moment for registration to propagate
Process.sleep(100)
worker_pid = :global.whereis_name(:my_global_worker)
IO.puts("Found global worker from Node1: #{inspect(worker_pid)}")
# Now you can send messages to it from Node1
if worker_pid do
send(worker_pid, "Hello from Node1 to global worker!")
endHajautettujen käsitteiden tarkistus
On nopean tarkistuksen aika: mitä opit Elixir-noodien yhdistämisestä?
Hajautetun Elixirin kertaus
Hienoa työtä! Tässä oppitunnissa opitte hajautetun Elixirin perusteet:
- Mitä Elixir-solmut ovat ja miksi niille annetaan nimet.
- Miksi magic cookie on tärkeä suojatuissa yhteyksissä.
- Miten solmuja yhdistetään käyttämällä
Node.connect/1-funktiota. - Miten yhdistetyt solmut tarkistetaan
Node.list/0-funktiolla. - Viestien lähettäminen ja prosessien käynnistäminen eri solmuissa.
:global.register_name/2-funktion käyttäminen prosessien etsimiseen koko klusterista.
Nämä käsitteet muodostavat perustan erittäin käytettävissä olevien ja skaalautuvien Elixir-sovellusten luomiselle!
Opi Elixir tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Hajautettu Elixir ja klusterointi” ilmainen?
Kyllä – oppitunnin ”Hajautettu Elixir ja klusterointi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Elixir ja Phoenix: skaalautuva backend-kehitys-kurssin, päivitä CoddyKit PROhon. Elixir ja Phoenix: skaalautuva backend-kehitys-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Hajautettu Elixir ja klusterointi”?
Yhdistäkää useita Elixir-solmuja klusteriksi, joka mahdollistaa hajautetun prosessiviestinnän ja resurssien jakamisen. Harjoittelet Elixir ja Phoenix: skaalautuva backend-kehitys-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Elixir ja Phoenix: skaalautuva backend-kehitys-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Elixir ja Phoenix: skaalautuva backend-kehitys-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Hajautettu Elixir ja klusterointi”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Elixir ja Phoenix: skaalautuva backend-kehitys-oppitunnilla?
Kyllä. Jokainen Elixir ja Phoenix: skaalautuva backend-kehitys-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Hajautettu Elixir ja klusterointi
- Edistyneet supervisor-strategiat
- Dynaamiset supervisorit ja Registry
- GenStage ja backpressure-putket