SlideShare a Scribd company logo
Gofer
   A scalable stateless proxy for DBI




Tim.Bunce@pobox.com - September 2008
DBI Layer Cake
Application
    DBI
 DBD::Foo
Database API



                 Database
New Layers
 Application          Gofer Transport

     DBI                    DBI
 DBD::Gofer               DBD::Foo
Gofer Transport       Database API



                          Database
Gofer gives you...
                               Few
        Application         round-trips           Gofer Transport

              DBI                                        DBI
        DBD::Gofer                                   DBD::Foo
       Gofer Transport
                             Stateless
                             protocol                           Server-side
                                               Database DBD      caching
Client-side                                     only needed
 caching                                         on server
                              Pluggable
   Retry on     Configure     transports        Flexible and easy to extend
    error        via DSN   ssh, http, etc...         e.g. DBIx::Router
DBD::Proxy vs DBD::Gofer
                              DBD::Proxy   DBD::Gofer
  Supports transactions           ✓         ✗(not yet)
Supports very large results       ✓        ✗(memory)
      Large test suite            ✗             ✓
   Minimal round-trips            ✗             ✓
 Automatic retry on error         ✗             ✓
Modular & Pluggable classes       ✗             ✓
    Tunable via Policies          ✗             ✓
         Scalable                 ✗             ✓
   Connection pooling             ✗             ✓
    Client-side caching           ✗             ✓
    Server-side caching           ✗             ✓
Gofer, logically
•   Gofer is
    - A scalable stateless proxy architecture for DBI
    - Transport independent
    - Highly configurable on client and server side
    - Efficient, in CPU time and minimal round-trips
    - Well tested
    - Scalable
    - Cacheable
    - Simple and reliable
Gofer, structurally
•   Gofer is
    - A simple stateless request/response protocol
    - A DBI proxy driver: DBD::Gofer
    - A request executor module
    - A set of pluggable transport modules
    - An extensible client configuration mechanism


•   Development sponsored by Shopzilla.com
Gofer Protocol
•   DBI::Gofer::Request & DBI::Gofer::Response
•   Simple blessed hashes
    - Request contains all required information to
      connect and execute the requested methods.
    - Response contains results from methods calls,
      including result sets (rows of data).
•   Serialized and transported by transport
    modules like DBI::Gofer::Transport::http
Using DBD::Gofer
•   Via DSN
    - By adding a prefix
    $dsn = “dbi:Driver:dbname”;
    $dsn = “dbi:Gofer:transport=foo;dsn=$dsn”;


•   Via DBI_AUTOPROXY environment variable
    - Automatically applies to all DBI connect calls
    $ export DBI_AUTOPROXY=“dbi:Gofer:transport=foo”;
    - No code changes required!
Gofer Transports
•   DBI::Gofer::Transport::null
    - The ‘null’ transport.
    - Serializes request object,
      transports it nowhere,
      then deserializes and passes it to
      DBI::Gofer::Execute to execute
    - Serializes response object,
      transports it nowhere,
      then deserializes and returns it to caller
  - Very useful for testing.
DBI_AUTOPROXY=“dbi:Gofer:transport=null”
Gofer Transports
•   DBD::Gofer::Transport::stream (ssh)
    - Can ssh to remote system to self-start server
       ssh -xq user@host.domain 
       perl -MDBI::Gofer::Transport::stream 
       -e run_stdio_hex
  - Automatically reconnects if required
  - ssh gives you security and optional compression
DBI_AUTOPROXY=’dbi:Gofer:transport=stream
;url=ssh:user@host.domain’
Gofer Transports
•   DBD::Gofer::Transport::http
    - Sends requests as http POST requests
    - Server typically Apache mod_perl running
      DBI::Gofer::Transport::http
    - Very flexible server-side configuration options
    - Can use https for security
    - Can use web techniques for scaling and high-
      availability. Will support web caching.
DBI_AUTOPROXY=’dbi:Gofer:transport=http
;url=http://example.com/gofer’
Gofer Transports
•   DBD::Gofer::Transport::gearman
    - Distributes requests to a pool of workers
    - Gearman a lightweight distributed job queue
      http://www.danga.com/gearman
    - Gearman is implemented by the same people who
      wrote memcached, perlbal, mogileFS, & DJabberd


DBI_AUTOPROXY=’dbi:Gofer:transport=gearman
;url=http://example.com/gofer’
Pooling via gearman vs http
• I haven’t compared them in use myself yet
+ Gearman may have lower latency
+ Gearman spreads load over multiple machines
  without need for load-balancer
+ Gearman coalescing may be beneficial
+ Gearman async client may work well with POE
- Gearman clients need to be told about servers
• More gearman info http://danga.com/words/
  2007_04_linuxfest_nw/linuxfest.pdf (p61+)
DBD::Gofer
• A proxy driver
• Aims to be as ‘transparent’ as possible
• Accumulates details of DBI method calls
• Delays forwarding request for as long as
  possible
• execute_array() is a single round-trip
• Policy mechanism allows fine-grained tuning
  to trade transparency for speed
DBD::Gofer::Policy::*
•   Three policies supplied: pedantic, classic, and
    rush. Classic is the default.
•   Policies are implemented as classes
•   Currently 22 individual items within a policy
•   Policy items can be dynamic methods
•   Policy is selected via DSN:
DBI_AUTOPROXY=“dbi:Gofer:transport=null
;policy=pedantic”
Round-trips per Policy
                             pedantic classic       rush
$dbh = DBI->connect_cached   connect()     ✓
$dbh->ping                      ✓
                                          if not     if not
$dbh->quote                     ✓        default    default

$sth = $dbh->prepare            ✓
$sth->execute                   ✓          ✓          ✓
$sth->{NUM_OF_FIELDS}
$sth->fetchrow_array
                                                    cached
$dbh->tables                    ✓          ✓       after first
Error Handling
•   DBD::Gofer can automatically retry on failure
DBI_AUTOPROXY=“dbi:Gofer:transport=...;
retry_limit=3”
•   Default behaviour is to retry if
     $request->is_idemponent is true
    - looks at SQL, returns true for most SELECTs
•   Default is retry_limit=0, so disabled
•   You can define your own behaviour:
    DBI->connect(..., {
        go_retry_hook => sub { ... },
    });
Client-side Caching
•   DBD::Gofer can automatically cache results
DBI_AUTOPROXY=“dbi:Gofer:transport=null
;cache=CacheModuleName”
•   Default behaviour is to cache if
     $request->is_idemponent is true
      looks at SQL returns true for most SELECTs
•   Use any cache module with standard interface
      set($k,$v) and get($k)
•   You can define your own behaviour by
    subclassing
Server-side Caching
•   DBI::Gofer::Transport::* can automatically
    cache results
•   Use any cache module with standard interface
    - set($k,$v) and get($k)
•   You can define your own behaviour by
    subclassing
Gofer Caveats
•   Adds latency time cost per network round-trip
    - Can minimize round-trips by fine-tuning a policy
    - and/or using client-side caching
•   State-less-ness has implications...
    - No transactions, AutoCommit only, at the moment.
    - Can’t alter $dbh attributes after connect
    - Can’t use temp tables, locks, and other per-connection
      persistent state, except within a stored procedure
    - Code using last_insert_id needs a (simple) change
    - See the docs for a few other very obscure caveats
An Example
Using Gofer for Connection Pooling,
   Scaling, and High Availability
The Problem
    Apache
               40 worker processes per server
     Worker
     Worker
     Worker
     Worker
     Worker
                                  +vers
     Worker
     Worker
     Worker
     Worker
     Worker
                            150 ser
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker                                         Database
     Worker
     Worker                                          Server
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker

                             =
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Workers                1 overloaded database
-
A Solution
                        A ‘database proxy’ that
    Apache
     Worker
                        does connection pooling
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker                                             Database
     Worker
     Worker                                              Server
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
                                  Holds a few
     Worker
     Worker
     Worker
     Worker                    connections open
     Worker
     Worker
     Worker
     Worker
     Worker
     Workers
                                                    Repeat for all servers
-              Uses them to ser vice DBI requests
An Implementation
                 Standard apache+mod_perl
    Apache
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker                                   DBI + DBD::*
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
                           Apache

     Worker                                                  Database
     Worker
     Worker                                                   Server
     Worker
     Worker
     Worker                         !"#$%#&
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker
     Worker                    DBI::Gofer::Execute and
     Worker
     Worker
     Worker
     Worker                  DBI::Gofer::Transport::http
     Workers
                          modules implement stateless proxy

-       DBD::Gofer with http transport
Load Balance and Cache
                                                                                                                Load balancing
 server                                                                                                         and fail-over




                                                                Apache running DBI Gofer
  with
   40
workers
                                                                                                                         Far fewer db

                                 HTTP Load Balancer and Cache
                                                                                                                         connections
                                                                                           Workers



   x          Many = 6000 db
  150         web                                                                                    Gofer          Database
                   connections
              servers                                                                                Servers         Server
servers


                                                                Apache running DBI Gofer




                                                                                           Workers


                                                                                                               Caching
   -                                          New middle tier
          Caching
Gofer’s Future
•   Caching for http transport
•   Optional JSON serialization
•   Caching in DBD::Gofer (now done)
•   Make state-less-ness of transport optional
    to support transactions
•   Patches welcome!
Future: http caching
• Potential big win
• DBD::Gofer needs to indicate cache-ability
 - via appropriate http headers
• Server side needs to agree
 - and respond with appropriate http headers
• Caching then happens just like for web pages
 - if there’s a web cache between client and server
• Patches welcome!
Future: JSON
• Turns DBI into a web service!
 - Service Oriented Architecture anyone?
• Accessible to anything that can talk JSON
• Clients could be JavaScript, Java, ...
 - and various languages that begin with P ...
• Patches welcome!
Future: Transactions
• State-less-ness could be made optional
 - If transport layer being used agrees
 - Easiest to implement for stream / ssh
• Would be enabled by
    AutoCommit => 0
    $dbh->begin_work
• Patches welcome!
Questions?

More Related Content

What's hot

Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Tim Bunce
 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011CodeIgniter Conference
 
Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011
Tim Bunce
 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message Queue
Gleicon Moraes
 
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::ClientBuilding Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Mike Friedman
 
On UnQLite
On UnQLiteOn UnQLite
On UnQLite
charsbar
 
Fluentd unified logging layer
Fluentd   unified logging layerFluentd   unified logging layer
Fluentd unified logging layer
Kiyoto Tamura
 
Programming Hive Reading #4
Programming Hive Reading #4Programming Hive Reading #4
Programming Hive Reading #4moai kids
 
Using ngx_lua in UPYUN
Using ngx_lua in UPYUNUsing ngx_lua in UPYUN
Using ngx_lua in UPYUN
Cong Zhang
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in Perl
Laurent Dami
 
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaRoll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and Lua
Jon Moore
 
Tuning Solr for Logs
Tuning Solr for LogsTuning Solr for Logs
Tuning Solr for Logs
Sematext Group, Inc.
 
Devinsampa nginx-scripting
Devinsampa nginx-scriptingDevinsampa nginx-scripting
Devinsampa nginx-scriptingTony Fabeen
 
Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)
Felix Geisendörfer
 
Top Node.js Metrics to Watch
Top Node.js Metrics to WatchTop Node.js Metrics to Watch
Top Node.js Metrics to Watch
Sematext Group, Inc.
 
Node.js streaming csv downloads proxy
Node.js streaming csv downloads proxyNode.js streaming csv downloads proxy
Node.js streaming csv downloads proxy
Ismael Celis
 
Lua tech talk
Lua tech talkLua tech talk
Lua tech talk
Locaweb
 
Hadoop 20111117
Hadoop 20111117Hadoop 20111117
Hadoop 20111117exsuns
 
Using Node.js to Build Great Streaming Services - HTML5 Dev Conf
Using Node.js to  Build Great  Streaming Services - HTML5 Dev ConfUsing Node.js to  Build Great  Streaming Services - HTML5 Dev Conf
Using Node.js to Build Great Streaming Services - HTML5 Dev ConfTom Croucher
 

What's hot (20)

Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011
 
Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011
 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message Queue
 
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::ClientBuilding Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::Client
 
On UnQLite
On UnQLiteOn UnQLite
On UnQLite
 
Fluentd unified logging layer
Fluentd   unified logging layerFluentd   unified logging layer
Fluentd unified logging layer
 
Programming Hive Reading #4
Programming Hive Reading #4Programming Hive Reading #4
Programming Hive Reading #4
 
Using ngx_lua in UPYUN
Using ngx_lua in UPYUNUsing ngx_lua in UPYUN
Using ngx_lua in UPYUN
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in Perl
 
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaRoll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and Lua
 
Tuning Solr for Logs
Tuning Solr for LogsTuning Solr for Logs
Tuning Solr for Logs
 
Devinsampa nginx-scripting
Devinsampa nginx-scriptingDevinsampa nginx-scripting
Devinsampa nginx-scripting
 
Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)
 
Top Node.js Metrics to Watch
Top Node.js Metrics to WatchTop Node.js Metrics to Watch
Top Node.js Metrics to Watch
 
Fluentd meetup at Slideshare
Fluentd meetup at SlideshareFluentd meetup at Slideshare
Fluentd meetup at Slideshare
 
Node.js streaming csv downloads proxy
Node.js streaming csv downloads proxyNode.js streaming csv downloads proxy
Node.js streaming csv downloads proxy
 
Lua tech talk
Lua tech talkLua tech talk
Lua tech talk
 
Hadoop 20111117
Hadoop 20111117Hadoop 20111117
Hadoop 20111117
 
Using Node.js to Build Great Streaming Services - HTML5 Dev Conf
Using Node.js to  Build Great  Streaming Services - HTML5 Dev ConfUsing Node.js to  Build Great  Streaming Services - HTML5 Dev Conf
Using Node.js to Build Great Streaming Services - HTML5 Dev Conf
 

Similar to DBD::Gofer 200809

Gofer 200707
Gofer 200707Gofer 200707
Gofer 200707oscon2007
 
Embulk, an open-source plugin-based parallel bulk data loader
Embulk, an open-source plugin-based parallel bulk data loaderEmbulk, an open-source plugin-based parallel bulk data loader
Embulk, an open-source plugin-based parallel bulk data loader
Sadayuki Furuhashi
 
JClouds at San Francisco Java User Group
JClouds at San Francisco Java User GroupJClouds at San Francisco Java User Group
JClouds at San Francisco Java User GroupMarakana Inc.
 
CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009
Jason Davies
 
October 2013 HUG: Oozie 4.x
October 2013 HUG: Oozie 4.xOctober 2013 HUG: Oozie 4.x
October 2013 HUG: Oozie 4.x
Yahoo Developer Network
 
Golang @ Tokopedia
Golang @ TokopediaGolang @ Tokopedia
Golang @ Tokopedia
Qasim Zaidi
 
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
delagoya
 
Oozie sweet
Oozie sweetOozie sweet
Oozie sweet
mislam77
 
Cassandra and Docker Lessons Learned
Cassandra and Docker Lessons LearnedCassandra and Docker Lessons Learned
Cassandra and Docker Lessons Learned
DataStax Academy
 
Scaling PHP apps
Scaling PHP appsScaling PHP apps
Scaling PHP apps
Matteo Moretti
 
Cloud Best Practices
Cloud Best PracticesCloud Best Practices
Cloud Best PracticesEric Bottard
 
Get your teeth into Plack
Get your teeth into PlackGet your teeth into Plack
Get your teeth into Plack
Workhorse Computing
 
Going Serverless on AWS with Golang and SAM
Going Serverless on AWS with Golang and SAMGoing Serverless on AWS with Golang and SAM
Going Serverless on AWS with Golang and SAM
George Tourkas
 
Web Optimization Level: Paranoid
Web Optimization Level: ParanoidWeb Optimization Level: Paranoid
Web Optimization Level: Paranoid
robin_sy
 
Creating PostgreSQL-as-a-Service at Scale
Creating PostgreSQL-as-a-Service at ScaleCreating PostgreSQL-as-a-Service at Scale
Creating PostgreSQL-as-a-Service at Scale
Sean Chittenden
 
How to ensure Presto scalability 
in multi use case
How to ensure Presto scalability 
in multi use case How to ensure Presto scalability 
in multi use case
How to ensure Presto scalability 
in multi use case
Kai Sasaki
 
High Performance Drupal
High Performance DrupalHigh Performance Drupal
High Performance Drupal
Jeff Geerling
 
SQL Saturday San Diego
SQL Saturday San DiegoSQL Saturday San Diego
SQL Saturday San Diego
Kellyn Pot'Vin-Gorman
 
MongoDB
MongoDBMongoDB
MongoDB
fsbrooke
 

Similar to DBD::Gofer 200809 (20)

Os Bunce
Os BunceOs Bunce
Os Bunce
 
Gofer 200707
Gofer 200707Gofer 200707
Gofer 200707
 
Embulk, an open-source plugin-based parallel bulk data loader
Embulk, an open-source plugin-based parallel bulk data loaderEmbulk, an open-source plugin-based parallel bulk data loader
Embulk, an open-source plugin-based parallel bulk data loader
 
JClouds at San Francisco Java User Group
JClouds at San Francisco Java User GroupJClouds at San Francisco Java User Group
JClouds at San Francisco Java User Group
 
CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009
 
October 2013 HUG: Oozie 4.x
October 2013 HUG: Oozie 4.xOctober 2013 HUG: Oozie 4.x
October 2013 HUG: Oozie 4.x
 
Golang @ Tokopedia
Golang @ TokopediaGolang @ Tokopedia
Golang @ Tokopedia
 
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
 
Oozie sweet
Oozie sweetOozie sweet
Oozie sweet
 
Cassandra and Docker Lessons Learned
Cassandra and Docker Lessons LearnedCassandra and Docker Lessons Learned
Cassandra and Docker Lessons Learned
 
Scaling PHP apps
Scaling PHP appsScaling PHP apps
Scaling PHP apps
 
Cloud Best Practices
Cloud Best PracticesCloud Best Practices
Cloud Best Practices
 
Get your teeth into Plack
Get your teeth into PlackGet your teeth into Plack
Get your teeth into Plack
 
Going Serverless on AWS with Golang and SAM
Going Serverless on AWS with Golang and SAMGoing Serverless on AWS with Golang and SAM
Going Serverless on AWS with Golang and SAM
 
Web Optimization Level: Paranoid
Web Optimization Level: ParanoidWeb Optimization Level: Paranoid
Web Optimization Level: Paranoid
 
Creating PostgreSQL-as-a-Service at Scale
Creating PostgreSQL-as-a-Service at ScaleCreating PostgreSQL-as-a-Service at Scale
Creating PostgreSQL-as-a-Service at Scale
 
How to ensure Presto scalability 
in multi use case
How to ensure Presto scalability 
in multi use case How to ensure Presto scalability 
in multi use case
How to ensure Presto scalability 
in multi use case
 
High Performance Drupal
High Performance DrupalHigh Performance Drupal
High Performance Drupal
 
SQL Saturday San Diego
SQL Saturday San DiegoSQL Saturday San Diego
SQL Saturday San Diego
 
MongoDB
MongoDBMongoDB
MongoDB
 

More from Tim Bunce

Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008
Tim Bunce
 
Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)
Tim Bunce
 
DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007
Tim Bunce
 
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Tim Bunce
 
Perl Myths 200909
Perl Myths 200909Perl Myths 200909
Perl Myths 200909
Tim Bunce
 
DashProfiler 200807
DashProfiler 200807DashProfiler 200807
DashProfiler 200807
Tim Bunce
 
DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007
Tim Bunce
 
Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)
Tim Bunce
 

More from Tim Bunce (8)

Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008
 
Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)
 
DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007
 
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
 
Perl Myths 200909
Perl Myths 200909Perl Myths 200909
Perl Myths 200909
 
DashProfiler 200807
DashProfiler 200807DashProfiler 200807
DashProfiler 200807
 
DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007
 
Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)
 

Recently uploaded

12 Conversion Rate Optimization Strategies for Ecommerce Websites.pdf
12 Conversion Rate Optimization Strategies for Ecommerce Websites.pdf12 Conversion Rate Optimization Strategies for Ecommerce Websites.pdf
12 Conversion Rate Optimization Strategies for Ecommerce Websites.pdf
SOFTTECHHUB
 
Premium MEAN Stack Development Solutions for Modern Businesses
Premium MEAN Stack Development Solutions for Modern BusinessesPremium MEAN Stack Development Solutions for Modern Businesses
Premium MEAN Stack Development Solutions for Modern Businesses
SynapseIndia
 
Affordable Stationery Printing Services in Jaipur | Navpack n Print
Affordable Stationery Printing Services in Jaipur | Navpack n PrintAffordable Stationery Printing Services in Jaipur | Navpack n Print
Affordable Stationery Printing Services in Jaipur | Navpack n Print
Navpack & Print
 
Business Valuation Principles for Entrepreneurs
Business Valuation Principles for EntrepreneursBusiness Valuation Principles for Entrepreneurs
Business Valuation Principles for Entrepreneurs
Ben Wann
 
Introduction to Amazon company 111111111111
Introduction to Amazon company 111111111111Introduction to Amazon company 111111111111
Introduction to Amazon company 111111111111
zoyaansari11365
 
Team-Spandex-Northern University-CS1035.
Team-Spandex-Northern University-CS1035.Team-Spandex-Northern University-CS1035.
Team-Spandex-Northern University-CS1035.
smalmahmud11
 
20240425_ TJ Communications Credentials_compressed.pdf
20240425_ TJ Communications Credentials_compressed.pdf20240425_ TJ Communications Credentials_compressed.pdf
20240425_ TJ Communications Credentials_compressed.pdf
tjcomstrang
 
Cree_Rey_BrandIdentityKit.PDF_PersonalBd
Cree_Rey_BrandIdentityKit.PDF_PersonalBdCree_Rey_BrandIdentityKit.PDF_PersonalBd
Cree_Rey_BrandIdentityKit.PDF_PersonalBd
creerey
 
Matt Conway - Attorney - A Knowledgeable Professional - Kentucky.pdf
Matt Conway - Attorney - A Knowledgeable Professional - Kentucky.pdfMatt Conway - Attorney - A Knowledgeable Professional - Kentucky.pdf
Matt Conway - Attorney - A Knowledgeable Professional - Kentucky.pdf
Matt Conway - Attorney
 
5 Things You Need To Know Before Hiring a Videographer
5 Things You Need To Know Before Hiring a Videographer5 Things You Need To Know Before Hiring a Videographer
5 Things You Need To Know Before Hiring a Videographer
ofm712785
 
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptxTaurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
my Pandit
 
Lars Winkelbauer — Sustainable Development in the Era of Air Cargo Technology
Lars Winkelbauer — Sustainable Development in the Era of Air Cargo TechnologyLars Winkelbauer — Sustainable Development in the Era of Air Cargo Technology
Lars Winkelbauer — Sustainable Development in the Era of Air Cargo Technology
larswinkelbauer23
 
IPTV Subscription UK: Your Guide to Choosing the Best Service
IPTV Subscription UK: Your Guide to Choosing the Best ServiceIPTV Subscription UK: Your Guide to Choosing the Best Service
IPTV Subscription UK: Your Guide to Choosing the Best Service
Dragon Dream Bar
 
chapter 10 - excise tax of transfer and business taxation
chapter 10 - excise tax of transfer and business taxationchapter 10 - excise tax of transfer and business taxation
chapter 10 - excise tax of transfer and business taxation
AUDIJEAngelo
 
PETAVIT SIP-01.pdfAAAAAAAAAAAAAAAAAAAAAAAAAAA
PETAVIT SIP-01.pdfAAAAAAAAAAAAAAAAAAAAAAAAAAAPETAVIT SIP-01.pdfAAAAAAAAAAAAAAAAAAAAAAAAAAA
PETAVIT SIP-01.pdfAAAAAAAAAAAAAAAAAAAAAAAAAAA
lawrenceads01
 
Filing Your Delaware Franchise Tax A Detailed Guide
Filing Your Delaware Franchise Tax A Detailed GuideFiling Your Delaware Franchise Tax A Detailed Guide
Filing Your Delaware Franchise Tax A Detailed Guide
YourLegal Accounting
 
Maksym Vyshnivetskyi: PMO Quality Management (UA)
Maksym Vyshnivetskyi: PMO Quality Management (UA)Maksym Vyshnivetskyi: PMO Quality Management (UA)
Maksym Vyshnivetskyi: PMO Quality Management (UA)
Lviv Startup Club
 
RMD24 | Debunking the non-endemic revenue myth Marvin Vacquier Droop | First ...
RMD24 | Debunking the non-endemic revenue myth Marvin Vacquier Droop | First ...RMD24 | Debunking the non-endemic revenue myth Marvin Vacquier Droop | First ...
RMD24 | Debunking the non-endemic revenue myth Marvin Vacquier Droop | First ...
BBPMedia1
 
Commercial RO Plant Manufacturer In Noida.pdf
Commercial RO Plant Manufacturer In Noida.pdfCommercial RO Plant Manufacturer In Noida.pdf
Commercial RO Plant Manufacturer In Noida.pdf
Industrialroplant, Commercialroplant
 
FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134
LR1709MUSIC
 

Recently uploaded (20)

12 Conversion Rate Optimization Strategies for Ecommerce Websites.pdf
12 Conversion Rate Optimization Strategies for Ecommerce Websites.pdf12 Conversion Rate Optimization Strategies for Ecommerce Websites.pdf
12 Conversion Rate Optimization Strategies for Ecommerce Websites.pdf
 
Premium MEAN Stack Development Solutions for Modern Businesses
Premium MEAN Stack Development Solutions for Modern BusinessesPremium MEAN Stack Development Solutions for Modern Businesses
Premium MEAN Stack Development Solutions for Modern Businesses
 
Affordable Stationery Printing Services in Jaipur | Navpack n Print
Affordable Stationery Printing Services in Jaipur | Navpack n PrintAffordable Stationery Printing Services in Jaipur | Navpack n Print
Affordable Stationery Printing Services in Jaipur | Navpack n Print
 
Business Valuation Principles for Entrepreneurs
Business Valuation Principles for EntrepreneursBusiness Valuation Principles for Entrepreneurs
Business Valuation Principles for Entrepreneurs
 
Introduction to Amazon company 111111111111
Introduction to Amazon company 111111111111Introduction to Amazon company 111111111111
Introduction to Amazon company 111111111111
 
Team-Spandex-Northern University-CS1035.
Team-Spandex-Northern University-CS1035.Team-Spandex-Northern University-CS1035.
Team-Spandex-Northern University-CS1035.
 
20240425_ TJ Communications Credentials_compressed.pdf
20240425_ TJ Communications Credentials_compressed.pdf20240425_ TJ Communications Credentials_compressed.pdf
20240425_ TJ Communications Credentials_compressed.pdf
 
Cree_Rey_BrandIdentityKit.PDF_PersonalBd
Cree_Rey_BrandIdentityKit.PDF_PersonalBdCree_Rey_BrandIdentityKit.PDF_PersonalBd
Cree_Rey_BrandIdentityKit.PDF_PersonalBd
 
Matt Conway - Attorney - A Knowledgeable Professional - Kentucky.pdf
Matt Conway - Attorney - A Knowledgeable Professional - Kentucky.pdfMatt Conway - Attorney - A Knowledgeable Professional - Kentucky.pdf
Matt Conway - Attorney - A Knowledgeable Professional - Kentucky.pdf
 
5 Things You Need To Know Before Hiring a Videographer
5 Things You Need To Know Before Hiring a Videographer5 Things You Need To Know Before Hiring a Videographer
5 Things You Need To Know Before Hiring a Videographer
 
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptxTaurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
 
Lars Winkelbauer — Sustainable Development in the Era of Air Cargo Technology
Lars Winkelbauer — Sustainable Development in the Era of Air Cargo TechnologyLars Winkelbauer — Sustainable Development in the Era of Air Cargo Technology
Lars Winkelbauer — Sustainable Development in the Era of Air Cargo Technology
 
IPTV Subscription UK: Your Guide to Choosing the Best Service
IPTV Subscription UK: Your Guide to Choosing the Best ServiceIPTV Subscription UK: Your Guide to Choosing the Best Service
IPTV Subscription UK: Your Guide to Choosing the Best Service
 
chapter 10 - excise tax of transfer and business taxation
chapter 10 - excise tax of transfer and business taxationchapter 10 - excise tax of transfer and business taxation
chapter 10 - excise tax of transfer and business taxation
 
PETAVIT SIP-01.pdfAAAAAAAAAAAAAAAAAAAAAAAAAAA
PETAVIT SIP-01.pdfAAAAAAAAAAAAAAAAAAAAAAAAAAAPETAVIT SIP-01.pdfAAAAAAAAAAAAAAAAAAAAAAAAAAA
PETAVIT SIP-01.pdfAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
Filing Your Delaware Franchise Tax A Detailed Guide
Filing Your Delaware Franchise Tax A Detailed GuideFiling Your Delaware Franchise Tax A Detailed Guide
Filing Your Delaware Franchise Tax A Detailed Guide
 
Maksym Vyshnivetskyi: PMO Quality Management (UA)
Maksym Vyshnivetskyi: PMO Quality Management (UA)Maksym Vyshnivetskyi: PMO Quality Management (UA)
Maksym Vyshnivetskyi: PMO Quality Management (UA)
 
RMD24 | Debunking the non-endemic revenue myth Marvin Vacquier Droop | First ...
RMD24 | Debunking the non-endemic revenue myth Marvin Vacquier Droop | First ...RMD24 | Debunking the non-endemic revenue myth Marvin Vacquier Droop | First ...
RMD24 | Debunking the non-endemic revenue myth Marvin Vacquier Droop | First ...
 
Commercial RO Plant Manufacturer In Noida.pdf
Commercial RO Plant Manufacturer In Noida.pdfCommercial RO Plant Manufacturer In Noida.pdf
Commercial RO Plant Manufacturer In Noida.pdf
 
FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134
 

DBD::Gofer 200809

  • 1. Gofer A scalable stateless proxy for DBI Tim.Bunce@pobox.com - September 2008
  • 2. DBI Layer Cake Application DBI DBD::Foo Database API Database
  • 3. New Layers Application Gofer Transport DBI DBI DBD::Gofer DBD::Foo Gofer Transport Database API Database
  • 4. Gofer gives you... Few Application round-trips Gofer Transport DBI DBI DBD::Gofer DBD::Foo Gofer Transport Stateless protocol Server-side Database DBD caching Client-side only needed caching on server Pluggable Retry on Configure transports Flexible and easy to extend error via DSN ssh, http, etc... e.g. DBIx::Router
  • 5. DBD::Proxy vs DBD::Gofer DBD::Proxy DBD::Gofer Supports transactions ✓ ✗(not yet) Supports very large results ✓ ✗(memory) Large test suite ✗ ✓ Minimal round-trips ✗ ✓ Automatic retry on error ✗ ✓ Modular & Pluggable classes ✗ ✓ Tunable via Policies ✗ ✓ Scalable ✗ ✓ Connection pooling ✗ ✓ Client-side caching ✗ ✓ Server-side caching ✗ ✓
  • 6. Gofer, logically • Gofer is - A scalable stateless proxy architecture for DBI - Transport independent - Highly configurable on client and server side - Efficient, in CPU time and minimal round-trips - Well tested - Scalable - Cacheable - Simple and reliable
  • 7. Gofer, structurally • Gofer is - A simple stateless request/response protocol - A DBI proxy driver: DBD::Gofer - A request executor module - A set of pluggable transport modules - An extensible client configuration mechanism • Development sponsored by Shopzilla.com
  • 8. Gofer Protocol • DBI::Gofer::Request & DBI::Gofer::Response • Simple blessed hashes - Request contains all required information to connect and execute the requested methods. - Response contains results from methods calls, including result sets (rows of data). • Serialized and transported by transport modules like DBI::Gofer::Transport::http
  • 9. Using DBD::Gofer • Via DSN - By adding a prefix $dsn = “dbi:Driver:dbname”; $dsn = “dbi:Gofer:transport=foo;dsn=$dsn”; • Via DBI_AUTOPROXY environment variable - Automatically applies to all DBI connect calls $ export DBI_AUTOPROXY=“dbi:Gofer:transport=foo”; - No code changes required!
  • 10. Gofer Transports • DBI::Gofer::Transport::null - The ‘null’ transport. - Serializes request object, transports it nowhere, then deserializes and passes it to DBI::Gofer::Execute to execute - Serializes response object, transports it nowhere, then deserializes and returns it to caller - Very useful for testing. DBI_AUTOPROXY=“dbi:Gofer:transport=null”
  • 11. Gofer Transports • DBD::Gofer::Transport::stream (ssh) - Can ssh to remote system to self-start server ssh -xq user@host.domain perl -MDBI::Gofer::Transport::stream -e run_stdio_hex - Automatically reconnects if required - ssh gives you security and optional compression DBI_AUTOPROXY=’dbi:Gofer:transport=stream ;url=ssh:user@host.domain’
  • 12. Gofer Transports • DBD::Gofer::Transport::http - Sends requests as http POST requests - Server typically Apache mod_perl running DBI::Gofer::Transport::http - Very flexible server-side configuration options - Can use https for security - Can use web techniques for scaling and high- availability. Will support web caching. DBI_AUTOPROXY=’dbi:Gofer:transport=http ;url=http://example.com/gofer’
  • 13. Gofer Transports • DBD::Gofer::Transport::gearman - Distributes requests to a pool of workers - Gearman a lightweight distributed job queue http://www.danga.com/gearman - Gearman is implemented by the same people who wrote memcached, perlbal, mogileFS, & DJabberd DBI_AUTOPROXY=’dbi:Gofer:transport=gearman ;url=http://example.com/gofer’
  • 14. Pooling via gearman vs http • I haven’t compared them in use myself yet + Gearman may have lower latency + Gearman spreads load over multiple machines without need for load-balancer + Gearman coalescing may be beneficial + Gearman async client may work well with POE - Gearman clients need to be told about servers • More gearman info http://danga.com/words/ 2007_04_linuxfest_nw/linuxfest.pdf (p61+)
  • 15. DBD::Gofer • A proxy driver • Aims to be as ‘transparent’ as possible • Accumulates details of DBI method calls • Delays forwarding request for as long as possible • execute_array() is a single round-trip • Policy mechanism allows fine-grained tuning to trade transparency for speed
  • 16. DBD::Gofer::Policy::* • Three policies supplied: pedantic, classic, and rush. Classic is the default. • Policies are implemented as classes • Currently 22 individual items within a policy • Policy items can be dynamic methods • Policy is selected via DSN: DBI_AUTOPROXY=“dbi:Gofer:transport=null ;policy=pedantic”
  • 17. Round-trips per Policy pedantic classic rush $dbh = DBI->connect_cached connect() ✓ $dbh->ping ✓ if not if not $dbh->quote ✓ default default $sth = $dbh->prepare ✓ $sth->execute ✓ ✓ ✓ $sth->{NUM_OF_FIELDS} $sth->fetchrow_array cached $dbh->tables ✓ ✓ after first
  • 18. Error Handling • DBD::Gofer can automatically retry on failure DBI_AUTOPROXY=“dbi:Gofer:transport=...; retry_limit=3” • Default behaviour is to retry if $request->is_idemponent is true - looks at SQL, returns true for most SELECTs • Default is retry_limit=0, so disabled • You can define your own behaviour: DBI->connect(..., { go_retry_hook => sub { ... }, });
  • 19. Client-side Caching • DBD::Gofer can automatically cache results DBI_AUTOPROXY=“dbi:Gofer:transport=null ;cache=CacheModuleName” • Default behaviour is to cache if $request->is_idemponent is true looks at SQL returns true for most SELECTs • Use any cache module with standard interface set($k,$v) and get($k) • You can define your own behaviour by subclassing
  • 20. Server-side Caching • DBI::Gofer::Transport::* can automatically cache results • Use any cache module with standard interface - set($k,$v) and get($k) • You can define your own behaviour by subclassing
  • 21. Gofer Caveats • Adds latency time cost per network round-trip - Can minimize round-trips by fine-tuning a policy - and/or using client-side caching • State-less-ness has implications... - No transactions, AutoCommit only, at the moment. - Can’t alter $dbh attributes after connect - Can’t use temp tables, locks, and other per-connection persistent state, except within a stored procedure - Code using last_insert_id needs a (simple) change - See the docs for a few other very obscure caveats
  • 22. An Example Using Gofer for Connection Pooling, Scaling, and High Availability
  • 23. The Problem Apache 40 worker processes per server Worker Worker Worker Worker Worker +vers Worker Worker Worker Worker Worker 150 ser Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Database Worker Worker Server Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker = Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Workers 1 overloaded database -
  • 24. A Solution A ‘database proxy’ that Apache Worker does connection pooling Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Database Worker Worker Server Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Holds a few Worker Worker Worker Worker connections open Worker Worker Worker Worker Worker Workers Repeat for all servers - Uses them to ser vice DBI requests
  • 25. An Implementation Standard apache+mod_perl Apache Worker Worker Worker Worker Worker Worker Worker Worker Worker DBI + DBD::* Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Apache Worker Database Worker Worker Server Worker Worker Worker !"#$%#& Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker DBI::Gofer::Execute and Worker Worker Worker Worker DBI::Gofer::Transport::http Workers modules implement stateless proxy - DBD::Gofer with http transport
  • 26. Load Balance and Cache Load balancing server and fail-over Apache running DBI Gofer with 40 workers Far fewer db HTTP Load Balancer and Cache connections Workers x Many = 6000 db 150 web Gofer Database connections servers Servers Server servers Apache running DBI Gofer Workers Caching - New middle tier Caching
  • 27.
  • 28. Gofer’s Future • Caching for http transport • Optional JSON serialization • Caching in DBD::Gofer (now done) • Make state-less-ness of transport optional to support transactions • Patches welcome!
  • 29. Future: http caching • Potential big win • DBD::Gofer needs to indicate cache-ability - via appropriate http headers • Server side needs to agree - and respond with appropriate http headers • Caching then happens just like for web pages - if there’s a web cache between client and server • Patches welcome!
  • 30. Future: JSON • Turns DBI into a web service! - Service Oriented Architecture anyone? • Accessible to anything that can talk JSON • Clients could be JavaScript, Java, ... - and various languages that begin with P ... • Patches welcome!
  • 31. Future: Transactions • State-less-ness could be made optional - If transport layer being used agrees - Easiest to implement for stream / ssh • Would be enabled by AutoCommit => 0 $dbh->begin_work • Patches welcome!