couchdb & ruby: you’re doing it wrong

Post on 16-May-2015

11.769 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

As giv

TRANSCRIPT

COUCHDB&RubYYOU’RE!DOING!IT RONG

A!PRESENTATION!BY @timangladEFROM!YOUR!FRIENDS!AT @cloudant

W

@timanglade

COUCHDB HOSTING+

AD-HOC SOLUTIONS

Re:Identical nodes& Dist. Testing

Ruby:10% OF our USERS65% OF the I/O

That’s called having a vested interest, my Friends

COUCHDB➞ A SimplE REST STORE

tim$ curl -X GET https://localhost:5984/nosqlsummer/berlintim$ { _id: "berlin" _rev: "87-d666a8e1176a068b343d7ccca7260141" name: "Berlin" lifeguards: "Tim Lossen" welcome: "What could be a better excuse to hang …" }

A match madein HEAVEN?

In Rubyland:COUCHRESTgithub.com/couchrest

require 'couchrest'

db = CouchRest.database!("https://tim.cloudant.com/nosqlsummer")

db.get("berlin")

=> { "name" => "Berlin", "lifeguards" => "Tim Lossen", "_rev" => "87-d666a8e1176a068b343d7ccca7260141", "welcome" => "What could be a better excuse to hang out …" }

Looking Good,right?

0

200

400

600

800

1k 10k 50k 100k

MEDIAN TIME TO SAVE A DOCTi

me

spen

t (m

s)

Document Size

MAN, COUCHDBIS SO SLOW…

WRONG WRONG WRONG WRONG

require 'couchrest'

db = CouchRest.database!("https://tim.cloudant.com/nosqlsummer")

db.get("berlin")

=> { "name" => "Berlin", "lifeguards" => "Tim Lossen", "_rev" => "87-d666a8e1176a068b343d7ccca7260141", "welcome" => "What could be a better excuse to hang out …" }

Warning #0CouchREST#Database!

VS.CouchREST#Database

upgrade to Couchrest 1.1.3 now

Warning #1Actually, don’t useMuch of CouchRESTAT ALLYou’LL Thank me later.

Warning #2Loada proper JSON LIBRARY

MULTI_JSON = fail

Warning #3LOCALITY

Warning #4TO HTTPS… OR NOT?

require 'json/ext'require 'couchrest'@db = "http://tim-east.cloudant.com/mydb"

def my_functionCouchRest.put(@db, doc)

end

require 'couchrest'def my_function db = CouchRest.database!("https://tim-west.cloudant.com/mydb") db.save_doc(doc)def

Before

AFTER

0

200

400

600

800

1k 10k 50k 100k

BeforeTi

me

spen

t (m

s)

Document Size

EncodingHTTPDecoding

How Much?

10% ? 20% ? 30% ?

0

200

400

600

800

1k 10k 50k 100k

BeforeTi

me

spen

t (m

s)

Document Size

EncodingHTTPDecoding

0

200

400

600

800

1k 10k 50k 100k

Tim

e sp

ent

(ms)

Document Size

EncodingHTTPDecoding

AFTER

AFTER

0

8

15

23

30

1k 10k 50k 100k

Tim

e sp

ent

(ms)

Document Size

EncodingHTTPDecoding

Lol96%

AND Guess what, we’re not done yet…

Warning #5LOLJSON

MESSAGEPACK

Say Hello to my little FRIEND

How complex?10 lines of code

0

8

15

23

30

1k 10k 50k 100k

With MessagePACK

EncodingHTTPDecodingJSON

3ms

6MS9MS

3ms

COUCHDB➞ A NOT-SO-SimplE REST STORE

I SHOULD USE COUCHREST_MODEL,RIGHT?

WRONG WRONG WRONG WRONG

ODMs areA BAD IDEA

COUCHREST_MODEL IS POORLYIMPLEMENTEDFile > Open > nightmare.RB

DoN’T USECOUCHREST_MODEL

Or I will personally hunt you downand punch you in the neck

➞ So WHAT?

GROUP INFOONE HTTP CALL PERRUBY METHOD

Write views as necessaryIF you can’t ➡ Wrong DB?

{ "_id": "berlin", "country": "Germany", "meetings": { "2010-10-17": { "location": "Beergarden", "description": "Initial meeting. Come say hi!" } "2010-12-27": { "location": "Alexanderplatz", "description": "Second meeting. Yes!" } } }

LEARN HOW TO USEBULK_DOCS

A no-brainer if you do multiple updatesinSIDE one ruby method

LEARN VIEWSTHE HARD WAY

function(doc) { if (doc.type == 'city') { emit(doc.id, doc); }}

MAP

function(doc) { if (doc.type == 'city') { emit(doc.id, doc['meetings'].length); }}

MAP

REDUCE_stats

LEARN VIEWSTHE NOT-SO-HARD WAYgithub.com/candlerb/couchdb_ruby_view

LEARNTO PUT MORE APPLOGIC IN COUCHDB

LEARNWHEN TO USEFULL-TEXT SEARCHDon’t WRITE A VIEW PER COLUMN-EQUIVALENT…

LEARNSTALE=OK

COUCHDB VIEW ARE UPDATED on READS.YOU MAY WAIT A WHILE…

➞ GOD MODE

CloudantSoftlayer

users

SinatraAPAC

SINATRAUS-EAST

LEARNTO LEVERAGEREPLICATION

SinatraAPAC

CloudantAPAC

SINATRAUS-EAST

CloudantUS-East

CloudantSOFTLAYER

users

LEARNHOW TO TWEAKCONSISTENCY

SinatraAPAC

CloudantAPAC

SINATRAUS-EAST

CloudantUS-East

CloudantSOFTLAYER

users

LEARNTO OFFLOADTO FRONT-END JS

SinatraAPAC

CloudantAPAC

SINATRAUS-EAST

CloudantUS-East

CloudantSOFTLAYER

users

LEARNTO CACHESOME COUCHDBROUTES

SinatraAPAC

CloudantAPAC

SINATRAUS-EAST

CloudantUS-East

CloudantSOFTLAYER

CDN

users

Recap!!1.! NEVER USE COUCHREST_MODEL!2.!Be WARY OF COUCHREST!3.!LOAD A PROPER JSON LIBRARY!4.!PAY ATTENTION TO LOCALITY!5.!ONLY USE HTTPS WHEN NECESSARY!6.!Don’t be afraid to extend

GoEXPERIMENTIMPLEMENTMEASUREIMPROVEHAVE FUN

github.com/timanglade

cloudant.comtim@cloudant.com

@timanglade

?

top related