SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
Walled Garden
Redu
Apresentações
Guilherme Cavalcanti
github.com/guiocavalcanti
Tiago Ferreira
github.com/fltiago
Plataforma de educação a
distância construída em uma
estrutura de rede social
redu.com.br
Walled Garden
Monolítica Serviços
Redu
Analytics
Core
App Store
Serviços
• Resposabilidades bem
definidas
• API REST
• Privados
• On going process
• “Desmembrar”
serviços
Analytics
Core
App Store
Vantagens
• Evolução indepentente
• Liberdade de
tecnologia
• Menos overhead de
comunicação entre
pessoas
Analytics
Core
App Store
CoreVis Apps
Walled Garden
Untied
github.com/redu/untied
Acoplamento entre serviços
• Comunicação “um para muitos”
• Identidade de serviços
Acoplamento entre serviços
Core
Vis
Apps
N
...
spaghetti
Service
Disponibilidade e tolerância
• Como lidar com não disponibilidade do
serviço?
• Estratégia de retry no cliente
• Em casos de falhas de HTTP
Disponibilidade e tolerância
Core
Vis
N
...
x
Message Bus
Ideia
• Canal de comunicação transversal entre
todos os serviços
• Propagação de representações do domain
model (RESTishy)
The real
Walled Garden
CoreVis Apps
Message Bus
Messaging that just works
Upsides
• Tolerância a falhas (dos consumers)
• O trabalho do publisher termina ao enviar
a mensagem para o exchanger
• Garantia de entrega
Untied Publisher
github.com/redu/untied
Doorkeeper
class	
  DoorkeeperWithRepresenter
	
  	
  include	
  Untied::Doorkeeper
	
  	
  def	
  initialize
	
  	
  	
  	
  watch	
  User,	
  :after_create,	
  represent_with:	
  UserRepresenter
	
  	
  	
  	
  watch	
  Course,	
  :after_create,	
  represent_with:	
  CourseRepresenter
	
  	
  end
end
Features
• ActiveRecord lifecycle
• Propaga representações, não domain
models
• Multiplos adapters (Bunny & AMQP)
Untied Consumer
github.com/redu/untied
Observer
class	
  Builder	
  <	
  Untied::Consumer::Observer
	
  	
  observe	
  :user,	
  from:	
  "social-­‐network"
	
  
	
  	
  def	
  build(attrs)
	
  	
  	
  	
  LeanUser.new(attrs)
	
  	
  end
	
  	
  alias_method	
  :after_create,	
  :build
end
• Lifecycle
• Configuração
• Framework agnostic
“Daemonizable”
$	
  ruby	
  consumerd.rb	
  start
$	
  ruby	
  consumerd.rb	
  status
untiedc:	
  running	
  [pid	
  52324]
$	
  ruby	
  consumerd.rb	
  stop
untiedc:	
  trying	
  to	
  stop	
  process	
  with	
  pid	
  52324..
untiedc:	
  process	
  with	
  pid	
  52324	
  successfully	
  sto
worker	
  =	
  Untied::Consumer::Worker.new
worker.daemonize(pids_dir:	
  pids_dir,	
  log_dir:	
  
• gem “deamons”
• Monit, god, etc
Untied Plugins
github.com/redu/untied-consumer-sync
Padrões comuns
• Untied Consumer Sync
• Abstraí o padrão de replicar entidades
através de vários serviços
Como?
Untied::Consumer::Sync.configure	
  do	
  |config|
	
  	
  config.model_data	
  =	
  "mappings.yml"
end
User:	
  #	
  Payload's	
  type
	
  	
  attributes:	
  #	
  Needed	
  attributes
	
  	
  	
  	
  -­‐	
  id
	
  	
  	
  	
  -­‐	
  login
	
  	
  	
  	
  -­‐	
  first_name
	
  	
  	
  	
  -­‐	
  last_name
	
  	
  mappings:
	
  	
  	
  	
  id:	
  core_id	
  #	
  Maps	
  payload's	
  id	
  key	
  to	
  model'
	
  	
  name:	
  LeanUser	
  #	
  Model	
  name
• Configuração
• Definição de
atributos
• Definição de
mapeamentos
• ActiveRecord
• Mongoid
Vis
Objetivos
• Garantia de entrega
• Assíncrono e escalável
• Fail-safe
• Independente de Framework
Big Picture
Core Vis
mongoDB
HTTP
Solução
• MongoDB
• Dados não estruturados
• Possibilidade de guardar estrutura de
dados complexas
• Mais facilmente escalável
• Boa biblioteca de consulta
Solução
• Aplicação isolada (fail-safe)
• Interação através de uma API REST
• em-http-request (requisições
assíncronas e paralelas)
Implementação inicial
• Cliente da API (VisClient) bem simples
• Uso do em-http-request para envio de
requisições de forma assíncrona e
paralela
• Falhas logadas em arquivos
• Uso extensivo de Observers
Requisições
• Assíncronas
• Logs em arquivos
def	
  send_async_info(params,	
  url)
	
  	
  if	
  EM.reactor_running?
	
  	
  	
  	
  do_request(params,	
  url,	
  true)
	
  	
  else
	
  	
  	
  	
  ...
	
  	
  end
end
	
  
def	
  do_request(params,	
  url,	
  self_reactor)
	
  	
  http	
  =	
  EM::HttpRequest.new(url).post({:body	
  =>	
  params.to_json	
  })
	
  
	
  	
  http.callback	
  do
	
  	
  	
  	
  ...
	
  	
  	
  	
  rescue
	
  	
  	
  	
  	
  	
  	
  log.error	
  "log	
  goes	
  here..."
	
  	
  	
  	
  end
	
  	
  	
  	
  EM.stop	
  unless	
  self_reactor
	
  	
  end
	
  
	
  	
  http.errback	
  	
  do
	
  	
  	
  	
  ...
	
  	
  	
  	
  rescue
	
  	
  	
  	
  	
  	
  log.error	
  "log	
  goes	
  here..."
	
  	
  	
  	
  end
	
  	
  	
  	
  EM.stop	
  unless	
  self_reactor
	
  	
  end
end
Requisições
• Paralelas
• Logs em arquivos
def	
  send_multi_request
	
  	
  ...
	
  	
  em	
  do
	
  	
  	
  	
  multi	
  =	
  EventMachine::MultiRequest.new
	
  	
  	
  	
  
	
  	
  	
  	
  enrollments.each_with_index	
  do	
  |enroll,	
  idx|
	
  	
  	
  	
  	
  	
  multi.add	
  idx,	
  EM::HttpRequest.new(url).post({
	
  	
  	
  	
  	
  	
  	
  	
  :body	
  =>	
  enroll.to_json	
  })
	
  	
  	
  	
  end
	
  
	
  	
  	
  	
  multi.callback	
  do
	
  	
  	
  	
  	
  	
  multi.responses[:errback].each	
  do	
  |err|
	
  	
  	
  	
  	
  	
  	
  	
  logger.error	
  "logs	
  goes	
  here..."
	
  	
  	
  	
  	
  	
  end
	
  
	
  	
  	
  	
  	
  	
  EM.stop	
  unless	
  @running
	
  	
  	
  	
  end
	
  	
  end
end
Parâmetros
• Preenchidos
manualmente
• Acesso a múltiplos
modelos
def	
  fill_enroll_params(enrollment_id,	
  type)
	
  	
  ...
	
  	
  if	
  enrollment
	
  	
  	
  	
  course	
  =	
  enrollment.subject.space.course
	
  	
  	
  	
  params	
  =	
  {
	
  	
  	
  	
  	
  	
  :user_id	
  =>	
  enrollment.user_id,
	
  	
  	
  	
  	
  	
  :type	
  =>	
  type,
	
  	
  	
  	
  	
  	
  :lecture_id	
  =>	
  nil,
	
  	
  	
  	
  	
  	
  :subject_id	
  =>	
  enrollment.subject_id,
	
  	
  	
  	
  	
  	
  :space_id	
  =>	
  enrollment.subject.space.id,
	
  	
  	
  	
  	
  	
  :course_id	
  =>	
  course.id,
	
  	
  	
  	
  	
  	
  ...
	
  	
  	
  	
  	
  	
  :created_at	
  =>	
  enrollment.created_at,
	
  	
  	
  	
  	
  	
  :updated_at	
  =>	
  enrollment.updated_at
	
  	
  	
  	
  }
	
  	
  else
	
  	
  	
  	
  nil
	
  	
  end
end
Lições aprendidas
Lições Aprendidas
• Não havia interface única para envio das
notificações, ou seja, código espalhado e
de difícil manutenção
• O em-http-request é construído em cima
do EventMachine
• Logar em arquivos com propósito de
recuperar falhas é uma bola de neve
Lições Aprendidas
• Lidar com requisições paralelas é difícil
• Pouco workers do nginx para muitas
requisições paralelas
• Difícil depuração
Atualmente
Atualmente
• Delayed Job lida com falhas e reenvios de
uma forma atômica
• VisClient responsável por criar Jobs e
construir os parâmetros
• Simples depuração e detecção de falhas
• Uso de representers
github.com/apotonick/roar
New vis client
• Envio de requisições
(Faraday)
• Lógica de criação de
jobs
• Lógica de
parametrização
def	
  self.notify_delayed(resource,	
  type,	
  args)
	
  	
  elements	
  =	
  args.respond_to?(:map)	
  ?	
  args	
  :	
  [args]
	
  	
  notifier_builder	
  =	
  NotifierBuilder.new(resource,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  type,	
  elements)
	
  	
  notifier_builder.build
end
Representer
module	
  Vis
	
  	
  module	
  EnrollmentVisRepresenter
	
  	
  	
  	
  include	
  Roar::Representer::JSON
	
  
	
  	
  	
  	
  property	
  :user_id
	
  	
  	
  	
  property	
  :subject_id
	
  	
  	
  	
  property	
  :space_id
	
  	
  	
  	
  property	
  :course_id
	
  	
  	
  	
  property	
  :created_at
	
  	
  	
  	
  property	
  :updated_at
	
  
	
  	
  	
  	
  def	
  space_id
	
  	
  	
  	
  	
  	
  self.subject.space.id
	
  	
  	
  	
  end
	
  
	
  	
  	
  	
  def	
  course_id
	
  	
  	
  	
  	
  	
  self.subject.space.course.id
	
  	
  	
  	
  end
	
  	
  end
end
Futuropróximo
Futuro
• Vis vai se tornar provedora de Relatórios e
Visualizações
• não haverá API de consulta
• relatórios e visualizações estarão em
Vis, front-end incluso
• inclusão será feita através de iframe
Referências
• https://github.com/redu/permit
• https://github.com/redu/untied
• https://github.com/redu/untied-
consumer-sync

Contenu connexe

Similaire à Walled Garden Microservices Architecture

Azure + Desenvolvimento Web | Minicurso Gratuito - Azure na Prática
Azure + Desenvolvimento Web | Minicurso Gratuito - Azure na PráticaAzure + Desenvolvimento Web | Minicurso Gratuito - Azure na Prática
Azure + Desenvolvimento Web | Minicurso Gratuito - Azure na PráticaRenato Groff
 
Desenvolvendo Sistema Cloud e Web Full-stack Developer
Desenvolvendo Sistema Cloud e Web Full-stack DeveloperDesenvolvendo Sistema Cloud e Web Full-stack Developer
Desenvolvendo Sistema Cloud e Web Full-stack DeveloperCesar Romero
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
 
Python mudando o modo de desenvolver para a internet
Python mudando o modo de desenvolver para a internetPython mudando o modo de desenvolver para a internet
Python mudando o modo de desenvolver para a internetMarcos Petry
 
Python mudando o modo de desenvolver para a web - Marcos Daniel Petry
Python mudando o modo de desenvolver para a web  - Marcos Daniel PetryPython mudando o modo de desenvolver para a web  - Marcos Daniel Petry
Python mudando o modo de desenvolver para a web - Marcos Daniel PetryTchelinux
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
Construindo aplicações Web escaláveis com Docker e o Microsoft Azure - Azure ...
Construindo aplicações Web escaláveis com Docker e o Microsoft Azure - Azure ...Construindo aplicações Web escaláveis com Docker e o Microsoft Azure - Azure ...
Construindo aplicações Web escaláveis com Docker e o Microsoft Azure - Azure ...Renato Groff
 
BigQuery Performance Improvements Storage API
BigQuery Performance Improvements Storage APIBigQuery Performance Improvements Storage API
BigQuery Performance Improvements Storage APIAlvaro Viebrantz
 
Python, Google App Engine e Webapp-CE
Python, Google App Engine e Webapp-CE Python, Google App Engine e Webapp-CE
Python, Google App Engine e Webapp-CE Renzo Nuccitelli
 
Google App Engine e Python
Google App Engine e PythonGoogle App Engine e Python
Google App Engine e PythonPeslPinguim
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaAlexandre Tarifa
 
Novidades do Django 1.2
Novidades do Django 1.2Novidades do Django 1.2
Novidades do Django 1.2flavioamieiro
 
Ruby on Rails I - Modelos
Ruby on Rails I - ModelosRuby on Rails I - Modelos
Ruby on Rails I - ModelosTiago Lima
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 
Construindo APIs REST escaláveis na nuvem com Docker e Kubernetes - DEVPIRA F...
Construindo APIs REST escaláveis na nuvem com Docker e Kubernetes - DEVPIRA F...Construindo APIs REST escaláveis na nuvem com Docker e Kubernetes - DEVPIRA F...
Construindo APIs REST escaláveis na nuvem com Docker e Kubernetes - DEVPIRA F...Renato Groff
 
JSF com Primefaces
JSF com PrimefacesJSF com Primefaces
JSF com PrimefacesFabio Noth
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 

Similaire à Walled Garden Microservices Architecture (20)

Azure + Desenvolvimento Web | Minicurso Gratuito - Azure na Prática
Azure + Desenvolvimento Web | Minicurso Gratuito - Azure na PráticaAzure + Desenvolvimento Web | Minicurso Gratuito - Azure na Prática
Azure + Desenvolvimento Web | Minicurso Gratuito - Azure na Prática
 
Desenvolvendo Sistema Cloud e Web Full-stack Developer
Desenvolvendo Sistema Cloud e Web Full-stack DeveloperDesenvolvendo Sistema Cloud e Web Full-stack Developer
Desenvolvendo Sistema Cloud e Web Full-stack Developer
 
Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
Aula1
Aula1Aula1
Aula1
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
Python mudando o modo de desenvolver para a internet
Python mudando o modo de desenvolver para a internetPython mudando o modo de desenvolver para a internet
Python mudando o modo de desenvolver para a internet
 
Python mudando o modo de desenvolver para a web - Marcos Daniel Petry
Python mudando o modo de desenvolver para a web  - Marcos Daniel PetryPython mudando o modo de desenvolver para a web  - Marcos Daniel Petry
Python mudando o modo de desenvolver para a web - Marcos Daniel Petry
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Construindo aplicações Web escaláveis com Docker e o Microsoft Azure - Azure ...
Construindo aplicações Web escaláveis com Docker e o Microsoft Azure - Azure ...Construindo aplicações Web escaláveis com Docker e o Microsoft Azure - Azure ...
Construindo aplicações Web escaláveis com Docker e o Microsoft Azure - Azure ...
 
BigQuery Performance Improvements Storage API
BigQuery Performance Improvements Storage APIBigQuery Performance Improvements Storage API
BigQuery Performance Improvements Storage API
 
Python, Google App Engine e Webapp-CE
Python, Google App Engine e Webapp-CE Python, Google App Engine e Webapp-CE
Python, Google App Engine e Webapp-CE
 
Google App Engine e Python
Google App Engine e PythonGoogle App Engine e Python
Google App Engine e Python
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
 
Novidades do Django 1.2
Novidades do Django 1.2Novidades do Django 1.2
Novidades do Django 1.2
 
Ruby on Rails I - Modelos
Ruby on Rails I - ModelosRuby on Rails I - Modelos
Ruby on Rails I - Modelos
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 
Construindo APIs REST escaláveis na nuvem com Docker e Kubernetes - DEVPIRA F...
Construindo APIs REST escaláveis na nuvem com Docker e Kubernetes - DEVPIRA F...Construindo APIs REST escaláveis na nuvem com Docker e Kubernetes - DEVPIRA F...
Construindo APIs REST escaláveis na nuvem com Docker e Kubernetes - DEVPIRA F...
 
JSF com Primefaces
JSF com PrimefacesJSF com Primefaces
JSF com Primefaces
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 

Plus de Guilherme

Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu CódigoWhere Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu CódigoGuilherme
 
Descobrindo APIs REST
Descobrindo APIs RESTDescobrindo APIs REST
Descobrindo APIs RESTGuilherme
 
Desafio de crescer
Desafio de crescerDesafio de crescer
Desafio de crescerGuilherme
 
Aplicações tipo Canvas no Redu com Rails
Aplicações tipo Canvas no Redu com RailsAplicações tipo Canvas no Redu com Rails
Aplicações tipo Canvas no Redu com RailsGuilherme
 
Aplicações sociais usando a plataforma Redu
Aplicações sociais usando a plataforma ReduAplicações sociais usando a plataforma Redu
Aplicações sociais usando a plataforma ReduGuilherme
 
Introdução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasIntrodução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasGuilherme
 
Introdução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos ReduIntrodução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos ReduGuilherme
 
FLOSS and Startups
FLOSS and StartupsFLOSS and Startups
FLOSS and StartupsGuilherme
 
Ruby 101 && Coding Dojo
Ruby 101 && Coding DojoRuby 101 && Coding Dojo
Ruby 101 && Coding DojoGuilherme
 
Dojo: Sass - Syntactically Awesome Stylesheets
Dojo: Sass - Syntactically Awesome StylesheetsDojo: Sass - Syntactically Awesome Stylesheets
Dojo: Sass - Syntactically Awesome StylesheetsGuilherme
 
CSS first steps
CSS first stepsCSS first steps
CSS first stepsGuilherme
 
How does the Web work?
How does the Web work?How does the Web work?
How does the Web work?Guilherme
 
0 introducao padroes_web
0 introducao padroes_web0 introducao padroes_web
0 introducao padroes_webGuilherme
 
Plano de Pesquisa - Redu Respostas
Plano de Pesquisa - Redu RespostasPlano de Pesquisa - Redu Respostas
Plano de Pesquisa - Redu RespostasGuilherme
 
Desevolvimento Web Client-side - AJAX
Desevolvimento Web Client-side - AJAX Desevolvimento Web Client-side - AJAX
Desevolvimento Web Client-side - AJAX Guilherme
 
Desevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryDesevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryGuilherme
 
3 padroes-web-intro-javascript
3 padroes-web-intro-javascript3 padroes-web-intro-javascript
3 padroes-web-intro-javascriptGuilherme
 
Desevolvimento Web Client-side - CSS
Desevolvimento Web Client-side - CSSDesevolvimento Web Client-side - CSS
Desevolvimento Web Client-side - CSSGuilherme
 
Desevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLDesevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLGuilherme
 

Plus de Guilherme (20)

Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu CódigoWhere Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
 
Descobrindo APIs REST
Descobrindo APIs RESTDescobrindo APIs REST
Descobrindo APIs REST
 
Desafio de crescer
Desafio de crescerDesafio de crescer
Desafio de crescer
 
Aplicações tipo Canvas no Redu com Rails
Aplicações tipo Canvas no Redu com RailsAplicações tipo Canvas no Redu com Rails
Aplicações tipo Canvas no Redu com Rails
 
Aplicações sociais usando a plataforma Redu
Aplicações sociais usando a plataforma ReduAplicações sociais usando a plataforma Redu
Aplicações sociais usando a plataforma Redu
 
Introdução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasIntrodução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvas
 
Introdução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos ReduIntrodução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos Redu
 
FLOSS and Startups
FLOSS and StartupsFLOSS and Startups
FLOSS and Startups
 
Ruby 101 && Coding Dojo
Ruby 101 && Coding DojoRuby 101 && Coding Dojo
Ruby 101 && Coding Dojo
 
Dojo: Sass - Syntactically Awesome Stylesheets
Dojo: Sass - Syntactically Awesome StylesheetsDojo: Sass - Syntactically Awesome Stylesheets
Dojo: Sass - Syntactically Awesome Stylesheets
 
Sass
SassSass
Sass
 
CSS first steps
CSS first stepsCSS first steps
CSS first steps
 
How does the Web work?
How does the Web work?How does the Web work?
How does the Web work?
 
0 introducao padroes_web
0 introducao padroes_web0 introducao padroes_web
0 introducao padroes_web
 
Plano de Pesquisa - Redu Respostas
Plano de Pesquisa - Redu RespostasPlano de Pesquisa - Redu Respostas
Plano de Pesquisa - Redu Respostas
 
Desevolvimento Web Client-side - AJAX
Desevolvimento Web Client-side - AJAX Desevolvimento Web Client-side - AJAX
Desevolvimento Web Client-side - AJAX
 
Desevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryDesevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQuery
 
3 padroes-web-intro-javascript
3 padroes-web-intro-javascript3 padroes-web-intro-javascript
3 padroes-web-intro-javascript
 
Desevolvimento Web Client-side - CSS
Desevolvimento Web Client-side - CSSDesevolvimento Web Client-side - CSS
Desevolvimento Web Client-side - CSS
 
Desevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLDesevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTML
 

Walled Garden Microservices Architecture

  • 4.
  • 5. Plataforma de educação a distância construída em uma estrutura de rede social redu.com.br
  • 8. Serviços • Resposabilidades bem definidas • API REST • Privados • On going process • “Desmembrar” serviços Analytics Core App Store
  • 9. Vantagens • Evolução indepentente • Liberdade de tecnologia • Menos overhead de comunicação entre pessoas Analytics Core App Store
  • 12. Acoplamento entre serviços • Comunicação “um para muitos” • Identidade de serviços
  • 15. Disponibilidade e tolerância • Como lidar com não disponibilidade do serviço? • Estratégia de retry no cliente • Em casos de falhas de HTTP
  • 18. Ideia • Canal de comunicação transversal entre todos os serviços • Propagação de representações do domain model (RESTishy)
  • 19. The real Walled Garden CoreVis Apps Message Bus
  • 21. Upsides • Tolerância a falhas (dos consumers) • O trabalho do publisher termina ao enviar a mensagem para o exchanger • Garantia de entrega
  • 23. Doorkeeper class  DoorkeeperWithRepresenter    include  Untied::Doorkeeper    def  initialize        watch  User,  :after_create,  represent_with:  UserRepresenter        watch  Course,  :after_create,  represent_with:  CourseRepresenter    end end
  • 24. Features • ActiveRecord lifecycle • Propaga representações, não domain models • Multiplos adapters (Bunny & AMQP)
  • 26. Observer class  Builder  <  Untied::Consumer::Observer    observe  :user,  from:  "social-­‐network"      def  build(attrs)        LeanUser.new(attrs)    end    alias_method  :after_create,  :build end • Lifecycle • Configuração • Framework agnostic
  • 27. “Daemonizable” $  ruby  consumerd.rb  start $  ruby  consumerd.rb  status untiedc:  running  [pid  52324] $  ruby  consumerd.rb  stop untiedc:  trying  to  stop  process  with  pid  52324.. untiedc:  process  with  pid  52324  successfully  sto worker  =  Untied::Consumer::Worker.new worker.daemonize(pids_dir:  pids_dir,  log_dir:   • gem “deamons” • Monit, god, etc
  • 29. Padrões comuns • Untied Consumer Sync • Abstraí o padrão de replicar entidades através de vários serviços
  • 30. Como? Untied::Consumer::Sync.configure  do  |config|    config.model_data  =  "mappings.yml" end User:  #  Payload's  type    attributes:  #  Needed  attributes        -­‐  id        -­‐  login        -­‐  first_name        -­‐  last_name    mappings:        id:  core_id  #  Maps  payload's  id  key  to  model'    name:  LeanUser  #  Model  name • Configuração • Definição de atributos • Definição de mapeamentos • ActiveRecord • Mongoid
  • 31. Vis
  • 32. Objetivos • Garantia de entrega • Assíncrono e escalável • Fail-safe • Independente de Framework
  • 34. Solução • MongoDB • Dados não estruturados • Possibilidade de guardar estrutura de dados complexas • Mais facilmente escalável • Boa biblioteca de consulta
  • 35. Solução • Aplicação isolada (fail-safe) • Interação através de uma API REST • em-http-request (requisições assíncronas e paralelas)
  • 36. Implementação inicial • Cliente da API (VisClient) bem simples • Uso do em-http-request para envio de requisições de forma assíncrona e paralela • Falhas logadas em arquivos • Uso extensivo de Observers
  • 37. Requisições • Assíncronas • Logs em arquivos def  send_async_info(params,  url)    if  EM.reactor_running?        do_request(params,  url,  true)    else        ...    end end   def  do_request(params,  url,  self_reactor)    http  =  EM::HttpRequest.new(url).post({:body  =>  params.to_json  })      http.callback  do        ...        rescue              log.error  "log  goes  here..."        end        EM.stop  unless  self_reactor    end      http.errback    do        ...        rescue            log.error  "log  goes  here..."        end        EM.stop  unless  self_reactor    end end
  • 38. Requisições • Paralelas • Logs em arquivos def  send_multi_request    ...    em  do        multi  =  EventMachine::MultiRequest.new                enrollments.each_with_index  do  |enroll,  idx|            multi.add  idx,  EM::HttpRequest.new(url).post({                :body  =>  enroll.to_json  })        end          multi.callback  do            multi.responses[:errback].each  do  |err|                logger.error  "logs  goes  here..."            end              EM.stop  unless  @running        end    end end
  • 39. Parâmetros • Preenchidos manualmente • Acesso a múltiplos modelos def  fill_enroll_params(enrollment_id,  type)    ...    if  enrollment        course  =  enrollment.subject.space.course        params  =  {            :user_id  =>  enrollment.user_id,            :type  =>  type,            :lecture_id  =>  nil,            :subject_id  =>  enrollment.subject_id,            :space_id  =>  enrollment.subject.space.id,            :course_id  =>  course.id,            ...            :created_at  =>  enrollment.created_at,            :updated_at  =>  enrollment.updated_at        }    else        nil    end end
  • 41. Lições Aprendidas • Não havia interface única para envio das notificações, ou seja, código espalhado e de difícil manutenção • O em-http-request é construído em cima do EventMachine • Logar em arquivos com propósito de recuperar falhas é uma bola de neve
  • 42. Lições Aprendidas • Lidar com requisições paralelas é difícil • Pouco workers do nginx para muitas requisições paralelas • Difícil depuração
  • 44. Atualmente • Delayed Job lida com falhas e reenvios de uma forma atômica • VisClient responsável por criar Jobs e construir os parâmetros • Simples depuração e detecção de falhas • Uso de representers github.com/apotonick/roar
  • 45. New vis client • Envio de requisições (Faraday) • Lógica de criação de jobs • Lógica de parametrização def  self.notify_delayed(resource,  type,  args)    elements  =  args.respond_to?(:map)  ?  args  :  [args]    notifier_builder  =  NotifierBuilder.new(resource,                                            type,  elements)    notifier_builder.build end
  • 46. Representer module  Vis    module  EnrollmentVisRepresenter        include  Roar::Representer::JSON          property  :user_id        property  :subject_id        property  :space_id        property  :course_id        property  :created_at        property  :updated_at          def  space_id            self.subject.space.id        end          def  course_id            self.subject.space.course.id        end    end end
  • 48. Futuro • Vis vai se tornar provedora de Relatórios e Visualizações • não haverá API de consulta • relatórios e visualizações estarão em Vis, front-end incluso • inclusão será feita através de iframe