couchdb & ruby: you’re doing it wrong
DESCRIPTION
As givTRANSCRIPT
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
Free plan
BigCouch
github.com/cloudant/bigcouch
Open Source
cloudant.com
github.com/timanglade
@timanglade
?