SlideShare a Scribd company logo
1 of 147
Introduction to
Riak & Ripple
      Sean Cribbs
basho Developer Advocate
Introduction to
Riak & Ripple
      Sean Cribbs
basho Developer Advocate

                    Rubyist, Evangelist,
                     Support Monkey
Riak @10,000 ft.
Riak @10,000 ft.
• Amazon Dynamo-inspired
  replicated, distributed,
  fault-tolerant, masterless,
  scalable, operations-friendly
Riak @10,000 ft.
• Amazon Dynamo-inspired
  replicated, distributed,
  fault-tolerant, masterless,
  scalable, operations-friendly

• Key-Value / Document
Riak @10,000 ft.
• Amazon Dynamo-inspired
  replicated, distributed,
  fault-tolerant, masterless,
  scalable, operations-friendly

• Key-Value / Document
• Schema-less, content-agnostic
Riak @10,000 ft.
• Amazon Dynamo-inspired
  replicated, distributed,
  fault-tolerant, masterless,
  scalable, operations-friendly

• Key-Value / Document
• Schema-less, content-agnostic
• Web-friendly
  HTTP, JSON, Javascript
Dynamo-like
 Scalability
Dynamo-like
       Scalability
• To get...
Dynamo-like
      Scalability
• To get...
 • more storage,
Dynamo-like
      Scalability
• To get...
 • more storage,
 • more throughput,
Dynamo-like
      Scalability
• To get...
 • more storage,
 • more throughput,
 • lower latency...
Dynamo-like
       Scalability
• To get...
 • more storage,
 • more throughput,
 • lower latency...
• ...add more machines.
  aka horizontal & linear
Key-Value++
Key-Value++
• Data objects are identified by keys,
  and have metadata
Key-Value++
• Data objects are identified by keys,
  and have metadata

• Keys are grouped in buckets
Key-Value++
• Data objects are identified by keys,
  and have metadata

• Keys are grouped in buckets
• Links enable lightweight
  relationships
Key-Value++
• Data objects are identified by keys,
  and have metadata

• Keys are grouped in buckets
• Links enable lightweight
  relationships

• Query with MapReduce
Sans-Schema
Sans-Schema
• Buckets created on the fly
Sans-Schema
• Buckets created on the fly
• Values are opaque
Sans-Schema
• Buckets created on the fly
• Values are opaque
•Content-Type matters
Sans-Schema
• Buckets created on the fly
• Values are opaque
•Content-Type matters
•The application defines the
 semantics:
 more flexibility, more responsibility
Web-Friendly
Web-Friendly
•HTTP is primary interface
Web-Friendly
•HTTP is primary interface
•JSON is used for structured data
Web-Friendly
•HTTP is primary interface
•JSON is used for structured data
•Javascript is used for
  MapReduce functions
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.
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]
Use Cases
Use Cases
•Document storage
 (sparse structure)
Use Cases
•Document storage
 (sparse structure)

•Distributed file storage
 (small size, large soon)
Use Cases
•Document storage
 (sparse structure)

•Distributed file storage
 (small size, large soon)

•Session storage
Use Cases
•Document storage
 (sparse structure)

•Distributed file storage
 (small size, large soon)

•Session storage
•Distributed cache
Use Cases
•Document storage
 (sparse structure)

•Distributed file storage
 (small size, large soon)

•Session storage
•Distributed cache
• Browser-only/Mobile Apps
Getting Started
Getting Started
• Download a package from
 http://downloads.basho.com
Getting Started
• Download a package from
  http://downloads.basho.com

• Set the node name, IPs
Getting Started
• Download a package from
  http://downloads.basho.com

• Set the node name, IPs
• Start up the node
Getting Started
• Download a package from
  http://downloads.basho.com

• Set the node name, IPs
• Start up the node
• Join a cluster
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
Riak in Ruby
Riak in Ruby
• Three gems
Riak in Ruby
• Three gems
 • riak-client (basic ops)
Riak in Ruby
• Three gems
 • riak-client (basic ops)
 • ripple (ODM)
Riak in Ruby
• Three gems
 • riak-client (basic ops)
 • ripple (ODM)
 • riak-sessions
   (Rack/Rails session stores)
Riak in Ruby
• Three gems
 • riak-client (basic ops)
 • ripple (ODM)
 • riak-sessions
   (Rack/Rails session stores)

• All HTTP - Protobuffs coming
require ‘riak’
require ‘riak’
• Make a client object
 client = Riak::Client.new
require ‘riak’
• Make a client object
 client = Riak::Client.new

• Get a bucket
 bucket = client.bucket(‘foo’) # Riak::Bucket
require ‘riak’
• Make a client object
 client = Riak::Client.new

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

• Get an object from the bucket
 obj = bucket.get(‘bar’) # Riak::RObject
require ‘riak’
• Make a client object
 client = Riak::Client.new

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

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

• Initialize a new object
 obj = bucket.new(‘baz’)
Riak::RObject
Riak::RObject
•Get/set object key
 obj.key = “bar”
Riak::RObject
•Get/set object key
 obj.key = “bar”

•Get/set content-type
 obj.content_type = ‘application/json’
Riak::RObject
•Get/set object key
 obj.key = “bar”

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

•Get/set the object body data
 obj.data = {“name” => “Sean”}
Riak::RObject
•Get/set object key
 obj.key = “bar”

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

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

•Store the object
 obj.store
More RObject
More RObject
•Get object’s bucket
 obj.bucket
More RObject
•Get object’s bucket
 obj.bucket

•Delete the object
 obj.delete # freezes the object
More RObject
•Get object’s bucket
  obj.bucket

•Delete the object
  obj.delete # freezes the object

•Detect/extract siblings (more later)
  obj.conflict? && obj.siblings
  # Array<RObject>
More RObject
•Get object’s bucket
  obj.bucket

•Delete the object
  obj.delete # freezes the object

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

•Follow/traverse links (more later)
  obj.walk(:tag => “friend”)
Riak::Bucket
Riak::Bucket
•Set the replication factor
  bucket.n_val = 5
Riak::Bucket
•Set the replication factor
  bucket.n_val = 5

•Set default request quorums
  bucket.r = 3 # w,dw,rw
   # number or one/all/quorum
Riak::Bucket
•Set the replication factor
  bucket.n_val = 5

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

•List keys
  bucket.keys # pass block to stream
Riak::Bucket
•Set the replication factor
  bucket.n_val = 5

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

•List keys
  bucket.keys # pass block to stream

•Set consistency flag (allow sibling generation)
  obj.allow_mult = true
Links: Lightweight
Relationships
Link Header


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

          bucket

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

          bucket

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


                  key
Link Header

          bucket                       tag

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


                  key
Links in Ruby API
Links in Ruby API
• Create a link
  Riak::Link.new(“/riak/bucket/key”,
            “tag”)
Links in Ruby API
• Create a link
  Riak::Link.new(“/riak/bucket/key”,
            “tag”)

• Read an#object’s links
  obj.links Set<Riak::Link>
Links in Ruby API
• Create a link
  Riak::Link.new(“/riak/bucket/key”,
              “tag”)

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

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

  obj.store
Link-Walking
Link-Walking
• Asks Riak to traverse a sequence of
  links via special URL
Link-Walking
• Asks Riak to traverse a sequence of
  links via special URL

• Filter by bucket/tag
Link-Walking
• Asks Riak to traverse a sequence of
  links via special URL

• Filter by bucket/tag
• Can return results from
  intermediate traversals
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)
L/W Example
L/W Example
GET /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)
L/W Example
GET /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)
L/W Example
L/W Example
GET /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})
Map-Reduce
list of keys




Map-Reduce
list of keys



map    map       map        map   map




      Map-Reduce
list of keys



map    map       map        map   map




                reduce




      Map-Reduce
list of keys



map    map       map        map   map




                reduce



               results



      Map-Reduce
Map
                        in Javascript


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

         Riak object

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

         Riak object

function(value, keyData, arg) {
    var object = Riak.mapValuesJson(value)[0];
    for(field in arg) {
                         {
        if(object[field] != arg[field]) {
            return [];    bucket:”foo”,
        }                 key:”bar”,
    }                     vclock:”...”,
    return [object];
}                         values:[
                            {metadata:{...},
                             data:”....”}
                        ]
                       }
Map
                        in Javascript


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

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


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


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


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


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


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


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


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


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


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


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




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


         Map results

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




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


                  Phase-
                specific data

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




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




function(values,arg) {
    return values.sort(function(a,b){
      return a[arg] - b[arg];
    });                        Custom sort on
}
Reduce
                         in Javascript




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




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


  Reduce potentially called multiple times!!
Example Query
Example Query
{“inputs”: “goog”,
“query”: [{“map”:{“language”:”javascript”,
            “name”: “App.findHighGreater”,
            “arg”: 600.0,
            “keep”: false},
       {“reduce”:{“language”:”javascript”,
              “name”: “Riak.reduceMax”,
              “keep”: true}]}
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
Built-in Functions
Built-in Functions
• Riak.mapValues
Built-in Functions
• Riak.mapValues
• Riak.mapValuesJson
Built-in Functions
• Riak.mapValues
• Riak.mapValuesJson
• Riak.mapByFields
Built-in Functions
• Riak.mapValues
• Riak.mapValuesJson
• Riak.mapByFields
• Riak.reduceSum
Built-in Functions
• Riak.mapValues
• Riak.mapValuesJson
• Riak.mapByFields
• Riak.reduceSum
• Riak.reduceSort
Built-in Functions
• Riak.mapValues
• Riak.mapValuesJson
• Riak.mapByFields
• Riak.reduceSum
• Riak.reduceSort
• Riak.reduceMin/reduceMax
Ripple - ODM
Document Models
class Person
 include Ripple::Document

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

class Address
 include Ripple::EmbeddedDocument

 property :street, String
end
Rails Setup
Rails Setup

# Gemfile
gem 'curb'    # Faster HTTP
gem 'yajl-ruby' # Faster JSON
gem 'ripple'
Rails Setup

# Gemfile
gem 'curb'    # Faster HTTP
gem 'yajl-ruby' # Faster JSON
gem 'ripple'
Rails Setup

# Gemfile
gem 'curb'    # Faster HTTP
gem 'yajl-ruby' # Faster JSON
gem 'ripple'


$ gem install curb yajl-ruby ripple
Rails Setup (cont.)
Rails Setup (cont.)
# config/ripple.yml
development:
 host: 127.0.0.1
 port: 8098
Rails Setup (cont.)
# config/ripple.yml
development:
 host: 127.0.0.1
 port: 8098


# config/application.rb
require 'ripple/railtie'
Ripple Roadmap
Ripple Roadmap
• Testing server (edge on Github)
Ripple Roadmap
• Testing server (edge on Github)
• Protocol Buffers support
Ripple Roadmap
• Testing server (edge on Github)
• Protocol Buffers support
• Streaming MapReduce
Ripple Roadmap
• Testing server (edge on Github)
• Protocol Buffers support
• Streaming MapReduce
• Ripple-specific built-ins
Ripple Roadmap
• Testing server (edge on Github)
• Protocol Buffers support
• Streaming MapReduce
• Ripple-specific built-ins
• Better ActionView support
  (form_for)
Happy Fun
Demo Time
Plug




basho
Plug
        Interested in learning about support,
        consulting, or Enterprise features?




basho
Plug
        Interested in learning about support,
        consulting, or Enterprise features?
        Email info@basho.com or go to
        http://www.basho.com/
        contact.html to talk with us.




basho
Plug
        Interested in learning about support,
        consulting, or Enterprise features?
        Email info@basho.com or go to
        http://www.basho.com/
        contact.html to talk with us.




basho
Plug
        Interested in learning about support,
        consulting, or Enterprise features?
        Email info@basho.com or go to
        http://www.basho.com/
        contact.html to talk with us.

                     www.basho.com

             sean@basho.com
               @seancribbs
basho
Questions

More Related Content

What's hot

Riak Intro at Munich Node.js
Riak Intro at Munich Node.jsRiak Intro at Munich Node.js
Riak Intro at Munich Node.jsPhilipp Fehre
 
Couchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problemCouchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problemdelagoya
 
Icinga 2009 at OSMC
Icinga 2009 at OSMCIcinga 2009 at OSMC
Icinga 2009 at OSMCIcinga
 
OSDC 2014: Sebastian Harl - SysDB the system management and inventory collect...
OSDC 2014: Sebastian Harl - SysDB the system management and inventory collect...OSDC 2014: Sebastian Harl - SysDB the system management and inventory collect...
OSDC 2014: Sebastian Harl - SysDB the system management and inventory collect...NETWAYS
 
Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Matthew Groves
 
Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3makoto tsuyuki
 
ARC204 AWS Infrastructure Automation - AWS re: Invent 2012
ARC204 AWS Infrastructure Automation - AWS re: Invent 2012ARC204 AWS Infrastructure Automation - AWS re: Invent 2012
ARC204 AWS Infrastructure Automation - AWS re: Invent 2012Amazon Web Services
 
Apache Spark and DataStax Enablement
Apache Spark and DataStax EnablementApache Spark and DataStax Enablement
Apache Spark and DataStax EnablementVincent Poncet
 
Elasticsearch for SQL Users
Elasticsearch for SQL UsersElasticsearch for SQL Users
Elasticsearch for SQL UsersAll Things Open
 
The effective use of Django ORM
The effective use of Django ORMThe effective use of Django ORM
The effective use of Django ORMYaroslav Muravskyi
 
Harnessing the power of Nutch with Scala
Harnessing the power of Nutch with ScalaHarnessing the power of Nutch with Scala
Harnessing the power of Nutch with ScalaKnoldus Inc.
 
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014Amazon Web Services
 
Introducing Riak
Introducing RiakIntroducing Riak
Introducing RiakKevin Smith
 
LA Cassandra Day 2015 - Cassandra for developers
LA Cassandra Day 2015  - Cassandra for developersLA Cassandra Day 2015  - Cassandra for developers
LA Cassandra Day 2015 - Cassandra for developersChristopher Batey
 
Spark Programming
Spark ProgrammingSpark Programming
Spark ProgrammingTaewook Eom
 
Workshop: Learning Elasticsearch
Workshop: Learning ElasticsearchWorkshop: Learning Elasticsearch
Workshop: Learning ElasticsearchAnurag Patel
 

What's hot (20)

Riak Intro at Munich Node.js
Riak Intro at Munich Node.jsRiak Intro at Munich Node.js
Riak Intro at Munich Node.js
 
Couchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problemCouchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problem
 
Icinga 2009 at OSMC
Icinga 2009 at OSMCIcinga 2009 at OSMC
Icinga 2009 at OSMC
 
Oak Lucene Indexes
Oak Lucene IndexesOak Lucene Indexes
Oak Lucene Indexes
 
OSDC 2014: Sebastian Harl - SysDB the system management and inventory collect...
OSDC 2014: Sebastian Harl - SysDB the system management and inventory collect...OSDC 2014: Sebastian Harl - SysDB the system management and inventory collect...
OSDC 2014: Sebastian Harl - SysDB the system management and inventory collect...
 
Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017
 
Assetic (OSCON)
Assetic (OSCON)Assetic (OSCON)
Assetic (OSCON)
 
HiveServer2
HiveServer2HiveServer2
HiveServer2
 
Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3
 
ARC204 AWS Infrastructure Automation - AWS re: Invent 2012
ARC204 AWS Infrastructure Automation - AWS re: Invent 2012ARC204 AWS Infrastructure Automation - AWS re: Invent 2012
ARC204 AWS Infrastructure Automation - AWS re: Invent 2012
 
Apache Spark and DataStax Enablement
Apache Spark and DataStax EnablementApache Spark and DataStax Enablement
Apache Spark and DataStax Enablement
 
Elasticsearch for SQL Users
Elasticsearch for SQL UsersElasticsearch for SQL Users
Elasticsearch for SQL Users
 
The effective use of Django ORM
The effective use of Django ORMThe effective use of Django ORM
The effective use of Django ORM
 
Harnessing the power of Nutch with Scala
Harnessing the power of Nutch with ScalaHarnessing the power of Nutch with Scala
Harnessing the power of Nutch with Scala
 
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
 
Introducing Riak
Introducing RiakIntroducing Riak
Introducing Riak
 
Apache Kite
Apache KiteApache Kite
Apache Kite
 
LA Cassandra Day 2015 - Cassandra for developers
LA Cassandra Day 2015  - Cassandra for developersLA Cassandra Day 2015  - Cassandra for developers
LA Cassandra Day 2015 - Cassandra for developers
 
Spark Programming
Spark ProgrammingSpark Programming
Spark Programming
 
Workshop: Learning Elasticsearch
Workshop: Learning ElasticsearchWorkshop: Learning Elasticsearch
Workshop: Learning Elasticsearch
 

Viewers also liked

T-mining presentation at BlockChain Vlaanderen
T-mining presentation at BlockChain VlaanderenT-mining presentation at BlockChain Vlaanderen
T-mining presentation at BlockChain VlaanderenNico Wauters
 
Smart Contracts and Identity
Smart Contracts and IdentitySmart Contracts and Identity
Smart Contracts and IdentityPascal Van Hecke
 
Ripple Labs: Values, Purpose, Strategy 2014
Ripple Labs: Values, Purpose, Strategy 2014Ripple Labs: Values, Purpose, Strategy 2014
Ripple Labs: Values, Purpose, Strategy 2014Ripple Labs
 
Open & Private Blockchains at CSCMP Benelux Supply Chain Event
Open & Private Blockchains at CSCMP Benelux Supply Chain EventOpen & Private Blockchains at CSCMP Benelux Supply Chain Event
Open & Private Blockchains at CSCMP Benelux Supply Chain EventSam Wouters
 
Build Secure IoT Solutions Using... Blockchain - Geeta Chauhan
Build Secure IoT Solutions Using... Blockchain - Geeta ChauhanBuild Secure IoT Solutions Using... Blockchain - Geeta Chauhan
Build Secure IoT Solutions Using... Blockchain - Geeta ChauhanWithTheBest
 
Conceptualizing Smart Contracts
Conceptualizing Smart ContractsConceptualizing Smart Contracts
Conceptualizing Smart ContractsAaron Wright
 
Smart Gateways, Blockchain and the Internet of Things (Charalampos Doukas-Cre...
Smart Gateways, Blockchain and the Internet of Things (Charalampos Doukas-Cre...Smart Gateways, Blockchain and the Internet of Things (Charalampos Doukas-Cre...
Smart Gateways, Blockchain and the Internet of Things (Charalampos Doukas-Cre...AGILE IoT
 
Yang Ming Struggling to Keep Up
Yang Ming Struggling to Keep UpYang Ming Struggling to Keep Up
Yang Ming Struggling to Keep UpXeneta
 
Secure IoT with Blockchain: Fad or Reality? [BOF5490]
Secure IoT with Blockchain: Fad or Reality? [BOF5490]Secure IoT with Blockchain: Fad or Reality? [BOF5490]
Secure IoT with Blockchain: Fad or Reality? [BOF5490]Leonardo De Moura Rocha Lima
 
Technical introduction to Hyperledger's Fabric
Technical introduction to Hyperledger's FabricTechnical introduction to Hyperledger's Fabric
Technical introduction to Hyperledger's FabricAltoros
 
Ethereum - Introduction to Smart Contracts
Ethereum - Introduction to Smart ContractsEthereum - Introduction to Smart Contracts
Ethereum - Introduction to Smart Contractsjarradh
 
BigchainDB - Big Data meets Blockchain
BigchainDB - Big Data meets BlockchainBigchainDB - Big Data meets Blockchain
BigchainDB - Big Data meets BlockchainDimitri De Jonghe
 
BigchainDB: A Scalable Blockchain Database, In Python
  BigchainDB: A Scalable Blockchain Database, In Python   BigchainDB: A Scalable Blockchain Database, In Python
BigchainDB: A Scalable Blockchain Database, In Python BigchainDB
 
Blockchain Use Cases: Think of a "Public" Pub/Sub Queue
Blockchain Use Cases: Think of a "Public" Pub/Sub QueueBlockchain Use Cases: Think of a "Public" Pub/Sub Queue
Blockchain Use Cases: Think of a "Public" Pub/Sub QueueAltoros
 
Introduction to Ethereum
Introduction to EthereumIntroduction to Ethereum
Introduction to EthereumTerek Judi
 
Metadata in the Blockchain: The OP_RETURN Explosion
Metadata in the Blockchain: The OP_RETURN ExplosionMetadata in the Blockchain: The OP_RETURN Explosion
Metadata in the Blockchain: The OP_RETURN ExplosionCoin Sciences Ltd
 
Architecture of the Hyperledger Blockchain Fabric - Christian Cachin - IBM Re...
Architecture of the Hyperledger Blockchain Fabric - Christian Cachin - IBM Re...Architecture of the Hyperledger Blockchain Fabric - Christian Cachin - IBM Re...
Architecture of the Hyperledger Blockchain Fabric - Christian Cachin - IBM Re...Romeo Kienzler
 

Viewers also liked (20)

IBM-BLOCKCHAIN-DECK
IBM-BLOCKCHAIN-DECKIBM-BLOCKCHAIN-DECK
IBM-BLOCKCHAIN-DECK
 
T-mining presentation at BlockChain Vlaanderen
T-mining presentation at BlockChain VlaanderenT-mining presentation at BlockChain Vlaanderen
T-mining presentation at BlockChain Vlaanderen
 
Smart Contracts and Identity
Smart Contracts and IdentitySmart Contracts and Identity
Smart Contracts and Identity
 
Ripple Labs: Values, Purpose, Strategy 2014
Ripple Labs: Values, Purpose, Strategy 2014Ripple Labs: Values, Purpose, Strategy 2014
Ripple Labs: Values, Purpose, Strategy 2014
 
Open & Private Blockchains at CSCMP Benelux Supply Chain Event
Open & Private Blockchains at CSCMP Benelux Supply Chain EventOpen & Private Blockchains at CSCMP Benelux Supply Chain Event
Open & Private Blockchains at CSCMP Benelux Supply Chain Event
 
Build Secure IoT Solutions Using... Blockchain - Geeta Chauhan
Build Secure IoT Solutions Using... Blockchain - Geeta ChauhanBuild Secure IoT Solutions Using... Blockchain - Geeta Chauhan
Build Secure IoT Solutions Using... Blockchain - Geeta Chauhan
 
Conceptualizing Smart Contracts
Conceptualizing Smart ContractsConceptualizing Smart Contracts
Conceptualizing Smart Contracts
 
Smart Gateways, Blockchain and the Internet of Things (Charalampos Doukas-Cre...
Smart Gateways, Blockchain and the Internet of Things (Charalampos Doukas-Cre...Smart Gateways, Blockchain and the Internet of Things (Charalampos Doukas-Cre...
Smart Gateways, Blockchain and the Internet of Things (Charalampos Doukas-Cre...
 
Yang Ming Struggling to Keep Up
Yang Ming Struggling to Keep UpYang Ming Struggling to Keep Up
Yang Ming Struggling to Keep Up
 
Secure IoT with Blockchain: Fad or Reality? [BOF5490]
Secure IoT with Blockchain: Fad or Reality? [BOF5490]Secure IoT with Blockchain: Fad or Reality? [BOF5490]
Secure IoT with Blockchain: Fad or Reality? [BOF5490]
 
Technical introduction to Hyperledger's Fabric
Technical introduction to Hyperledger's FabricTechnical introduction to Hyperledger's Fabric
Technical introduction to Hyperledger's Fabric
 
Ethereum - Introduction to Smart Contracts
Ethereum - Introduction to Smart ContractsEthereum - Introduction to Smart Contracts
Ethereum - Introduction to Smart Contracts
 
BigchainDB and Beyond
BigchainDB and BeyondBigchainDB and Beyond
BigchainDB and Beyond
 
BigchainDB - Big Data meets Blockchain
BigchainDB - Big Data meets BlockchainBigchainDB - Big Data meets Blockchain
BigchainDB - Big Data meets Blockchain
 
BigchainDB: A Scalable Blockchain Database, In Python
  BigchainDB: A Scalable Blockchain Database, In Python   BigchainDB: A Scalable Blockchain Database, In Python
BigchainDB: A Scalable Blockchain Database, In Python
 
Blockchain Use Cases: Think of a "Public" Pub/Sub Queue
Blockchain Use Cases: Think of a "Public" Pub/Sub QueueBlockchain Use Cases: Think of a "Public" Pub/Sub Queue
Blockchain Use Cases: Think of a "Public" Pub/Sub Queue
 
Smart contracts
Smart contractsSmart contracts
Smart contracts
 
Introduction to Ethereum
Introduction to EthereumIntroduction to Ethereum
Introduction to Ethereum
 
Metadata in the Blockchain: The OP_RETURN Explosion
Metadata in the Blockchain: The OP_RETURN ExplosionMetadata in the Blockchain: The OP_RETURN Explosion
Metadata in the Blockchain: The OP_RETURN Explosion
 
Architecture of the Hyperledger Blockchain Fabric - Christian Cachin - IBM Re...
Architecture of the Hyperledger Blockchain Fabric - Christian Cachin - IBM Re...Architecture of the Hyperledger Blockchain Fabric - Christian Cachin - IBM Re...
Architecture of the Hyperledger Blockchain Fabric - Christian Cachin - IBM Re...
 

Similar to Introduction to Riak and Ripple (KC.rb)

Riak from Small to Large
Riak from Small to LargeRiak from Small to Large
Riak from Small to LargeRusty Klophaus
 
Getting Started with Riak - NoSQL Live 2010 - Boston
Getting Started with Riak - NoSQL Live 2010 - BostonGetting Started with Riak - NoSQL Live 2010 - Boston
Getting Started with Riak - NoSQL Live 2010 - BostonRusty Klophaus
 
Introducing Riak
Introducing RiakIntroducing Riak
Introducing RiakKevin Smith
 
Adding Riak to your NoSQL Bag of Tricks
Adding Riak to your NoSQL Bag of TricksAdding Riak to your NoSQL Bag of Tricks
Adding Riak to your NoSQL Bag of Trickssiculars
 
Walkthrough Neo4j 1.9 & 2.0
Walkthrough Neo4j 1.9 & 2.0Walkthrough Neo4j 1.9 & 2.0
Walkthrough Neo4j 1.9 & 2.0Neo4j
 
Rails 3 (beta) Roundup
Rails 3 (beta) RoundupRails 3 (beta) Roundup
Rails 3 (beta) RoundupWayne Carter
 
StackMate - CloudFormation for CloudStack
StackMate - CloudFormation for CloudStackStackMate - CloudFormation for CloudStack
StackMate - CloudFormation for CloudStackChiradeep Vittal
 
Play Framework and Activator
Play Framework and ActivatorPlay Framework and Activator
Play Framework and ActivatorKevin Webber
 
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...Nilesh Panchal
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on RailsAvi Kedar
 
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...SPTechCon
 
Jasig rubyon rails
Jasig rubyon railsJasig rubyon rails
Jasig rubyon rails_zaMmer_
 
Jasig rubyon rails
Jasig rubyon railsJasig rubyon rails
Jasig rubyon rails_zaMmer_
 

Similar to Introduction to Riak and Ripple (KC.rb) (20)

Riak from Small to Large
Riak from Small to LargeRiak from Small to Large
Riak from Small to Large
 
Getting Started with Riak - NoSQL Live 2010 - Boston
Getting Started with Riak - NoSQL Live 2010 - BostonGetting Started with Riak - NoSQL Live 2010 - Boston
Getting Started with Riak - NoSQL Live 2010 - Boston
 
Introducing Riak
Introducing RiakIntroducing Riak
Introducing Riak
 
Adding Riak to your NoSQL Bag of Tricks
Adding Riak to your NoSQL Bag of TricksAdding Riak to your NoSQL Bag of Tricks
Adding Riak to your NoSQL Bag of Tricks
 
Walkthrough Neo4j 1.9 & 2.0
Walkthrough Neo4j 1.9 & 2.0Walkthrough Neo4j 1.9 & 2.0
Walkthrough Neo4j 1.9 & 2.0
 
Riak with Rails
Riak with RailsRiak with Rails
Riak with Rails
 
Rails 3 (beta) Roundup
Rails 3 (beta) RoundupRails 3 (beta) Roundup
Rails 3 (beta) Roundup
 
StackMate - CloudFormation for CloudStack
StackMate - CloudFormation for CloudStackStackMate - CloudFormation for CloudStack
StackMate - CloudFormation for CloudStack
 
Play Framework and Activator
Play Framework and ActivatorPlay Framework and Activator
Play Framework and Activator
 
Rack
RackRack
Rack
 
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
 
Ws rest
Ws restWs rest
Ws rest
 
Guacamole
GuacamoleGuacamole
Guacamole
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on Rails
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
 
Log Analysis At Scale
Log Analysis At ScaleLog Analysis At Scale
Log Analysis At Scale
 
Jasig rubyon rails
Jasig rubyon railsJasig rubyon rails
Jasig rubyon rails
 
Jasig rubyon rails
Jasig rubyon railsJasig rubyon rails
Jasig rubyon rails
 
Intro to sbt-web
Intro to sbt-webIntro to sbt-web
Intro to sbt-web
 

More from Sean Cribbs

Eventually Consistent Data Structures (from strangeloop12)
Eventually Consistent Data Structures (from strangeloop12)Eventually Consistent Data Structures (from strangeloop12)
Eventually Consistent Data Structures (from strangeloop12)Sean Cribbs
 
Eventually-Consistent Data Structures
Eventually-Consistent Data StructuresEventually-Consistent Data Structures
Eventually-Consistent Data StructuresSean Cribbs
 
A Case of Accidental Concurrency
A Case of Accidental ConcurrencyA Case of Accidental Concurrency
A Case of Accidental ConcurrencySean Cribbs
 
Schema Design for Riak (Take 2)
Schema Design for Riak (Take 2)Schema Design for Riak (Take 2)
Schema Design for Riak (Take 2)Sean Cribbs
 
Riak (Øredev nosql day)
Riak (Øredev nosql day)Riak (Øredev nosql day)
Riak (Øredev nosql day)Sean Cribbs
 
Riak Tutorial (Øredev)
Riak Tutorial (Øredev)Riak Tutorial (Øredev)
Riak Tutorial (Øredev)Sean Cribbs
 
The Radiant Ethic
The Radiant EthicThe Radiant Ethic
The Radiant EthicSean Cribbs
 
Schema Design for Riak
Schema Design for RiakSchema Design for Riak
Schema Design for RiakSean Cribbs
 
Introducing Riak and Ripple
Introducing Riak and RippleIntroducing Riak and Ripple
Introducing Riak and RippleSean Cribbs
 
Round PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallyRound PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallySean Cribbs
 
Story Driven Development With Cucumber
Story Driven Development With CucumberStory Driven Development With Cucumber
Story Driven Development With CucumberSean Cribbs
 
Achieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangAchieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangSean Cribbs
 
Of Rats And Dragons
Of Rats And DragonsOf Rats And Dragons
Of Rats And DragonsSean Cribbs
 
Erlang/OTP for Rubyists
Erlang/OTP for RubyistsErlang/OTP for Rubyists
Erlang/OTP for RubyistsSean Cribbs
 
Content Management That Won't Rot Your Brain
Content Management That Won't Rot Your BrainContent Management That Won't Rot Your Brain
Content Management That Won't Rot Your BrainSean Cribbs
 

More from Sean Cribbs (15)

Eventually Consistent Data Structures (from strangeloop12)
Eventually Consistent Data Structures (from strangeloop12)Eventually Consistent Data Structures (from strangeloop12)
Eventually Consistent Data Structures (from strangeloop12)
 
Eventually-Consistent Data Structures
Eventually-Consistent Data StructuresEventually-Consistent Data Structures
Eventually-Consistent Data Structures
 
A Case of Accidental Concurrency
A Case of Accidental ConcurrencyA Case of Accidental Concurrency
A Case of Accidental Concurrency
 
Schema Design for Riak (Take 2)
Schema Design for Riak (Take 2)Schema Design for Riak (Take 2)
Schema Design for Riak (Take 2)
 
Riak (Øredev nosql day)
Riak (Øredev nosql day)Riak (Øredev nosql day)
Riak (Øredev nosql day)
 
Riak Tutorial (Øredev)
Riak Tutorial (Øredev)Riak Tutorial (Øredev)
Riak Tutorial (Øredev)
 
The Radiant Ethic
The Radiant EthicThe Radiant Ethic
The Radiant Ethic
 
Schema Design for Riak
Schema Design for RiakSchema Design for Riak
Schema Design for Riak
 
Introducing Riak and Ripple
Introducing Riak and RippleIntroducing Riak and Ripple
Introducing Riak and Ripple
 
Round PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallyRound PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing Functionally
 
Story Driven Development With Cucumber
Story Driven Development With CucumberStory Driven Development With Cucumber
Story Driven Development With Cucumber
 
Achieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangAchieving Parsing Sanity In Erlang
Achieving Parsing Sanity In Erlang
 
Of Rats And Dragons
Of Rats And DragonsOf Rats And Dragons
Of Rats And Dragons
 
Erlang/OTP for Rubyists
Erlang/OTP for RubyistsErlang/OTP for Rubyists
Erlang/OTP for Rubyists
 
Content Management That Won't Rot Your Brain
Content Management That Won't Rot Your BrainContent Management That Won't Rot Your Brain
Content Management That Won't Rot Your Brain
 

Recently uploaded

So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...itnewsafrica
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxfnnc6jmgwh
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 

Recently uploaded (20)

So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 

Introduction to Riak and Ripple (KC.rb)

  • 1. Introduction to Riak & Ripple Sean Cribbs basho Developer Advocate
  • 2. Introduction to Riak & Ripple Sean Cribbs basho Developer Advocate Rubyist, Evangelist, Support Monkey
  • 4. Riak @10,000 ft. • Amazon Dynamo-inspired replicated, distributed, fault-tolerant, masterless, scalable, operations-friendly
  • 5. Riak @10,000 ft. • Amazon Dynamo-inspired replicated, distributed, fault-tolerant, masterless, scalable, operations-friendly • Key-Value / Document
  • 6. Riak @10,000 ft. • Amazon Dynamo-inspired replicated, distributed, fault-tolerant, masterless, scalable, operations-friendly • Key-Value / Document • Schema-less, content-agnostic
  • 7. Riak @10,000 ft. • Amazon Dynamo-inspired replicated, distributed, fault-tolerant, masterless, scalable, operations-friendly • Key-Value / Document • Schema-less, content-agnostic • Web-friendly HTTP, JSON, Javascript
  • 9. Dynamo-like Scalability • To get...
  • 10. Dynamo-like Scalability • To get... • more storage,
  • 11. Dynamo-like Scalability • To get... • more storage, • more throughput,
  • 12. Dynamo-like Scalability • To get... • more storage, • more throughput, • lower latency...
  • 13. Dynamo-like Scalability • To get... • more storage, • more throughput, • lower latency... • ...add more machines. aka horizontal & linear
  • 15. Key-Value++ • Data objects are identified by keys, and have metadata
  • 16. Key-Value++ • Data objects are identified by keys, and have metadata • Keys are grouped in buckets
  • 17. Key-Value++ • Data objects are identified by keys, and have metadata • Keys are grouped in buckets • Links enable lightweight relationships
  • 18. Key-Value++ • Data objects are identified by keys, and have metadata • Keys are grouped in buckets • Links enable lightweight relationships • Query with MapReduce
  • 21. Sans-Schema • Buckets created on the fly • Values are opaque
  • 22. Sans-Schema • Buckets created on the fly • Values are opaque •Content-Type matters
  • 23. Sans-Schema • Buckets created on the fly • Values are opaque •Content-Type matters •The application defines the semantics: more flexibility, more responsibility
  • 26. Web-Friendly •HTTP is primary interface •JSON is used for structured data
  • 27. Web-Friendly •HTTP is primary interface •JSON is used for structured data •Javascript is used for MapReduce functions
  • 28. 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.
  • 29. 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]
  • 31. Use Cases •Document storage (sparse structure)
  • 32. Use Cases •Document storage (sparse structure) •Distributed file storage (small size, large soon)
  • 33. Use Cases •Document storage (sparse structure) •Distributed file storage (small size, large soon) •Session storage
  • 34. Use Cases •Document storage (sparse structure) •Distributed file storage (small size, large soon) •Session storage •Distributed cache
  • 35. Use Cases •Document storage (sparse structure) •Distributed file storage (small size, large soon) •Session storage •Distributed cache • Browser-only/Mobile Apps
  • 37. Getting Started • Download a package from http://downloads.basho.com
  • 38. Getting Started • Download a package from http://downloads.basho.com • Set the node name, IPs
  • 39. Getting Started • Download a package from http://downloads.basho.com • Set the node name, IPs • Start up the node
  • 40. Getting Started • Download a package from http://downloads.basho.com • Set the node name, IPs • Start up the node • Join a cluster
  • 41. 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
  • 43. Riak in Ruby • Three gems
  • 44. Riak in Ruby • Three gems • riak-client (basic ops)
  • 45. Riak in Ruby • Three gems • riak-client (basic ops) • ripple (ODM)
  • 46. Riak in Ruby • Three gems • riak-client (basic ops) • ripple (ODM) • riak-sessions (Rack/Rails session stores)
  • 47. Riak in Ruby • Three gems • riak-client (basic ops) • ripple (ODM) • riak-sessions (Rack/Rails session stores) • All HTTP - Protobuffs coming
  • 49. require ‘riak’ • Make a client object client = Riak::Client.new
  • 50. require ‘riak’ • Make a client object client = Riak::Client.new • Get a bucket bucket = client.bucket(‘foo’) # Riak::Bucket
  • 51. require ‘riak’ • Make a client object client = Riak::Client.new • Get a bucket bucket = client.bucket(‘foo’) # Riak::Bucket • Get an object from the bucket obj = bucket.get(‘bar’) # Riak::RObject
  • 52. require ‘riak’ • Make a client object client = Riak::Client.new • Get a bucket bucket = client.bucket(‘foo’) # Riak::Bucket • Get an object from the bucket obj = bucket.get(‘bar’) # Riak::RObject • Initialize a new object obj = bucket.new(‘baz’)
  • 54. Riak::RObject •Get/set object key obj.key = “bar”
  • 55. Riak::RObject •Get/set object key obj.key = “bar” •Get/set content-type obj.content_type = ‘application/json’
  • 56. Riak::RObject •Get/set object key obj.key = “bar” •Get/set content-type obj.content_type = ‘application/json’ •Get/set the object body data obj.data = {“name” => “Sean”}
  • 57. Riak::RObject •Get/set object key obj.key = “bar” •Get/set content-type obj.content_type = ‘application/json’ •Get/set the object body data obj.data = {“name” => “Sean”} •Store the object obj.store
  • 59. More RObject •Get object’s bucket obj.bucket
  • 60. More RObject •Get object’s bucket obj.bucket •Delete the object obj.delete # freezes the object
  • 61. More RObject •Get object’s bucket obj.bucket •Delete the object obj.delete # freezes the object •Detect/extract siblings (more later) obj.conflict? && obj.siblings # Array<RObject>
  • 62. More RObject •Get object’s bucket obj.bucket •Delete the object obj.delete # freezes the object •Detect/extract siblings (more later) obj.conflict? && obj.siblings # Array<RObject> •Follow/traverse links (more later) obj.walk(:tag => “friend”)
  • 64. Riak::Bucket •Set the replication factor bucket.n_val = 5
  • 65. Riak::Bucket •Set the replication factor bucket.n_val = 5 •Set default request quorums bucket.r = 3 # w,dw,rw # number or one/all/quorum
  • 66. Riak::Bucket •Set the replication factor bucket.n_val = 5 •Set default request quorums bucket.r = 3 # w,dw,rw # number or one/all/quorum •List keys bucket.keys # pass block to stream
  • 67. Riak::Bucket •Set the replication factor bucket.n_val = 5 •Set default request quorums bucket.r = 3 # w,dw,rw # number or one/all/quorum •List keys bucket.keys # pass block to stream •Set consistency flag (allow sibling generation) obj.allow_mult = true
  • 69. Link Header Link: </riak/demo/test1>; riaktag=”userinfo”
  • 70. Link Header bucket Link: </riak/demo/test1>; riaktag=”userinfo”
  • 71. Link Header bucket Link: </riak/demo/test1>; riaktag=”userinfo” key
  • 72. Link Header bucket tag Link: </riak/demo/test1>; riaktag=”userinfo” key
  • 74. Links in Ruby API • Create a link Riak::Link.new(“/riak/bucket/key”, “tag”)
  • 75. Links in Ruby API • Create a link Riak::Link.new(“/riak/bucket/key”, “tag”) • Read an#object’s links obj.links Set<Riak::Link>
  • 76. Links in Ruby API • Create a link Riak::Link.new(“/riak/bucket/key”, “tag”) • Read an#object’s links obj.links Set<Riak::Link> • Convert<< obj2.to_link(“next”) obj.links an object to a link obj.store
  • 78. Link-Walking • Asks Riak to traverse a sequence of links via special URL
  • 79. Link-Walking • Asks Riak to traverse a sequence of links via special URL • Filter by bucket/tag
  • 80. Link-Walking • Asks Riak to traverse a sequence of links via special URL • Filter by bucket/tag • Can return results from intermediate traversals
  • 81. 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)
  • 83. L/W Example GET /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)
  • 84. L/W Example GET /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)
  • 86. L/W Example GET /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})
  • 89. list of keys map map map map map Map-Reduce
  • 90. list of keys map map map map map reduce Map-Reduce
  • 91. list of keys map map map map map reduce results Map-Reduce
  • 92. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 93. Map in Javascript Riak object function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 94. Map in Javascript Riak object function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) { {         if(object[field] != arg[field]) {             return []; bucket:”foo”,         } key:”bar”,     } vclock:”...”,     return [object]; } values:[ {metadata:{...}, data:”....”} ] }
  • 95. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 96. Map in Javascript Key-specific data function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 97. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 98. Map in Javascript Phase- specific data function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 99. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 100. Map in Javascript function(value, keyData, arg) { Parse JSON data     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 101. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 102. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     } Check field equality     return [object]; }
  • 103. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 104. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return []; Return nothing if unequal         }     }     return [object]; }
  • 105. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 106. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; Return the object if all equal }
  • 107. Map in Javascript function(value, keyData, arg) {     var object = Riak.mapValuesJson(value)[0];     for(field in arg) {         if(object[field] != arg[field]) {             return [];         }     }     return [object]; }
  • 108. Reduce in Javascript function(values,arg) {     return values.sort(function(a,b){ return a[arg] - b[arg]; }); }
  • 109. Reduce in Javascript Map results function(values,arg) {     return values.sort(function(a,b){ return a[arg] - b[arg]; }); }
  • 110. Reduce in Javascript function(values,arg) {     return values.sort(function(a,b){ return a[arg] - b[arg]; }); }
  • 111. Reduce in Javascript Phase- specific data function(values,arg) {     return values.sort(function(a,b){ return a[arg] - b[arg]; }); }
  • 112. Reduce in Javascript function(values,arg) {     return values.sort(function(a,b){ return a[arg] - b[arg]; }); }
  • 113. Reduce in Javascript function(values,arg) {     return values.sort(function(a,b){ return a[arg] - b[arg]; }); Custom sort on }
  • 114. Reduce in Javascript function(values,arg) {     return values.sort(function(a,b){ return a[arg] - b[arg]; }); }
  • 115. Reduce in Javascript function(values,arg) {     return values.sort(function(a,b){ return a[arg] - b[arg]; }); } Reduce potentially called multiple times!!
  • 117. Example Query {“inputs”: “goog”, “query”: [{“map”:{“language”:”javascript”, “name”: “App.findHighGreater”, “arg”: 600.0, “keep”: false}, {“reduce”:{“language”:”javascript”, “name”: “Riak.reduceMax”, “keep”: true}]}
  • 118. 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
  • 122. Built-in Functions • Riak.mapValues • Riak.mapValuesJson • Riak.mapByFields
  • 123. Built-in Functions • Riak.mapValues • Riak.mapValuesJson • Riak.mapByFields • Riak.reduceSum
  • 124. Built-in Functions • Riak.mapValues • Riak.mapValuesJson • Riak.mapByFields • Riak.reduceSum • Riak.reduceSort
  • 125. Built-in Functions • Riak.mapValues • Riak.mapValuesJson • Riak.mapByFields • Riak.reduceSum • Riak.reduceSort • Riak.reduceMin/reduceMax
  • 127. Document Models class Person include Ripple::Document property :name, String, :presence => true many :addresses many :friends, :class => Person end class Address include Ripple::EmbeddedDocument property :street, String end
  • 129. Rails Setup # Gemfile gem 'curb' # Faster HTTP gem 'yajl-ruby' # Faster JSON gem 'ripple'
  • 130. Rails Setup # Gemfile gem 'curb' # Faster HTTP gem 'yajl-ruby' # Faster JSON gem 'ripple'
  • 131. Rails Setup # Gemfile gem 'curb' # Faster HTTP gem 'yajl-ruby' # Faster JSON gem 'ripple' $ gem install curb yajl-ruby ripple
  • 133. Rails Setup (cont.) # config/ripple.yml development: host: 127.0.0.1 port: 8098
  • 134. Rails Setup (cont.) # config/ripple.yml development: host: 127.0.0.1 port: 8098 # config/application.rb require 'ripple/railtie'
  • 136. Ripple Roadmap • Testing server (edge on Github)
  • 137. Ripple Roadmap • Testing server (edge on Github) • Protocol Buffers support
  • 138. Ripple Roadmap • Testing server (edge on Github) • Protocol Buffers support • Streaming MapReduce
  • 139. Ripple Roadmap • Testing server (edge on Github) • Protocol Buffers support • Streaming MapReduce • Ripple-specific built-ins
  • 140. Ripple Roadmap • Testing server (edge on Github) • Protocol Buffers support • Streaming MapReduce • Ripple-specific built-ins • Better ActionView support (form_for)
  • 143. Plug Interested in learning about support, consulting, or Enterprise features? basho
  • 144. Plug Interested in learning about support, consulting, or Enterprise features? Email info@basho.com or go to http://www.basho.com/ contact.html to talk with us. basho
  • 145. Plug Interested in learning about support, consulting, or Enterprise features? Email info@basho.com or go to http://www.basho.com/ contact.html to talk with us. basho
  • 146. Plug Interested in learning about support, consulting, or Enterprise features? Email info@basho.com or go to http://www.basho.com/ contact.html to talk with us. www.basho.com sean@basho.com @seancribbs basho

Editor's Notes