SlideShare uma empresa Scribd logo
1 de 42
Baixar para ler offline
Envio de notificação
em Elixir
O que é o envio de
uma notificação?
Algoritmo
• Cliente cria uma regra que define quais dos seus usuários
devem receber a mensagem (segmentação)
• Cliente define a mensagem (e-mail, SMS, browser-push, etc) a
ser enviada para o segmento feito
• Cliente, através plataforma da Dito, inicia o envio da notificação
• O serviço de envio inicia a busca dos dados do envio
(mensagem da notificação, dados dos usuários, etc)
• Concorrentemente ao passo anterior, o serviço de envio, inicia o
envio das notificações para os provedores (Movile, Firebase,
etc)
SQS Load
Send
Middleware
Redis
SQS
Serviços Dito
Serviços Dito
Serviços Dito
Firebase
Movile
*Diagrama meramente ilustrativo
A complexidade nos trás
algumas preocupações
• Escalabilidade
• Resiliência
• Manutenibilidade
• Extensibilidade
• SLA de uptime
Elixir
• Funcional
• Concorrente
• Tolerante a falhas
• Distribuída
Tipos básicos
Function
sum = fn a, b !->
a + b
end
sum = &(&1 + &2)
Integer e Float
def sum(a, b) do
a + b
end
sum(1, 1) !=> 2 # integer
sum(1.5, 2) !=> 3.5 # float
Boolean
x = true
y = false
z = x !&& y
String
first_name = "Felipe"
last_name = "Rosa"
first_name !<> " " !<> last_name
Atom
x = :qualquercoisa
List
prices = [19.99, 178.8, 22.13]
List.first(prices) !=> 19.99
Tuples
{:error, "algum erro"}
{"Calça Jeans", 399.99}
Map
x = %{a: 1, b: 2}
x[:a]
# 1
y = %{:a !=> 1, "b" !=> 2, {1, 2} !=> 3}
y[{1, 2}]
# 3
Alguns tipos não
apresentados aqui
• Keyword lists
• Char lists
• Bitstrings
• PID
• Reference
Módulos e Funções
Funções devem ser
definidas sempre
dentro de módulos
# módulos são definidos com defmodule
defmodule M do
# e funções com def
def f(arg1, arg2) do
IO.puts(arg1 + arg2)
end
end
M.f(1, 2) # "3"
Podemos sobrecarregar
funções pela quantidade
de argumentos
defmodule M do
def f(arg1) do
IO.puts(arg1)
end
def f(arg1, arg2) do
IO.puts(arg1 + arg2)
end
end
M.f(1) # "1"
M.f(1, 2) # "3"
Funções podem ter
argumentos com valor
padrão
defmodule M do
def f(arg1, arg2 & 0) do
IO.puts(arg1 + arg2)
end
end
M.f(1) # "1"
Os nomes das funções
sempre contêm a
quantidade de argumentos
defmodule M do
def f(a) !=> M.f/1
def g(a, b) !=> M.g/2
end
Pattern Matching
Podemos usar pattern
matching para extrair valores
de estruturas de dados
x = 1
# x !=> 1
{:ok, y} = {:ok, 1}
# y !=> 1
%{a: x, b: y} = %{a: 1, b: 2}
# x !=> 1
# y !=> 2
Também podemos usar
pattern matching para
verificar valores
1 = 1
# Tudo certo!
2 = 1
# Erro!
1 = 2
# Erro!
{:a, 1} = {:b, 1}
# Erro!
case pode ser usado para
executar diferentes fluxos do
programa com pattern matching
x = {:a, 1}
case x do
{:a, x} !-> IO.puts(x)
{:b, y} !-> IO.puts(y)
_ !-> IO.puts("!??")
end
# "1"
Podemos definir vários
casos para uma função com
pattern matching também
defmodule M do
def f(:a), do: 1
def f(:b), do: 2
end
M.f(:a) # 1
M.f(:b) # 2
M.f(:c) # Erro!
Processos
pid = spawn(fn !->
IO.puts("oi")
end)
Processos são isolados. Sua
única forma de comunicação é
através de troca de mensagens.
pid1 = spawn(fn !->
receive do
{:a, a} !-> IO.puts("a: !#{a}")
{:b, b} !-> IO.puts("b: !#{b}")
_ !-> IO.puts("unknown message")
end
end)
pid2 = spawn(fn !->
send(pid1, {:a, 1})
end)
# pid1 printa "a: 1"
Como processos executam em
ambientes isolados, se ocorrer
um erro, apenas o processo do
erro é afetado.
GenServer
defmodule S do
use GenServer
def start_link(_args) do
GenServer.start_link(!__MODULE!__, :ok, [])
end
def init(:ok) do
{:ok, 0}
end
def handle_call(:get, _from, state) do
{:reply, state, state}
end
def handle_cast(:inc, state) do
{:noreply, state + 1}
end
end
Iniciando o GenServer
def start_link(_args) do
GenServer.start_link(!__MODULE!__, :ok, [])
end
def init(:ok) do
{:ok, 0}
end
# Uso
{:ok, pid} = S.start_link([])
Utilizando o GenServer
def handle_call(:get, _from, state) do
{:reply, state, state}
end
def handle_cast(:inc, state) do
{:noreply, state + 1}
end
GenServer.call(pid, :get)
# 0
GenServer.cast(pid, :inc)
# :ok
GenServer.call(pid, :get)
# 1

Mais conteúdo relacionado

Mais procurados (8)

14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelas
 
Estrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memóriaEstrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memória
 
Introdução à linguagem c
Introdução à linguagem cIntrodução à linguagem c
Introdução à linguagem c
 
Aula 2
Aula 2Aula 2
Aula 2
 
SciLab -Tutorial
SciLab -TutorialSciLab -Tutorial
SciLab -Tutorial
 
Aula5 introducao c
Aula5 introducao cAula5 introducao c
Aula5 introducao c
 
Aula5 introducao c
Aula5 introducao cAula5 introducao c
Aula5 introducao c
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros
 

Semelhante a Talk - Meetup Elixir BH #1 - Felipe Rosa

Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
JogosUnisinos
 
Programacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshareProgramacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshare
Marcio Junior Vieira
 
Eng.Software-Métricas
Eng.Software-MétricasEng.Software-Métricas
Eng.Software-Métricas
elliando dias
 

Semelhante a Talk - Meetup Elixir BH #1 - Felipe Rosa (20)

O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Comecando tensorflow
Comecando tensorflowComecando tensorflow
Comecando tensorflow
 
Programação aula002
Programação aula002Programação aula002
Programação aula002
 
Fundamentos de C#
Fundamentos de C#Fundamentos de C#
Fundamentos de C#
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
 
Cargas Dinamicas - SSIS
Cargas Dinamicas - SSISCargas Dinamicas - SSIS
Cargas Dinamicas - SSIS
 
PHP(I-Bim).ppt
PHP(I-Bim).pptPHP(I-Bim).ppt
PHP(I-Bim).ppt
 
Estratégias e Técnicas de Testes - Parte 2
Estratégias e Técnicas de Testes - Parte 2Estratégias e Técnicas de Testes - Parte 2
Estratégias e Técnicas de Testes - Parte 2
 
Programacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshareProgramacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshare
 
Programação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicProgramação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice Basic
 
Programação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicProgramação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice Basic
 
Estruturação de Linguagens de Programação (Pascal e C++)
Estruturação de Linguagens de Programação (Pascal e C++)Estruturação de Linguagens de Programação (Pascal e C++)
Estruturação de Linguagens de Programação (Pascal e C++)
 
Algoritmo estruturado
Algoritmo estruturadoAlgoritmo estruturado
Algoritmo estruturado
 
Eng.Software-Métricas
Eng.Software-MétricasEng.Software-Métricas
Eng.Software-Métricas
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Linguagem_C.pdf
Linguagem_C.pdfLinguagem_C.pdf
Linguagem_C.pdf
 

Talk - Meetup Elixir BH #1 - Felipe Rosa