embracing constraints with couchdb (zc10 2010-11-04)

64
EMBRACING CONSTRAINTS WITH COUCHDB

Upload: david-zuelke

Post on 15-Jan-2015

1.615 views

Category:

Technology


0 download

DESCRIPTION

Presentation given at ZendCon 2010.

TRANSCRIPT

Page 1: Embracing Constraints with CouchDB (ZC10 2010-11-04)

EMBRACING CONSTRAINTS WITH COUCHDB

Page 2: Embracing Constraints with CouchDB (ZC10 2010-11-04)

David Zülke

Page 3: Embracing Constraints with CouchDB (ZC10 2010-11-04)

David Zuelke

Page 4: Embracing Constraints with CouchDB (ZC10 2010-11-04)
Page 5: Embracing Constraints with CouchDB (ZC10 2010-11-04)
Page 7: Embracing Constraints with CouchDB (ZC10 2010-11-04)

http://en.wikipedia.org/wiki/File:München_Panorama.JPG

Page 8: Embracing Constraints with CouchDB (ZC10 2010-11-04)

Founder

Page 10: Embracing Constraints with CouchDB (ZC10 2010-11-04)

Lead Developer

Page 13: Embracing Constraints with CouchDB (ZC10 2010-11-04)

A DISCLAIMER FIRSTBefore You All Figure This Out Yourselves...

Page 14: Embracing Constraints with CouchDB (ZC10 2010-11-04)
Page 15: Embracing Constraints with CouchDB (ZC10 2010-11-04)
Page 16: Embracing Constraints with CouchDB (ZC10 2010-11-04)

NEIN NEIN NEIN NEIN

DAS IST BETRUG

Page 17: Embracing Constraints with CouchDB (ZC10 2010-11-04)

This talk is not really about embracing constraints

Page 18: Embracing Constraints with CouchDB (ZC10 2010-11-04)

I’ll tell you what it’s really about when we’re finished

Page 19: Embracing Constraints with CouchDB (ZC10 2010-11-04)

I’ll also apologize to you for lying at that point, and not now

Page 20: Embracing Constraints with CouchDB (ZC10 2010-11-04)

(it’s always easier to apologize than to ask for permission)

Page 21: Embracing Constraints with CouchDB (ZC10 2010-11-04)

COUCHDB IN THREE SLIDESFull Of DIS IS SRS BSNS Bullet Points

Page 22: Embracing Constraints with CouchDB (ZC10 2010-11-04)

COUCHDB STORES DOCUMENTS

• CouchDB stores documents with arbitrary keys and values

• Each document is identified by an ID and has a revision

•Documents can have file attachments

• Stored as JSON, so it’s easy to interface with

Page 23: Embracing Constraints with CouchDB (ZC10 2010-11-04)

COUCHDB SPEAKS HTTP

• CouchDB uses HTTP to communicate with clients & servers

• That means scalability

• That means a lot of kick ass stuff totally for free

• Caching

• Load Balancing

• Content Negotiation

Page 24: Embracing Constraints with CouchDB (ZC10 2010-11-04)

COUCHDB USES MVCC

•Multiversion Concurrency Control

•When updating, you must supply a revision number

• Your change will be rejected if the revision is not the latest

• All writes are serialized

•No need for locks, but puts some responsibility on developers

Page 25: Embracing Constraints with CouchDB (ZC10 2010-11-04)

SOME DETAILSAn In-Depth Look At What Makes CouchDB Different

Page 26: Embracing Constraints with CouchDB (ZC10 2010-11-04)

CAP

consistency

availability

partition toleranceX

Do you know the

theorem?

Page 27: Embracing Constraints with CouchDB (ZC10 2010-11-04)

“So, CouchDB does not have consistency of CAP?”

Page 28: Embracing Constraints with CouchDB (ZC10 2010-11-04)

“Booh, that means my data will be inconsistent. Fail!”

Page 29: Embracing Constraints with CouchDB (ZC10 2010-11-04)

psssshhh

Page 30: Embracing Constraints with CouchDB (ZC10 2010-11-04)

YOUR MOM IS INCONSISTENT

Page 31: Embracing Constraints with CouchDB (ZC10 2010-11-04)

CouchDB is eventually consistent

Page 32: Embracing Constraints with CouchDB (ZC10 2010-11-04)

When replicating, conflicting revisions will be marked as such

Page 33: Embracing Constraints with CouchDB (ZC10 2010-11-04)

These conflicts can then be resolved (users, daemons,...)

Page 34: Embracing Constraints with CouchDB (ZC10 2010-11-04)

and everything will be fine\o/

Page 35: Embracing Constraints with CouchDB (ZC10 2010-11-04)

which brings us to...

Page 36: Embracing Constraints with CouchDB (ZC10 2010-11-04)

REPLICATION

• You can do Master-Master replication

• Conflicts are detected and marked automatically

• Conflicts are supposed to be resolved by applications

•Or by users, who usually know best what to do!

Page 37: Embracing Constraints with CouchDB (ZC10 2010-11-04)

CouchDB is Ground Computing

Page 38: Embracing Constraints with CouchDB (ZC10 2010-11-04)

Imagine a world where every computer runs CouchDB

Page 39: Embracing Constraints with CouchDB (ZC10 2010-11-04)

Ubuntu One already does, to sync bookmarks etc!

Page 40: Embracing Constraints with CouchDB (ZC10 2010-11-04)

MAP/REDUCE

Page 41: Embracing Constraints with CouchDB (ZC10 2010-11-04)

BASIC PRINCIPLE: MAPPER

• The Mapper reads records and emits <key, value> pairs

• Example: Apache access.log

• Each line is a record

• Extract client IP address and number of bytes transferred

• Emit IP address as key, number of bytes as value

• For hourly rotating logs, the job can be split across 24 nodes*

* In pratice, it’s a lot smarter than that

Page 42: Embracing Constraints with CouchDB (ZC10 2010-11-04)

BASIC PRINCIPLE: REDUCER

• A Reducer is given a key and all values for this specific key

• Even if there are many Mappers on many computers; the results are aggregated before they are handed to Reducers

• Example: Apache access.log

• The Reducer is called once for each client IP (that’s our key), with a list of values (transferred bytes)

•We simply sum up the bytes to get the total traffic per IP!

Page 43: Embracing Constraints with CouchDB (ZC10 2010-11-04)

EXAMPLE OF MAPPED INPUT

IP Bytes

212.122.174.13 18271

212.122.174.13 191726

212.122.174.13 198

74.119.8.111 91272

74.119.8.111 8371

212.122.174.13 43

Page 44: Embracing Constraints with CouchDB (ZC10 2010-11-04)

REDUCER WILL RECEIVE THIS

IP Bytes

212.122.174.13

18271

212.122.174.13191726

212.122.174.13198

212.122.174.13

43

74.119.8.11191272

74.119.8.1118371

Page 45: Embracing Constraints with CouchDB (ZC10 2010-11-04)

AFTER REDUCTION

IP Bytes

212.122.174.13 210238

74.119.8.111 99643

Page 46: Embracing Constraints with CouchDB (ZC10 2010-11-04)

COUCHDB INCREMENTAL MAPREDUCE

Page 47: Embracing Constraints with CouchDB (ZC10 2010-11-04)

THE KEY DIFFERENCE

•Maps and Reduces are incremental:

• If one document changes, only that one document needs:

•mapping

• reduction

• Then a few new reduce runs are performed to compute the final result

Page 48: Embracing Constraints with CouchDB (ZC10 2010-11-04)

MAPPER: DOCS BY TAGS

function(doc)  {    if(doc.type  ==  'product')  {        (doc.tags  ||  []).forEach(function(tag)  {            emit(tag,  doc);        });    }}

Page 49: Embracing Constraints with CouchDB (ZC10 2010-11-04)

MAPREDUCE: COUNT TAGS

function(doc)  {    if(doc.type  ==  'product')  {        (doc.tags  ||  []).forEach(function(tag)  {            emit(tag,  1);        });    }}

function(key,  values)  {    return  sum(values);}

Page 50: Embracing Constraints with CouchDB (ZC10 2010-11-04)

BUT WAIT!There are no tables :(

Page 51: Embracing Constraints with CouchDB (ZC10 2010-11-04)

so... how do you join data from related documents?

Page 52: Embracing Constraints with CouchDB (ZC10 2010-11-04)

JOIN CATEGORIES & ITEMSfunction(doc)  {    if(doc.type  ==  'product')  {        emit([doc._id,  0],  doc);        emit([doc._id,  1],  {  _id:  doc.category_id  });    }}

["123",  0]            {_id:  "123",  _rev:  "5-­‐a72",  type:  "product",  "name":  "Laser  Beam"}["123",  1]            {_id:  "est",  _rev:  "2-­‐9af",  type:  "category",  "name":  "Evil  Stuff"}

["817",  0]            {_id:  "817",  _rev:  "2-­‐aa8",  type:  "product",  "name":  "Rocketship"}["817",  1]            {_id:  "cst",  _rev:  "3-­‐d8a",  type:  "category",  "name":  "Cool  Stuff"}

["441",  0]            {_id:  "441",  _rev:  "19-­‐fdf",  type:  "product",  "name":  "Sharks"}["441",  1]            {_id:  "est",  _rev:  "2-­‐9af",  type:  "category",  "name":  "Evil  Stuff"}

Page 53: Embracing Constraints with CouchDB (ZC10 2010-11-04)

JOIN PRODUCTS & ITEMSfunction(doc)  {    if(doc.type  ==  'category')  {        emit([doc._id,  0],  doc);    }  elseif(doc.type  ==  'product')  {        emit([doc.category_id,  doc._id],  doc);    }}

["est",  0]            {_id:  "est",  _rev:  "2-­‐9af",  type:  "category",  "name":  "Evil  Stuff"}["est",  "123"]    {_id:  "123",  _rev:  "5-­‐a72",  type:  "product",  "name":  "Laser  Beam"}["est",  "441"]    {_id:  "441",  _rev:  "19-­‐fdf",  type:  "product",  "name":  "Sharks"}

["cst",  0]            {_id:  "cst",  _rev:  "3-­‐d8a",  type:  "category",  "name":  "Cool  Stuff"}["cst",  "817"]    {_id:  "817",  _rev:  "2-­‐aa8",  type:  "product",  "name":  "Rocketship"}

Page 54: Embracing Constraints with CouchDB (ZC10 2010-11-04)

BUT... BUT... WAIT!How do you validate document structures if it’s all schema-less?

Page 55: Embracing Constraints with CouchDB (ZC10 2010-11-04)

VALIDATE DOCUMENTS

function  (newDoc,  savedDoc,  userCtx)  {

   if(savedDoc  &&  savedDoc.created_at  !=  newDoc.created_at)  {        throw({forbidden:  'created_at  is  immutable'});    }

   if(doc.type  ==  'product')  {        if(!doc.price)  {            throw({forbidden:  'product  must  have  a  price'});        }    }

}

Page 56: Embracing Constraints with CouchDB (ZC10 2010-11-04)

VALIDATE DOCUMENTS

function  (newDoc,  savedDoc,  userCtx)  {

   function  require(beTrue,  message)  {        if(!beTrue)  throw({forbidden:  message});    }

   require(savedDoc  &&  savedDoc.created_at  !=  newDoc.created_at,        'created_at  is  immutable'    );

   if(doc.type  ==  'product')  {        require(!doc.price,            'product  must  have  a  price'        );    }

}

Page 57: Embracing Constraints with CouchDB (ZC10 2010-11-04)

LUCENE INTEGRATIONFull Control Over What Is Indexed, And How

Page 58: Embracing Constraints with CouchDB (ZC10 2010-11-04)

COUCHAPPPython Tool For Development And Deployment

Page 59: Embracing Constraints with CouchDB (ZC10 2010-11-04)

DEMO TIMELet’s Relax On The Couch

Page 60: Embracing Constraints with CouchDB (ZC10 2010-11-04)

!e End

Page 61: Embracing Constraints with CouchDB (ZC10 2010-11-04)

FURTHER READING

• http://books.couchdb.org/

• http://couchdb.apache.org/

• http://github.com/couchapp/couchapp

• http://github.com/rnewson/couchdb-lucene/

• http://janl.github.com/couchdbx/

• http://j.mp/oqbQs (E4X in CouchDB for XML parsing)

Page 62: Embracing Constraints with CouchDB (ZC10 2010-11-04)

DID YOU SEE THE HEAD FAKE?This Talk Was Not About Embracing Constraints

It Was About Embracing Awesomeness

Page 63: Embracing Constraints with CouchDB (ZC10 2010-11-04)

Questions?

Page 64: Embracing Constraints with CouchDB (ZC10 2010-11-04)

THANK YOU!This was

http://joind.in/2315by

@dzuelke