SlideShare a Scribd company logo
1 of 24
Download to read offline
#geekcampsg 2009
                            CouchApps - Applications built on CouchDB


                                          Arun Thampi
                                           @iamclovin
                                          http://mclov.in



Saturday, August 22, 2009
About myself

                  •         Ruby Developer + Dabbler at Wego.com

                      •      The kick-ass travel meta-search engine

                  •         Work with great set of people


                                    @winstonyw         @reds          @mongeslani
              @chuyeow                                                              @jefflimar
                                    @phungleson     @ijuzwannatwit    @garytheis


Saturday, August 22, 2009
CouchDB FTW
                  •         Schema-less Key-Value based   •   MVCC (No Locks)
                            document store
                                                          •   Replication
                  •         Erlang
                                                          •   Scaling out of the box (HAProxy/
                  •         Speaks HTTP / REST                Nginx)

                  •         Map Reduce                    •   Full Text Search (Lucene/Sphinx)

                  •         JSON                          •   Attachments (binary files)

                  •         Social Media                  •   Web Interface (Futon)

Saturday, August 22, 2009
Profit

Saturday, August 22, 2009
CouchDB - Built for the Web
                            {
                                “_id” : “abc”,
                                “_rev” : “abc123def”,
                                “text” : “Hello World”,
                                “screen_name” : “mclovin”,
                                “timestamp” : 123232,
                                “type” : “thread”,
                                “replies”: [ “reply 1”, “reply 2”, “reply 3”]
                            }


Saturday, August 22, 2009
CouchDB - Built for the web
                              Inserting a document            HTTP PUT

                              Retrieving a document          HTTP GET

                              Deleting a document           HTTP DELETE

                              Updating a document            HTTP POST

                                     Scaling          Replication + load balancing

                                    Querying                       ?

Saturday, August 22, 2009
Saturday, August 22, 2009
Map Reduce with Javascript Views
                                     (No I wasn’t making that up)


                  Document 1                         [Key 1, Value 1]



                  Document 2   Map Function          [Key 2, Value 2]   Reduce Function




                                                     [Key k,Value k]
                  Document n                                               Value X




Saturday, August 22, 2009
Example Map Reduce
                                       Map Function



                            function(doc) {
                              if(doc.type == “customer”) {
                                emit(doc.first_name, 1);
                              }
                            }




Saturday, August 22, 2009
Example Map Reduce (contd)
                                         Reduce Function




                                function(keys, values, re) {
                                  return sum(values);
                                }




Saturday, August 22, 2009
Example Map Reduce (contd)
             {
                   ..
                   {
                            “key”: “Seth”,
                            “value”: 1
                   },
                                               reduce([“Seth”, “Fogell”], [1, 1])
                   {
                            “key”: “Fogell”,
                            “value”: 1
                   }
                   ..
             }

Saturday, August 22, 2009
CouchApps


                  •         HTTP / HTML / Javascript is the language of the web

                  •         Coincidentally, that’s what CouchDB speaks too

                  •         Why not have CouchDB apps serve apps?




Saturday, August 22, 2009
CouchApps - Why?

                  •         Barriers to entry to develop powerful data-backed applications is
                            lowered

                  •         Replication enables load-balancing + scaling

                  •         No Impedance Mismatch - Data is Javascript, your views are in
                            Javascript, your HTML pages are rendered in Javascript



Saturday, August 22, 2009
CouchApps
        •       Available at http://github.com/
                couchapp/couchapp

        •       couchapp generate icanhazthread

        •       couchapp push icanhazthread http://
                127.0.0.1:5984/icanhazthread




Saturday, August 22, 2009
CouchApps - List & Show Functions
                                                                            Schema-less
                                                                 Model
            •      A view is queried and the results are                       JSON

                   passed to a list function

            •      List Function then renders the results
                                                                            Map/Reduce
                   of your view in whatever format you         Controller
                                                                               View
                   please: HTML, JSON, XML, RSS, etc

            •      In a twisted way, its like a controller +
                   view concept in an MVC framework
                                                                 View        List/Show



Saturday, August 22, 2009
Introducing i.canhazthread.com

                  •         Inspired (in fact, cloned) from a.tinythread.com by Joshua Schacter

                  •         Backend powered by a CouchApp (http://github.com/arunthampi/
                            icanhazthread)

                  •         Uses Rails to do Twitter authentication + HTML rendering




Saturday, August 22, 2009
icanhazthread.com

                                             nginx


                                                     CouchDB API [RSS, Realtime]


                            Rails Mongrels            CouchDB




Saturday, August 22, 2009
Document Structure
                            Thread                       Reply

      {                                   {
             “_id” : “abc”,                   “_id” : “def”,
             “_rev” : “abc123def”,            “_rev” : “234abcdef”,
             “text” : “Hello World”,          “text” : “oh hai”,
             “screen_name” : “mclovin”,       “screen_name” : “snehamenon”,
             “timestamp” : 123232,            “timestamp” : 1232310,
             “type” : “thread”                “type” : “reply”,
      }                                       “thread_id” : “abc”
                                          }

Saturday, August 22, 2009
Interesting Map/Reduce problem
                                 (at least for me)

                                             •   Interesting because replies are not
                                                 contained within a thread

                                             •   Also, because threads on the
                                                 homepage need to be sorted
                                                 according to timestamp (newest
                                                 ones first)

                                             •   Views need to be commutative &
                                                 associative


Saturday, August 22, 2009
Show me the code
                                          Map Function (yawn)

                        function(doc) {
                          if(doc.type == ‘thread’) {
                            emit([doc.id, doc.time_created], doc);
                          } else if(doc.type == ‘reply’) {
                            emit([doc.thread_id, doc.time_created], doc);
                          }
                        }




Saturday, August 22, 2009
Show me the code                                 Thread        Reply         Result


                            Reduce Function
                                                                               Sorting?


                [K1, V1]         [K2,V2]                                [K1, Summary for Thread 1]


                                                                           num_replies: 2
              [K1, RV1]
                                              group_level =1            [K2, Summary for Thread 2]


              [K1, RV2]                                                    num_replies: 0

Saturday, August 22, 2009
Future Directions


                  •         Make icanhazthread real-time (Utilize the _changes API in CouchDB)

                  •         RSS Feeds (Dead simple with the CouchApp list)

                  •         etc etc




Saturday, August 22, 2009
Resources
                  •         CouchDB Wiki: http://wiki.couchdb.org

                  •         CouchDB Mailing lists (user + dev)

                  •         Blogs: Chris Anderson, Harish Mallipeddi, Jan Lenhardt

                  •         CouchDB Futon Test Suite (http://127.0.0.1:5984/_utils/
                            couch_tests.html)

                  •         Other CouchApps: Toast, Chris Anderson’s blog


Saturday, August 22, 2009
Thank you


                             Q &A



Saturday, August 22, 2009

More Related Content

Similar to GeekCamp SG 2009 - CouchApps with CouchDB

Putting rails and couch db on the cloud - Indicthreads cloud computing confe...
Putting rails and couch db on the cloud -  Indicthreads cloud computing confe...Putting rails and couch db on the cloud -  Indicthreads cloud computing confe...
Putting rails and couch db on the cloud - Indicthreads cloud computing confe...IndicThreads
 
ソーシャルアプリでの Amazon Elastic MapReduce 活用事例
ソーシャルアプリでの Amazon Elastic MapReduce 活用事例ソーシャルアプリでの Amazon Elastic MapReduce 活用事例
ソーシャルアプリでの Amazon Elastic MapReduce 活用事例Takahiro Kamatani
 
Couchdbkit djangocong-20100425
Couchdbkit djangocong-20100425Couchdbkit djangocong-20100425
Couchdbkit djangocong-20100425guest4f2eea
 
JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)jeresig
 
Meetup 2013:01: Uwe Kubosh - Ruboto - JRuby on Android
Meetup 2013:01: Uwe Kubosh - Ruboto - JRuby on AndroidMeetup 2013:01: Uwe Kubosh - Ruboto - JRuby on Android
Meetup 2013:01: Uwe Kubosh - Ruboto - JRuby on Androidgdgoslo
 
Ruboto at GDG Oslo 2013
Ruboto at GDG Oslo 2013Ruboto at GDG Oslo 2013
Ruboto at GDG Oslo 2013Uwe Kubosch
 
Social Data and Log Analysis Using MongoDB
Social Data and Log Analysis Using MongoDBSocial Data and Log Analysis Using MongoDB
Social Data and Log Analysis Using MongoDBTakahiro Inoue
 
Geo Package and OWS Context at FOSS4G PDX
Geo Package and OWS Context at FOSS4G PDXGeo Package and OWS Context at FOSS4G PDX
Geo Package and OWS Context at FOSS4G PDXLuis Bermudez
 
Cloud is such stuff as dreams are made on
Cloud is such stuff as dreams are made onCloud is such stuff as dreams are made on
Cloud is such stuff as dreams are made onPatrick Chanezon
 
Scaling webappswithrabbitmq
Scaling webappswithrabbitmqScaling webappswithrabbitmq
Scaling webappswithrabbitmqAlvaro Videla
 
CouchDB and Rails on the Cloud
CouchDB and Rails on the CloudCouchDB and Rails on the Cloud
CouchDB and Rails on the Cloudrockyjaiswal
 
Geoindexing with MongoDB
Geoindexing with MongoDBGeoindexing with MongoDB
Geoindexing with MongoDBleafnode
 
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGuillaume Laforge
 

Similar to GeekCamp SG 2009 - CouchApps with CouchDB (20)

Putting rails and couch db on the cloud - Indicthreads cloud computing confe...
Putting rails and couch db on the cloud -  Indicthreads cloud computing confe...Putting rails and couch db on the cloud -  Indicthreads cloud computing confe...
Putting rails and couch db on the cloud - Indicthreads cloud computing confe...
 
dojo.things()
dojo.things()dojo.things()
dojo.things()
 
ソーシャルアプリでの Amazon Elastic MapReduce 活用事例
ソーシャルアプリでの Amazon Elastic MapReduce 活用事例ソーシャルアプリでの Amazon Elastic MapReduce 活用事例
ソーシャルアプリでの Amazon Elastic MapReduce 活用事例
 
Couchdbkit & Dango
Couchdbkit & DangoCouchdbkit & Dango
Couchdbkit & Dango
 
Couchdbkit djangocong-20100425
Couchdbkit djangocong-20100425Couchdbkit djangocong-20100425
Couchdbkit djangocong-20100425
 
MongoDB and hadoop
MongoDB and hadoopMongoDB and hadoop
MongoDB and hadoop
 
No sql Database
No sql DatabaseNo sql Database
No sql Database
 
JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)JavaScript Library Overview (Ajax Exp West 2007)
JavaScript Library Overview (Ajax Exp West 2007)
 
Meetup 2013:01: Uwe Kubosh - Ruboto - JRuby on Android
Meetup 2013:01: Uwe Kubosh - Ruboto - JRuby on AndroidMeetup 2013:01: Uwe Kubosh - Ruboto - JRuby on Android
Meetup 2013:01: Uwe Kubosh - Ruboto - JRuby on Android
 
Ruboto at GDG Oslo 2013
Ruboto at GDG Oslo 2013Ruboto at GDG Oslo 2013
Ruboto at GDG Oslo 2013
 
Aleact
AleactAleact
Aleact
 
Social Data and Log Analysis Using MongoDB
Social Data and Log Analysis Using MongoDBSocial Data and Log Analysis Using MongoDB
Social Data and Log Analysis Using MongoDB
 
Processing
ProcessingProcessing
Processing
 
Geo Package and OWS Context at FOSS4G PDX
Geo Package and OWS Context at FOSS4G PDXGeo Package and OWS Context at FOSS4G PDX
Geo Package and OWS Context at FOSS4G PDX
 
Cloud is such stuff as dreams are made on
Cloud is such stuff as dreams are made onCloud is such stuff as dreams are made on
Cloud is such stuff as dreams are made on
 
Scaling webappswithrabbitmq
Scaling webappswithrabbitmqScaling webappswithrabbitmq
Scaling webappswithrabbitmq
 
CouchDB and Rails on the Cloud
CouchDB and Rails on the CloudCouchDB and Rails on the Cloud
CouchDB and Rails on the Cloud
 
Geoindexing with MongoDB
Geoindexing with MongoDBGeoindexing with MongoDB
Geoindexing with MongoDB
 
Agi08 Jeremy Morley
Agi08 Jeremy MorleyAgi08 Jeremy Morley
Agi08 Jeremy Morley
 
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
 

Recently uploaded

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 

Recently uploaded (20)

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 

GeekCamp SG 2009 - CouchApps with CouchDB

  • 1. #geekcampsg 2009 CouchApps - Applications built on CouchDB Arun Thampi @iamclovin http://mclov.in Saturday, August 22, 2009
  • 2. About myself • Ruby Developer + Dabbler at Wego.com • The kick-ass travel meta-search engine • Work with great set of people @winstonyw @reds @mongeslani @chuyeow @jefflimar @phungleson @ijuzwannatwit @garytheis Saturday, August 22, 2009
  • 3. CouchDB FTW • Schema-less Key-Value based • MVCC (No Locks) document store • Replication • Erlang • Scaling out of the box (HAProxy/ • Speaks HTTP / REST Nginx) • Map Reduce • Full Text Search (Lucene/Sphinx) • JSON • Attachments (binary files) • Social Media • Web Interface (Futon) Saturday, August 22, 2009
  • 5. CouchDB - Built for the Web { “_id” : “abc”, “_rev” : “abc123def”, “text” : “Hello World”, “screen_name” : “mclovin”, “timestamp” : 123232, “type” : “thread”, “replies”: [ “reply 1”, “reply 2”, “reply 3”] } Saturday, August 22, 2009
  • 6. CouchDB - Built for the web Inserting a document HTTP PUT Retrieving a document HTTP GET Deleting a document HTTP DELETE Updating a document HTTP POST Scaling Replication + load balancing Querying ? Saturday, August 22, 2009
  • 8. Map Reduce with Javascript Views (No I wasn’t making that up) Document 1 [Key 1, Value 1] Document 2 Map Function [Key 2, Value 2] Reduce Function [Key k,Value k] Document n Value X Saturday, August 22, 2009
  • 9. Example Map Reduce Map Function function(doc) { if(doc.type == “customer”) { emit(doc.first_name, 1); } } Saturday, August 22, 2009
  • 10. Example Map Reduce (contd) Reduce Function function(keys, values, re) { return sum(values); } Saturday, August 22, 2009
  • 11. Example Map Reduce (contd) { .. { “key”: “Seth”, “value”: 1 }, reduce([“Seth”, “Fogell”], [1, 1]) { “key”: “Fogell”, “value”: 1 } .. } Saturday, August 22, 2009
  • 12. CouchApps • HTTP / HTML / Javascript is the language of the web • Coincidentally, that’s what CouchDB speaks too • Why not have CouchDB apps serve apps? Saturday, August 22, 2009
  • 13. CouchApps - Why? • Barriers to entry to develop powerful data-backed applications is lowered • Replication enables load-balancing + scaling • No Impedance Mismatch - Data is Javascript, your views are in Javascript, your HTML pages are rendered in Javascript Saturday, August 22, 2009
  • 14. CouchApps • Available at http://github.com/ couchapp/couchapp • couchapp generate icanhazthread • couchapp push icanhazthread http:// 127.0.0.1:5984/icanhazthread Saturday, August 22, 2009
  • 15. CouchApps - List & Show Functions Schema-less Model • A view is queried and the results are JSON passed to a list function • List Function then renders the results Map/Reduce of your view in whatever format you Controller View please: HTML, JSON, XML, RSS, etc • In a twisted way, its like a controller + view concept in an MVC framework View List/Show Saturday, August 22, 2009
  • 16. Introducing i.canhazthread.com • Inspired (in fact, cloned) from a.tinythread.com by Joshua Schacter • Backend powered by a CouchApp (http://github.com/arunthampi/ icanhazthread) • Uses Rails to do Twitter authentication + HTML rendering Saturday, August 22, 2009
  • 17. icanhazthread.com nginx CouchDB API [RSS, Realtime] Rails Mongrels CouchDB Saturday, August 22, 2009
  • 18. Document Structure Thread Reply { { “_id” : “abc”, “_id” : “def”, “_rev” : “abc123def”, “_rev” : “234abcdef”, “text” : “Hello World”, “text” : “oh hai”, “screen_name” : “mclovin”, “screen_name” : “snehamenon”, “timestamp” : 123232, “timestamp” : 1232310, “type” : “thread” “type” : “reply”, } “thread_id” : “abc” } Saturday, August 22, 2009
  • 19. Interesting Map/Reduce problem (at least for me) • Interesting because replies are not contained within a thread • Also, because threads on the homepage need to be sorted according to timestamp (newest ones first) • Views need to be commutative & associative Saturday, August 22, 2009
  • 20. Show me the code Map Function (yawn) function(doc) { if(doc.type == ‘thread’) { emit([doc.id, doc.time_created], doc); } else if(doc.type == ‘reply’) { emit([doc.thread_id, doc.time_created], doc); } } Saturday, August 22, 2009
  • 21. Show me the code Thread Reply Result Reduce Function Sorting? [K1, V1] [K2,V2] [K1, Summary for Thread 1] num_replies: 2 [K1, RV1] group_level =1 [K2, Summary for Thread 2] [K1, RV2] num_replies: 0 Saturday, August 22, 2009
  • 22. Future Directions • Make icanhazthread real-time (Utilize the _changes API in CouchDB) • RSS Feeds (Dead simple with the CouchApp list) • etc etc Saturday, August 22, 2009
  • 23. Resources • CouchDB Wiki: http://wiki.couchdb.org • CouchDB Mailing lists (user + dev) • Blogs: Chris Anderson, Harish Mallipeddi, Jan Lenhardt • CouchDB Futon Test Suite (http://127.0.0.1:5984/_utils/ couch_tests.html) • Other CouchApps: Toast, Chris Anderson’s blog Saturday, August 22, 2009
  • 24. Thank you Q &A Saturday, August 22, 2009