Slide 1

Slide 1 text

Fast Rails APIs Railsberry Kraków April 19th, 2012 Monday, April 23, 12

Slide 2

Slide 2 text

ms Monday, April 23, 12

Slide 3

Slide 3 text

Monday, April 23, 12

Slide 4

Slide 4 text

Monday, April 23, 12

Slide 5

Slide 5 text

Monday, April 23, 12

Slide 6

Slide 6 text

Interpreted Dynamic typing Object-Oriented Monday, April 23, 12

Slide 7

Slide 7 text

Speed is a feature Monday, April 23, 12

Slide 8

Slide 8 text

Request Router Controller Response Monday, April 23, 12

Slide 9

Slide 9 text

Request Router Controller Response Monday, April 23, 12

Slide 10

Slide 10 text

ActionController::Metal Monday, April 23, 12

Slide 11

Slide 11 text

class NormalController < ActionController::Base def index @messages = Message.paginate(:page => params[:page]) respond_to do |format| format.json { render :json => @messages } end end end Monday, April 23, 12

Slide 12

Slide 12 text

class MetalController < ActionController::Metal def index @messages = Message.paginate(:page => params[:page]) self.response_body = @messages.to_json self.status = 200 self.content_type = 'application/json' end end Monday, April 23, 12

Slide 13

Slide 13 text

0 175 350 525 700 Requests/second Normal Light Monday, April 23, 12

Slide 14

Slide 14 text

M V C Monday, April 23, 12

Slide 15

Slide 15 text

render :json => @posts Monday, April 23, 12

Slide 16

Slide 16 text

@posts.to_json Monday, April 23, 12

Slide 17

Slide 17 text

M C Monday, April 23, 12

Slide 18

Slide 18 text

Representer pattern Monday, April 23, 12

Slide 19

Slide 19 text

apotonick/roar josevalim/active_model_serializers Monday, April 23, 12

Slide 20

Slide 20 text

representer Monday, April 23, 12

Slide 21

Slide 21 text

Representer == Object Oriented View Monday, April 23, 12

Slide 22

Slide 22 text

app/representers/message_representer.rb Monday, April 23, 12

Slide 23

Slide 23 text

class MessageRepresenter < Representer::Base namespace :message attributes :id, :title, :body end Monday, April 23, 12

Slide 24

Slide 24 text

class MessageRepresenter < Representer::Base namespace :message attributes :id, :title, :body fields :images aggregate :images, :id do |ids, representer| # This is imaginary code!! <3 RemoteApiClient.find_images(ids).group_by(&:message_id) end def images(message) self.aggregated_images[message['id']] end end Monday, April 23, 12

Slide 25

Slide 25 text

class MessageRepresenter < Representer::Base namespace :message attributes :id, :title, :body belongs_to :user has_many :attachments end Monday, April 23, 12

Slide 26

Slide 26 text

@messages = Message.limit(50) representer = MessageRepresenter.new(@messages) representer.render(:json) Monday, April 23, 12

Slide 27

Slide 27 text

@messages.represent(:json) Monday, April 23, 12

Slide 28

Slide 28 text

{ "message": { "id": 1, "title": "OMG YES", "body": "best thing ever" } } Monday, April 23, 12

Slide 29

Slide 29 text

Control Monday, April 23, 12

Slide 30

Slide 30 text

class MessageRepresenter < Representer::Base namespace :message attributes :id, :title, :body belongs_to :user has_many :attachments end class SimpleMessageRepresenter < Representer::Base namespace :post attributes :id, :title, :body end Monday, April 23, 12

Slide 31

Slide 31 text

Testability Monday, April 23, 12

Slide 32

Slide 32 text

describe MessageRepresenter do subject do MessageRepresenter.new([]) end describe "#render" do it "renders to json" do subject.render(:json).should == '[]' end end end Monday, April 23, 12

Slide 33

Slide 33 text

Speed Monday, April 23, 12

Slide 34

Slide 34 text

Benchmarking: simple to_json Average: 26ms Benchmarking: active model serializer Average: 18ms Benchmarking: simple represent Average: 5ms 50 messages with user and one attachment Monday, April 23, 12

Slide 35

Slide 35 text

Average (ms) 5 18 26 to_json Serializers Representers 50 messages with user and one attachment Monday, April 23, 12

Slide 36

Slide 36 text

Talk is cheap, show me the code Linus Torvalds Monday, April 23, 12

Slide 37

Slide 37 text

github.com/futuresimple/representer Monday, April 23, 12

Slide 38

Slide 38 text

Monday, April 23, 12