introduction to riak and ripple (kc.rb)

147
Introduction to Riak & Ripple Sean Cribbs Developer Advocate basho

Upload: sean-cribbs

Post on 29-Jan-2018

4.278 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Introduction to Riak and Ripple (KC.rb)

Introduction toRiak & Ripple

Sean CribbsDeveloper Advocatebasho

Page 2: Introduction to Riak and Ripple (KC.rb)

Introduction toRiak & Ripple

Sean CribbsDeveloper Advocate

Rubyist, Evangelist, Support Monkey

basho

Page 3: Introduction to Riak and Ripple (KC.rb)

Riak @10,000 ft.

Page 4: Introduction to Riak and Ripple (KC.rb)

Riak @10,000 ft.•Amazon Dynamo-inspired

replicated, distributed, fault-tolerant, masterless, scalable, operations-friendly

Page 5: Introduction to Riak and Ripple (KC.rb)

Riak @10,000 ft.•Amazon Dynamo-inspired

replicated, distributed, fault-tolerant, masterless, scalable, operations-friendly

•Key-Value / Document

Page 6: Introduction to Riak and Ripple (KC.rb)

Riak @10,000 ft.•Amazon Dynamo-inspired

replicated, distributed, fault-tolerant, masterless, scalable, operations-friendly

•Key-Value / Document

• Schema-less, content-agnostic

Page 7: Introduction to Riak and Ripple (KC.rb)

Riak @10,000 ft.•Amazon Dynamo-inspired

replicated, distributed, fault-tolerant, masterless, scalable, operations-friendly

•Key-Value / Document

• Schema-less, content-agnostic

•Web-friendlyHTTP, JSON, Javascript

Page 8: Introduction to Riak and Ripple (KC.rb)

Dynamo-like Scalability

Page 9: Introduction to Riak and Ripple (KC.rb)

Dynamo-like Scalability

•To get...

Page 10: Introduction to Riak and Ripple (KC.rb)

Dynamo-like Scalability

•To get...

•more storage,

Page 11: Introduction to Riak and Ripple (KC.rb)

Dynamo-like Scalability

•To get...

•more storage,

•more throughput,

Page 12: Introduction to Riak and Ripple (KC.rb)

Dynamo-like Scalability

•To get...

•more storage,

•more throughput,

•lower latency...

Page 13: Introduction to Riak and Ripple (KC.rb)

Dynamo-like Scalability

•To get...

•more storage,

•more throughput,

•lower latency...

•...add more machines.aka horizontal & linear

Page 14: Introduction to Riak and Ripple (KC.rb)

Key-Value++

Page 15: Introduction to Riak and Ripple (KC.rb)

Key-Value++•Data objects are identified by keys,

and have metadata

Page 16: Introduction to Riak and Ripple (KC.rb)

Key-Value++•Data objects are identified by keys,

and have metadata

•Keys are grouped in buckets

Page 17: Introduction to Riak and Ripple (KC.rb)

Key-Value++•Data objects are identified by keys,

and have metadata

•Keys are grouped in buckets

•Links enable lightweight relationships

Page 18: Introduction to Riak and Ripple (KC.rb)

Key-Value++•Data objects are identified by keys,

and have metadata

•Keys are grouped in buckets

•Links enable lightweight relationships

•Query with MapReduce

Page 19: Introduction to Riak and Ripple (KC.rb)

Sans-Schema

Page 20: Introduction to Riak and Ripple (KC.rb)

Sans-Schema•Buckets created on the fly

Page 21: Introduction to Riak and Ripple (KC.rb)

Sans-Schema•Buckets created on the fly

•Values are opaque

Page 22: Introduction to Riak and Ripple (KC.rb)

Sans-Schema•Buckets created on the fly

•Values are opaque

•Content-Type matters

Page 23: Introduction to Riak and Ripple (KC.rb)

Sans-Schema•Buckets created on the fly

•Values are opaque

•Content-Type matters

•The application defines the semantics: more flexibility, more responsibility

Page 24: Introduction to Riak and Ripple (KC.rb)

Web-Friendly

Page 25: Introduction to Riak and Ripple (KC.rb)

Web-Friendly•HTTP is primary interface

Page 26: Introduction to Riak and Ripple (KC.rb)

Web-Friendly•HTTP is primary interface

•JSON is used for structured data

Page 27: Introduction to Riak and Ripple (KC.rb)

Web-Friendly•HTTP is primary interface

•JSON is used for structured data

•Javascript is used for MapReduce functions

Page 28: Introduction to Riak and Ripple (KC.rb)

Web-Friendly•HTTP is primary interface

•JSON is used for structured data

•Javascript is used for MapReduce functions

•Plays well with Varnish, Squid, HAProxy, F5, etc.

Page 29: Introduction to Riak and Ripple (KC.rb)

Web-Friendly•HTTP is primary interface

•JSON is used for structured data

•Javascript is used for MapReduce functions

•Plays well with Varnish, Squid, HAProxy, F5, etc.[see also Webmachine]

Page 30: Introduction to Riak and Ripple (KC.rb)

Use Cases

Page 31: Introduction to Riak and Ripple (KC.rb)

Use Cases•Document storage

(sparse structure)

Page 32: Introduction to Riak and Ripple (KC.rb)

Use Cases•Document storage

(sparse structure)

•Distributed file storage (small size, large soon)

Page 33: Introduction to Riak and Ripple (KC.rb)

Use Cases•Document storage

(sparse structure)

•Distributed file storage (small size, large soon)

•Session storage

Page 34: Introduction to Riak and Ripple (KC.rb)

Use Cases•Document storage

(sparse structure)

•Distributed file storage (small size, large soon)

•Session storage

•Distributed cache

Page 35: Introduction to Riak and Ripple (KC.rb)

Use Cases•Document storage

(sparse structure)

•Distributed file storage (small size, large soon)

•Session storage

•Distributed cache

•Browser-only/Mobile Apps

Page 36: Introduction to Riak and Ripple (KC.rb)

Getting Started

Page 37: Introduction to Riak and Ripple (KC.rb)

Getting Started•Download a package from

http://downloads.basho.com

Page 38: Introduction to Riak and Ripple (KC.rb)

Getting Started•Download a package from

http://downloads.basho.com

•Set the node name, IPs

Page 39: Introduction to Riak and Ripple (KC.rb)

Getting Started•Download a package from

http://downloads.basho.com

•Set the node name, IPs

•Start up the node

Page 40: Introduction to Riak and Ripple (KC.rb)

Getting Started•Download a package from

http://downloads.basho.com

•Set the node name, IPs

•Start up the node

•Join a cluster

Page 41: Introduction to Riak and Ripple (KC.rb)

Getting Started•Download a package from

http://downloads.basho.com

•Set the node name, IPs

•Start up the node

•Join a cluster

•Start storing/retrieving values

Page 42: Introduction to Riak and Ripple (KC.rb)

Riak in Ruby

Page 43: Introduction to Riak and Ripple (KC.rb)

Riak in Ruby•Three gems

Page 44: Introduction to Riak and Ripple (KC.rb)

Riak in Ruby•Three gems

•riak-client (basic ops)

Page 45: Introduction to Riak and Ripple (KC.rb)

Riak in Ruby•Three gems

•riak-client (basic ops)

•ripple (ODM)

Page 46: Introduction to Riak and Ripple (KC.rb)

Riak in Ruby•Three gems

•riak-client (basic ops)

•ripple (ODM)

•riak-sessions (Rack/Rails session stores)

Page 47: Introduction to Riak and Ripple (KC.rb)

Riak in Ruby•Three gems

•riak-client (basic ops)

•ripple (ODM)

•riak-sessions (Rack/Rails session stores)

•All HTTP - Protobuffs coming

Page 48: Introduction to Riak and Ripple (KC.rb)

require ‘riak’

Page 49: Introduction to Riak and Ripple (KC.rb)

require ‘riak’• Make a client object

client = Riak::Client.new

Page 50: Introduction to Riak and Ripple (KC.rb)

require ‘riak’• Make a client object

client = Riak::Client.new

• Get a bucketbucket = client.bucket(‘foo’) # Riak::Bucket

Page 51: Introduction to Riak and Ripple (KC.rb)

require ‘riak’• Make a client object

client = Riak::Client.new

• Get a bucketbucket = client.bucket(‘foo’) # Riak::Bucket

• Get an object from the bucketobj = bucket.get(‘bar’) # Riak::RObject

Page 52: Introduction to Riak and Ripple (KC.rb)

require ‘riak’• Make a client object

client = Riak::Client.new

• Get a bucketbucket = client.bucket(‘foo’) # Riak::Bucket

• Get an object from the bucketobj = bucket.get(‘bar’) # Riak::RObject

• Initialize a new objectobj = bucket.new(‘baz’)

Page 53: Introduction to Riak and Ripple (KC.rb)

Riak::RObject

Page 54: Introduction to Riak and Ripple (KC.rb)

Riak::RObject•Get/set object key

obj.key = “bar”

Page 55: Introduction to Riak and Ripple (KC.rb)

Riak::RObject•Get/set object key

obj.key = “bar”

•Get/set content-typeobj.content_type = ‘application/json’

Page 56: Introduction to Riak and Ripple (KC.rb)

Riak::RObject•Get/set object key

obj.key = “bar”

•Get/set content-typeobj.content_type = ‘application/json’

•Get/set the object body dataobj.data = {“name” => “Sean”}

Page 57: Introduction to Riak and Ripple (KC.rb)

Riak::RObject•Get/set object key

obj.key = “bar”

•Get/set content-typeobj.content_type = ‘application/json’

•Get/set the object body dataobj.data = {“name” => “Sean”}

•Store the objectobj.store

Page 58: Introduction to Riak and Ripple (KC.rb)

More RObject

Page 59: Introduction to Riak and Ripple (KC.rb)

More RObject•Get object’s bucket

obj.bucket

Page 60: Introduction to Riak and Ripple (KC.rb)

More RObject•Get object’s bucket

obj.bucket

•Delete the objectobj.delete # freezes the object

Page 61: Introduction to Riak and Ripple (KC.rb)

More RObject•Get object’s bucket

obj.bucket

•Delete the objectobj.delete # freezes the object

•Detect/extract siblings (more later)obj.conflict? && obj.siblings# Array<RObject>

Page 62: Introduction to Riak and Ripple (KC.rb)

More RObject•Get object’s bucket

obj.bucket

•Delete the objectobj.delete # freezes the object

•Detect/extract siblings (more later)obj.conflict? && obj.siblings# Array<RObject>

•Follow/traverse links (more later)obj.walk(:tag => “friend”)

Page 63: Introduction to Riak and Ripple (KC.rb)

Riak::Bucket

Page 64: Introduction to Riak and Ripple (KC.rb)

Riak::Bucket•Set the replication factor

bucket.n_val = 5

Page 65: Introduction to Riak and Ripple (KC.rb)

Riak::Bucket•Set the replication factor

bucket.n_val = 5

•Set default request quorumsbucket.r = 3 # w,dw,rw # number or one/all/quorum

Page 66: Introduction to Riak and Ripple (KC.rb)

Riak::Bucket•Set the replication factor

bucket.n_val = 5

•Set default request quorumsbucket.r = 3 # w,dw,rw # number or one/all/quorum

•List keysbucket.keys # pass block to stream

Page 67: Introduction to Riak and Ripple (KC.rb)

Riak::Bucket•Set the replication factor

bucket.n_val = 5

•Set default request quorumsbucket.r = 3 # w,dw,rw # number or one/all/quorum

•List keysbucket.keys # pass block to stream

•Set consistency flag (allow sibling generation)obj.allow_mult = true

Page 68: Introduction to Riak and Ripple (KC.rb)

Links: LightweightRelationships

Page 69: Introduction to Riak and Ripple (KC.rb)

Link Header

Link: </riak/demo/test1>; riaktag=”userinfo”

Page 70: Introduction to Riak and Ripple (KC.rb)

Link Header

Link: </riak/demo/test1>; riaktag=”userinfo”

bucket

Page 71: Introduction to Riak and Ripple (KC.rb)

Link Header

Link: </riak/demo/test1>; riaktag=”userinfo”

bucket

key

Page 72: Introduction to Riak and Ripple (KC.rb)

Link Header

Link: </riak/demo/test1>; riaktag=”userinfo”

bucket

key

tag

Page 73: Introduction to Riak and Ripple (KC.rb)

Links in Ruby API

Page 74: Introduction to Riak and Ripple (KC.rb)

Links in Ruby API•Create a link

Riak::Link.new(“/riak/bucket/key”, “tag”)

Page 75: Introduction to Riak and Ripple (KC.rb)

Links in Ruby API•Create a link

Riak::Link.new(“/riak/bucket/key”, “tag”)

•Read an object’s linksobj.links # Set<Riak::Link>

Page 76: Introduction to Riak and Ripple (KC.rb)

Links in Ruby API•Create a link

Riak::Link.new(“/riak/bucket/key”, “tag”)

•Read an object’s linksobj.links # Set<Riak::Link>

•Convert an object to a linkobj.links << obj2.to_link(“next”)obj.store

Page 77: Introduction to Riak and Ripple (KC.rb)

Link-Walking

Page 78: Introduction to Riak and Ripple (KC.rb)

Link-Walking•Asks Riak to traverse a sequence of

links via special URL

Page 79: Introduction to Riak and Ripple (KC.rb)

Link-Walking•Asks Riak to traverse a sequence of

links via special URL

•Filter by bucket/tag

Page 80: Introduction to Riak and Ripple (KC.rb)

Link-Walking•Asks Riak to traverse a sequence of

links via special URL

•Filter by bucket/tag

•Can return results from intermediate traversals

Page 81: Introduction to Riak and Ripple (KC.rb)

Link-Walking•Asks Riak to traverse a sequence of

links via special URL

•Filter by bucket/tag

•Can return results from intermediate traversals

•Response is nested multipart/mixed(riak-client handles this for you)

Page 82: Introduction to Riak and Ripple (KC.rb)

L/W Example

Page 83: Introduction to Riak and Ripple (KC.rb)

L/W ExampleGET /riak/demo/test1/_,friend,1

Start at demo/test1, follow all links tagged “friend” and return the objects

obj = client[‘demo’][‘test1’]obj.walk(:tag => “friend”,:keep => true)

Page 84: Introduction to Riak and Ripple (KC.rb)

L/W ExampleGET /riak/demo/test1/_,friend,1

Start at demo/test1, follow all links tagged “friend” and return the objects

obj = client[‘demo’][‘test1’]obj.walk(:tag => “friend”,:keep => true)

Page 85: Introduction to Riak and Ripple (KC.rb)

L/W Example

Page 86: Introduction to Riak and Ripple (KC.rb)

L/W ExampleGET /riak/demo/test1/_,_,_/_,_,1

Start at demo/test1, follow all links, follow all links from those, return everything from the last set

obj.walk({},{:keep => true})

Page 87: Introduction to Riak and Ripple (KC.rb)

Map-Reduce

Page 88: Introduction to Riak and Ripple (KC.rb)

Map-Reduce

list of keys

Page 89: Introduction to Riak and Ripple (KC.rb)

Map-Reduce

list of keys

map map map map map

Page 90: Introduction to Riak and Ripple (KC.rb)

Map-Reduce

list of keys

map map map map map

reduce

Page 91: Introduction to Riak and Ripple (KC.rb)

Map-Reduce

list of keys

map map map map map

reduce

results

Page 92: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Page 93: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Riak object

Page 94: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Riak object

{ bucket:”foo”, key:”bar”, vclock:”...”, values:[ {metadata:{...}, data:”....”} ]}

Page 95: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Page 96: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in JavascriptKey-specific

data

Page 97: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Page 98: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in JavascriptPhase-

specific data

Page 99: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Page 100: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Parse JSON data

Page 101: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Page 102: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Check field equality

Page 103: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Page 104: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Return nothing if unequal

Page 105: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Page 106: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Return the object if all equal

Page 107: Introduction to Riak and Ripple (KC.rb)

Map

function(value, keyData, arg) {    var object = Riak.mapValuesJson(value)[0];    for(field in arg) {        if(object[field] != arg[field]) {            return [];        }    }    return [object];}

in Javascript

Page 108: Introduction to Riak and Ripple (KC.rb)

Reduce

function(values,arg) {    return values.sort(function(a,b){ return a[arg] - b[arg]; });}

in Javascript

Page 109: Introduction to Riak and Ripple (KC.rb)

Reduce

function(values,arg) {    return values.sort(function(a,b){ return a[arg] - b[arg]; });}

in Javascript

Map results

Page 110: Introduction to Riak and Ripple (KC.rb)

Reduce

function(values,arg) {    return values.sort(function(a,b){ return a[arg] - b[arg]; });}

in Javascript

Page 111: Introduction to Riak and Ripple (KC.rb)

Reduce

function(values,arg) {    return values.sort(function(a,b){ return a[arg] - b[arg]; });}

in Javascript

Phase-specific data

Page 112: Introduction to Riak and Ripple (KC.rb)

Reduce

function(values,arg) {    return values.sort(function(a,b){ return a[arg] - b[arg]; });}

in Javascript

Page 113: Introduction to Riak and Ripple (KC.rb)

Reduce

function(values,arg) {    return values.sort(function(a,b){ return a[arg] - b[arg]; });}

in Javascript

Custom sort on

Page 114: Introduction to Riak and Ripple (KC.rb)

Reduce

function(values,arg) {    return values.sort(function(a,b){ return a[arg] - b[arg]; });}

in Javascript

Page 115: Introduction to Riak and Ripple (KC.rb)

Reduce

function(values,arg) {    return values.sort(function(a,b){ return a[arg] - b[arg]; });}

in Javascript

Reduce potentially called multiple times!!

Page 116: Introduction to Riak and Ripple (KC.rb)

Example Query

Page 117: Introduction to Riak and Ripple (KC.rb)

Example Query{“inputs”: “goog”, “query”: [{“map”:{“language”:”javascript”, “name”: “App.findHighGreater”, “arg”: 600.0, “keep”: false}, {“reduce”:{“language”:”javascript”, “name”: “Riak.reduceMax”, “keep”: true}]}

Page 118: Introduction to Riak and Ripple (KC.rb)

Example Query{“inputs”: “goog”, “query”: [{“map”:{“language”:”javascript”, “name”: “App.findHighGreater”, “arg”: 600.0, “keep”: false}, {“reduce”:{“language”:”javascript”, “name”: “Riak.reduceMax”, “keep”: true}]}

Riak::MapReduce.new(c).add(‘goog’).map(‘App.findHighGreater’, :arg => 600.0).reduce(“Riak.reduceMax”, :keep => true).run

Page 119: Introduction to Riak and Ripple (KC.rb)

Built-in Functions

Page 120: Introduction to Riak and Ripple (KC.rb)

Built-in Functions•Riak.mapValues

Page 121: Introduction to Riak and Ripple (KC.rb)

Built-in Functions•Riak.mapValues

•Riak.mapValuesJson

Page 122: Introduction to Riak and Ripple (KC.rb)

Built-in Functions•Riak.mapValues

•Riak.mapValuesJson

•Riak.mapByFields

Page 123: Introduction to Riak and Ripple (KC.rb)

Built-in Functions•Riak.mapValues

•Riak.mapValuesJson

•Riak.mapByFields

•Riak.reduceSum

Page 124: Introduction to Riak and Ripple (KC.rb)

Built-in Functions•Riak.mapValues

•Riak.mapValuesJson

•Riak.mapByFields

•Riak.reduceSum

•Riak.reduceSort

Page 125: Introduction to Riak and Ripple (KC.rb)

Built-in Functions•Riak.mapValues

•Riak.mapValuesJson

•Riak.mapByFields

•Riak.reduceSum

•Riak.reduceSort

•Riak.reduceMin/reduceMax

Page 126: Introduction to Riak and Ripple (KC.rb)

Ripple - ODM

Page 127: Introduction to Riak and Ripple (KC.rb)

Document Modelsclass Person include Ripple::Document

property :name, String, :presence => true many :addresses many :friends, :class => Personend

class Address include Ripple::EmbeddedDocument

property :street, Stringend

Page 128: Introduction to Riak and Ripple (KC.rb)

Rails Setup

Page 129: Introduction to Riak and Ripple (KC.rb)

Rails Setup

# Gemfilegem 'curb' # Faster HTTPgem 'yajl-ruby' # Faster JSONgem 'ripple'

Page 130: Introduction to Riak and Ripple (KC.rb)

Rails Setup

# Gemfilegem 'curb' # Faster HTTPgem 'yajl-ruby' # Faster JSONgem 'ripple'

Page 131: Introduction to Riak and Ripple (KC.rb)

Rails Setup

# Gemfilegem 'curb' # Faster HTTPgem 'yajl-ruby' # Faster JSONgem 'ripple'

$ gem install curb yajl-ruby ripple

Page 132: Introduction to Riak and Ripple (KC.rb)

Rails Setup (cont.)

Page 133: Introduction to Riak and Ripple (KC.rb)

Rails Setup (cont.)

# config/ripple.ymldevelopment: host: 127.0.0.1 port: 8098

Page 134: Introduction to Riak and Ripple (KC.rb)

Rails Setup (cont.)

# config/ripple.ymldevelopment: host: 127.0.0.1 port: 8098

# config/application.rbrequire 'ripple/railtie'

Page 135: Introduction to Riak and Ripple (KC.rb)

Ripple Roadmap

Page 136: Introduction to Riak and Ripple (KC.rb)

Ripple Roadmap•Testing server (edge on Github)

Page 137: Introduction to Riak and Ripple (KC.rb)

Ripple Roadmap•Testing server (edge on Github)

•Protocol Buffers support

Page 138: Introduction to Riak and Ripple (KC.rb)

Ripple Roadmap•Testing server (edge on Github)

•Protocol Buffers support

•Streaming MapReduce

Page 139: Introduction to Riak and Ripple (KC.rb)

Ripple Roadmap•Testing server (edge on Github)

•Protocol Buffers support

•Streaming MapReduce

•Ripple-specific built-ins

Page 140: Introduction to Riak and Ripple (KC.rb)

Ripple Roadmap•Testing server (edge on Github)

•Protocol Buffers support

•Streaming MapReduce

•Ripple-specific built-ins

•Better ActionView support (form_for)

Page 141: Introduction to Riak and Ripple (KC.rb)

Happy FunDemo Time

Page 142: Introduction to Riak and Ripple (KC.rb)

Plug

basho

Page 143: Introduction to Riak and Ripple (KC.rb)

PlugInterested in learning about support, consulting, or Enterprise features?

basho

Page 144: Introduction to Riak and Ripple (KC.rb)

PlugInterested in learning about support, consulting, or Enterprise features?Email [email protected] or go to http://www.basho.com/contact.html to talk with us.

basho

Page 145: Introduction to Riak and Ripple (KC.rb)

PlugInterested in learning about support, consulting, or Enterprise features?Email [email protected] or go to http://www.basho.com/contact.html to talk with us.

basho

Page 147: Introduction to Riak and Ripple (KC.rb)

Questions