Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Test de distribution

distribution-test.livemd

Test de distribution

Mix.install([
  {:kino, "~> 0.8.0"}
])

D’abord, se connecter

Chaque noeud du cluster a un nom:

local = node()

On voit donc que, par défaut, Livebook tourne en cluster sur la machine locale (ici MacBook-Air-de-Dominique).

On peut voir quels sont les autres noeuds dans le cluster:

Node.list(:hidden)

Il y a donc un autres noeud dans le cluster:

  • livebook_XYZ@MacBook-Air-de-Dominique est la VM où tourne Livebook lui-même

Graphiquement:

[lb] = Node.list(:hidden)

Kino.Mermaid.new("""
graph LR
    LB(#{inspect(Atom.to_string(lb))}) <--> B1(#{inspect(Atom.to_string(local))})
    subgraph Books
      B1
  end
""")

Copions maintenant le nom du noeud du livre maître dans la boîte de saisie:

node_name = Kino.Input.text("Entrer la valeur copiée précédemment:")
other_node = Kino.Input.read(node_name) |> String.to_atom()
Node.connect(other_node)
Node.list(:hidden)

Il y a donc maintenant 3 noeuds au total dans le cluster:

  • Le noeud courant
  • livebook_XYZ@MacBook-Air-de-Dominique est la VM où tourne Livebook lui-même
  • L’autre noeud ABC-livebook_XYZ@MacBook-Air-de-Dominique est la VM utilisée pour le livre maître.

Graphiquement:

[third_node] = Node.list(:hidden) |> Enum.filter(fn n -> n != lb end)

Kino.Mermaid.new("""
flowchart LR
    LB(#{inspect(Atom.to_string(lb))}) <--> B1(#{inspect(Atom.to_string(local))})
    LB <--> B2(#{inspect(Kino.Input.read(node_name))})
    subgraph Books
      B1 
      B2
    end
""")

Le code du module n’est pas chargé localement, dans la VM du livre en cours. Pour s’en convaincre:

PingServer.start()

Démarrage sur VM distante

  • On démarre le serveur sur l’autre noeud

  • On obtient la sortie standard localement

server = Node.spawn(other_node, PingServer, :loop, [0])
Process.monitor(server)
:ok
  • On envoie un :ping au serveur, sur l’autre VM

  • Le serveur nous répond, évidemment!

me = self()
send(server, {:ping, me})

receive do
  msg -> msg
after
  1_000 ->
    :error
end
  • On peut explorer le runtime de la VM en temps-réel

  • Et se connecter sur les autres VMs également

    • Locales à la machine ou sur d’autres machines!
:observer.start()
  • On peut même monitorer les processus distants
send(server, :stop)

receive do
  msg -> msg
end

On peut maintenant revenir à la présentation.