From a03d1e953ba147b3708480d1ccf4b839881116d5 Mon Sep 17 00:00:00 2001 From: Lucas Matheus <39737833+1uc4sm4theus@users.noreply.github.com> Date: Sun, 17 Aug 2025 21:48:39 -0300 Subject: [PATCH] Nodes e RPC Adicionando parte sobre nodes e RPC - Remote Procedure Call --- README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/README.md b/README.md index d99588d..a052190 100644 --- a/README.md +++ b/README.md @@ -883,6 +883,61 @@ map.flatten 1.24 K - 1.94x slower +390.20 μs À primeira vista, a seção Comparison nos mostra que a versão do nosso map.flatten é 1.94x mais lenta do que flat_map. E também mostra que, em média, é cerca de 390 microssegundos mais lento, o que coloca as coisas em perspectiva. Isso é útil saber! No entanto, vamos olhar para as outras estatísticas que temos: +## Node +No Elixir, um nó(Node) é uma instância da BEAM (máquina virtual do Erlang) com um nome único. Algumas das funções neste módulo são incorporadas pelo compilador, de forma semelhante às funções no módulo Kernel, e são explicitamente marcadas em sua documentação como "embutidas pelo compilador". Ou seja, o compilador conhece essa função como uma função especial o compilador reconhece e sabe que tem relação direta para gerar instruções no BEAM. Exemplos típicos: is_atom/1, is_list/1, Kernel.apply/2, etc. Funções embutidas podem ser mais eficientes, podem ser usadas em macros, ou podem ser avaliadas de maneira diferente pelo compilador. + +### Criar um Nó Local com nome curto: +```bash +iex --sname node1 -S mix +``` + +1. -sname node1 define o nome curto do nó como node1. + +2 . Agora você está em um nó interativo chamado node1@seu_host + +Dentro do IEx você pode verificar o nó: + +```bash +Node.self() +# => :node1@hostname +``` + +Um nó pode conter vários processos: GenServer, TaskAgent. Conectar dois nós signifca que eles se reconhecem em rede e podem trocar mensagens como se estivessem no mesmo computador. Suponha que você tenha um outro no chamado node2@hostname + +```bash +Node.connect(:node2@hostname) +# => true +``` +É possível estabelecer uma comunicação entre esses dois nos usando RPC: RPC permite que um programa execute uma função em outro computador ou outro nó como se fosse local.Em vez de escrever código de comunicação manual (sockets, HTTP, etc.), você simplesmente “chama a função” e o sistema cuida da transmissão da chamada e do resultado. + +Supondo que no No você tenha seguinte função: + +```elixir +defmodule Ping do + def hello do + IO.puts("Hello from #{Node.self()}") + end +end +``` + +Essa função apenas imprime um olá com o número do node + +No node1, você pode chamar essa função remotamente assim: + +```elixir +:rpc.call(:node2@host, Ping, :hello, []) +# Executa Ping.hello() no node2 +``` + +RPC são bastantes úteis em contexto de alta disponibilidade e aplicações distribuidas. + + + + + + + +