Upload
nicolas-blanco
View
8.049
Download
1
Tags:
Embed Size (px)
Citation preview
DECOUPEZ VOTRE APPLI EN MICRO-APIS
SOA ON RAILS :-)by Nicolas Blanco
http://twitter.com/slainer68
CODE SPAGHETTI ? USINE A GAZ ?
THIN CONTROLER / FAT MODEL
MODULES
CLASSES ACTIVE MODEL
VOTRE PROPRE ENGINE / GEM !
DECOUPLAGE EN SOA ?
DECOUPER UNE FONCTIONNALITE EN MICRO-API
INDEPENDANCE
API REST JSON
STOCKAGE RAPIDE (REDIS ?)
INCONVENIENTS
BUTREPONSE INSTANTANEE EN JSON
ID UNIQUE POUR CHAQUE JOB
EXEMPLE=> POST api.myapp.com/imports{ id: “42”, status: “scheduled”, ... }
=> GET api.myapp.com/imports/42{ id: “42”, status: “finished”, result: { ... }, finished_at: ... }
LES GEMS
SIDEKIQREDISGRAPE
REDIS PERSISTENCEFOREMAN
FOREMANweb: bundle exec thin start -p $PORT
worker: bundle exec sidekiq -r ./workers/import_xml.rb -c 2
MODEL IMPORTmodule Models class Import include Redis::Persistence
property :state, default: "scheduled" property :created_at property :finished_at property :fail_message property :result, default: {}
def start! update_attributes(state: "started") end
def finish! update_attributes(state: "finished", finished_at: Time.now) end
def fail_with!(message) update_attributes(state: "failed", fail_message: message) end end end
class API < Grape::API version 'v1', using: :header, vendor: "pluriporter" format :json
resources :imports do desc "Creates new import from XML data" params do requires :xml, type: String, desc: "XML data" end
post do Models::Import.create(created_at: Time.now).tap do |import| Workers::Import.perform_async(import.id, params[:xml]) end endend
WORKER module Workers class Import include Sidekiq::Worker
def perform(import_id, xml) require File.expand_path("../../models/import", __FILE__)
import = Models::Import.find(import_id) import.start! begin # ... end rescue => e import.fail_with!(e.to_s)
raise e end
import.finish! end
ALWAYS REFACTOR !