SlideShare a Scribd company logo
“Because as rapid as the arrival of
     networked pull media was,
     the second act - networked push
     media - is coming even faster. ”
                           WIRED Magazine
                           March 1997




Thursday, March 11, 2010
Push
                                A 2010 case study with
                           the NGINX HTTP Push Module,
                               Ruby on Rails, and friends



                                    Luke Melia




Thursday, March 11, 2010
Who’s this guy?
                ★ VP, Engineering at weplay.com
                ★ Agilist
                ★ nyc.rb’er since ~2006
                ★ Ruby in Practice contributor
                ★ Interested in startup tech leadership
                ★ Beach volleyball player
                ★ Dad

Thursday, March 11, 2010
What’s this talk?
              ★ The goal and the problem
              ★ A quick survey of solutions
              ★ About the NGINX HTTP Push Module
              ★ How to use it with Ruby, by example
              ★ Gotchyas
              ★Q &A

Thursday, March 11, 2010
The Goal
    ★ Immediate encouragement
           of positive on-site actions
    ★ “Points!”


Thursday, March 11, 2010
+10


Thursday, March 11, 2010
Constraints
                 ★ Don’t want to figure out points earned
                           while processing the request (offload it to a
                           background work queue)
                 ★ Do want to inform about points earned
                           through another user’s actions
                 ★ Don’t want to wait for a second page load




Thursday, March 11, 2010
Pure push
               doesn’t exist
             on the open web

Thursday, March 11, 2010
XMPP                  WebSockets

                           Push-like
                           solutions
      Streaming                   Comet
Thursday, March 11, 2010
★       Don’t close the connection after
                  sending down the page
          ★       multipart/x-mixed-replace
          ★       Supported in non-Microsoft
                  browsers only


      Streaming
Thursday, March 11, 2010
XMPP
          ★       Designed for presence and messaging
          ★       Browsers don’t speak XMPP natively
          ★       BOSH
          ★       Hemlock: Flex + ejabberd, by NYC’s
                  Mint Digital

Thursday, March 11, 2010
★       Push data over a long held Ajax
                  request using browser-native
                  technologies
          ★       Bayeaux protocol
          ★       Long-polling Ajax


                                         Comet
Thursday, March 11, 2010
WebSockets
          ★       HTML 5
          ★       Full-duplex single socket connection
                  between browser and server
          ★       ex: ws://websockets.org:8787
          ★       very limited browser support today

Thursday, March 11, 2010
XMPP               WebSockets




      Streaming               Comet
Thursday, March 11, 2010
ejabberd                       Sunshowers


                                             Rainbows!
                             Servers              Cramp


     Juggernaut                    NGINX HTTP Push Module

                           Orbited
                             Tornado
                                Diesel          Faye

Thursday, March 11, 2010
NGINX HTTP Push Module

                    ★      Turns NGINX into a Comet server
                    ★      “A useful tool with a boring name.”
                    ★      By Leo P
                    ★      http://pushmodule.slact.net/
                    ★      Currently at 0.692β


Thursday, March 11, 2010
Basic HTTP Push
                                Relay Protocol
                           ★   Subscriber locations
                               ★   HTTP GET with channel ID
                           ★   Publisher locations
                               ★   HTTP POST with channel ID
                           ★   POSTed data is passed through,
                               becoming the response to the
                               subscriber’s GET

Thursday, March 11, 2010
Diagramming the simple case
                                                  BACK-END
                                                  PROCESS



                                 2. HTTP POST

                                                       Publisher endpoint


                                                                            3. POST BODY
                                                     NGINX
                                                                            IS ROUTED BY
                                                                             CHANNEL ID
                                         Subscriber endpoint



                                                               4. RESPONSE IS
                                1. HTTP GET                     DATA FROM
                                                                 POST BODY


                                                End User




Thursday, March 11, 2010
Channel
                           Concurrency Styles

                             ★ Broadcast

                             ★ Last-in, first-out

                             ★ First-in, last-out




Thursday, March 11, 2010
Subscriber config

             # public long‐polling endpoint
             location /rt/notifications {
               push_subscriber;
               set $push_channel_id $arg_id;
               push_subscriber_concurrency last;
             }

Thursday, March 11, 2010
Publisher config
       # internal publish endpoint
       # (keep it private / protected)
       location /rt/publish {
         push_publisher;
         set $push_channel_id $arg_id;
         push_store_messages on;
         push_message_timeout 5m;
         push_max_message_buffer_length 5;
         push_min_message_buffer_length 0;
         push_delete_oldest_received_message on;
       }
Thursday, March 11, 2010
Diagram with storage
                                                    BACK-END
                                                    PROCESS



                                   1. HTTP POST


                             4. MESSAGE                  Publisher endpoint

                                                                               2. POST BODY
                            IS RETRIEVED
                                                                                 IS QUEUED
                            FROM QUEUE                 NGINX
                                                                   Queue
                                                                              BY CHANNEL ID
                           BY CHANNEL ID
                                           Subscriber endpoint



                                                                 5. RESPONSE IS
                                 3. HTTP GET                      DATA FROM
                                                                     QUEUE


                                                  End User




Thursday, March 11, 2010
Code it up.




Thursday, March 11, 2010
Client-side Gotchas
                    ★      Javascript blocking
                           ★   Put it in an iframe
                    ★      Per domain connection limit
                           ★   use subdomain, with JSONP



Thursday, March 11, 2010
Server-side Gotchas
                ★          “Too many open connections”
                      ★    Reduce worker_connections to less
                           than ulimit -n
                      ★    Increase worker_processes to give
                           you enough total connection to
                           serve your users
                      ★    Ours: worker_processes 24
                                 worker_connections 960
Thursday, March 11, 2010
Testing


                    ★      Fake Publisher for in-memory
                           cucumber scenarios
                    ★      Run selenium scenarios through
                           NGINX to incorporate actual
                           push module behavior

Thursday, March 11, 2010
NGINX Configuration
                   Management

                           ★Template   it
                           ★Version
                                  it
                           ★Automate it


Thursday, March 11, 2010
The Future
                           ★   Multiplexing: subscribe
                               to more than one
                               channel
                           ★   Use Redis as a
                               message store
                           ★   Convention-based
                               approach for raising
                               javascript events


Thursday, March 11, 2010
Questions?




Thursday, March 11, 2010

More Related Content

Similar to Http Push

BRAINREPUBLIC - Powered by no-SQL
BRAINREPUBLIC - Powered by no-SQLBRAINREPUBLIC - Powered by no-SQL
BRAINREPUBLIC - Powered by no-SQL
Andreas Jung
 
Intro to WebSockets and Comet
Intro to WebSockets and CometIntro to WebSockets and Comet
Intro to WebSockets and Comet
dylanks
 
Node.js and Ruby
Node.js and RubyNode.js and Ruby
Node.js and Ruby
Michael Bleigh
 
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
Codemotion
 
A Network Architecture for the Web of Things
A Network Architecture for the Web of ThingsA Network Architecture for the Web of Things
A Network Architecture for the Web of Things
benaam
 
The Reluctant SysAdmin : 360|iDev Austin 2010
The Reluctant SysAdmin : 360|iDev Austin 2010The Reluctant SysAdmin : 360|iDev Austin 2010
The Reluctant SysAdmin : 360|iDev Austin 2010
Voxilate
 
Node.js - A Quick Tour II
Node.js - A Quick Tour IINode.js - A Quick Tour II
Node.js - A Quick Tour II
Felix Geisendörfer
 
Intro To Git
Intro To GitIntro To Git
Intro To Git
kyleburton
 
How To Build A Web Service
How To Build A Web ServiceHow To Build A Web Service
How To Build A Web Service
Moses Ngone
 
Distributed Social Networking
Distributed Social NetworkingDistributed Social Networking
Distributed Social Networking
Bastian Hofmann
 
SeaBeyond 2011 ProcessOne - Eric Cestari: XMPP over WebSocket
SeaBeyond 2011 ProcessOne - Eric Cestari: XMPP over WebSocketSeaBeyond 2011 ProcessOne - Eric Cestari: XMPP over WebSocket
SeaBeyond 2011 ProcessOne - Eric Cestari: XMPP over WebSocket
ProcessOne
 
Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands
Bastian Hofmann
 
RunDeck
RunDeckRunDeck
RunDeck
Bruno Bonfils
 
PHP in a Mobile Ecosystem (Zendcon 2010)
PHP in a Mobile Ecosystem (Zendcon 2010)PHP in a Mobile Ecosystem (Zendcon 2010)
PHP in a Mobile Ecosystem (Zendcon 2010)
Ivo Jansch
 
Large Files without the Trials
Large Files without the TrialsLarge Files without the Trials
Large Files without the Trials
Sally Kleinfeldt
 
Networks Have Layers - Understanding The OSI Model
Networks Have Layers - Understanding The OSI ModelNetworks Have Layers - Understanding The OSI Model
Networks Have Layers - Understanding The OSI Model
Brandon Checketts
 

Similar to Http Push (16)

BRAINREPUBLIC - Powered by no-SQL
BRAINREPUBLIC - Powered by no-SQLBRAINREPUBLIC - Powered by no-SQL
BRAINREPUBLIC - Powered by no-SQL
 
Intro to WebSockets and Comet
Intro to WebSockets and CometIntro to WebSockets and Comet
Intro to WebSockets and Comet
 
Node.js and Ruby
Node.js and RubyNode.js and Ruby
Node.js and Ruby
 
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
 
A Network Architecture for the Web of Things
A Network Architecture for the Web of ThingsA Network Architecture for the Web of Things
A Network Architecture for the Web of Things
 
The Reluctant SysAdmin : 360|iDev Austin 2010
The Reluctant SysAdmin : 360|iDev Austin 2010The Reluctant SysAdmin : 360|iDev Austin 2010
The Reluctant SysAdmin : 360|iDev Austin 2010
 
Node.js - A Quick Tour II
Node.js - A Quick Tour IINode.js - A Quick Tour II
Node.js - A Quick Tour II
 
Intro To Git
Intro To GitIntro To Git
Intro To Git
 
How To Build A Web Service
How To Build A Web ServiceHow To Build A Web Service
How To Build A Web Service
 
Distributed Social Networking
Distributed Social NetworkingDistributed Social Networking
Distributed Social Networking
 
SeaBeyond 2011 ProcessOne - Eric Cestari: XMPP over WebSocket
SeaBeyond 2011 ProcessOne - Eric Cestari: XMPP over WebSocketSeaBeyond 2011 ProcessOne - Eric Cestari: XMPP over WebSocket
SeaBeyond 2011 ProcessOne - Eric Cestari: XMPP over WebSocket
 
Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands
 
RunDeck
RunDeckRunDeck
RunDeck
 
PHP in a Mobile Ecosystem (Zendcon 2010)
PHP in a Mobile Ecosystem (Zendcon 2010)PHP in a Mobile Ecosystem (Zendcon 2010)
PHP in a Mobile Ecosystem (Zendcon 2010)
 
Large Files without the Trials
Large Files without the TrialsLarge Files without the Trials
Large Files without the Trials
 
Networks Have Layers - Understanding The OSI Model
Networks Have Layers - Understanding The OSI ModelNetworks Have Layers - Understanding The OSI Model
Networks Have Layers - Understanding The OSI Model
 

Recently uploaded

AppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSFAppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSF
Ajin Abraham
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
Antonios Katsarakis
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
Safe Software
 
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
"Scaling RAG Applications to serve millions of users",  Kevin Goedecke"Scaling RAG Applications to serve millions of users",  Kevin Goedecke
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
Fwdays
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
Fwdays
 
QA or the Highway - Component Testing: Bridging the gap between frontend appl...
QA or the Highway - Component Testing: Bridging the gap between frontend appl...QA or the Highway - Component Testing: Bridging the gap between frontend appl...
QA or the Highway - Component Testing: Bridging the gap between frontend appl...
zjhamm304
 
Mutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented ChatbotsMutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented Chatbots
Pablo Gómez Abajo
 
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeckPoznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
FilipTomaszewski5
 
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and BioinformaticiansBiomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Neo4j
 
QR Secure: A Hybrid Approach Using Machine Learning and Security Validation F...
QR Secure: A Hybrid Approach Using Machine Learning and Security Validation F...QR Secure: A Hybrid Approach Using Machine Learning and Security Validation F...
QR Secure: A Hybrid Approach Using Machine Learning and Security Validation F...
AlexanderRichford
 
Day 2 - Intro to UiPath Studio Fundamentals
Day 2 - Intro to UiPath Studio FundamentalsDay 2 - Intro to UiPath Studio Fundamentals
Day 2 - Intro to UiPath Studio Fundamentals
UiPathCommunity
 
Containers & AI - Beauty and the Beast!?!
Containers & AI - Beauty and the Beast!?!Containers & AI - Beauty and the Beast!?!
Containers & AI - Beauty and the Beast!?!
Tobias Schneck
 
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge GraphGraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
Neo4j
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
Fwdays
 
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptxPRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
christinelarrosa
 
What is an RPA CoE? Session 2 – CoE Roles
What is an RPA CoE?  Session 2 – CoE RolesWhat is an RPA CoE?  Session 2 – CoE Roles
What is an RPA CoE? Session 2 – CoE Roles
DianaGray10
 
Northern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving | Modern Metal Trim, Nameplates and Appliance PanelsNorthern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving
 
Must Know Postgres Extension for DBA and Developer during Migration
Must Know Postgres Extension for DBA and Developer during MigrationMust Know Postgres Extension for DBA and Developer during Migration
Must Know Postgres Extension for DBA and Developer during Migration
Mydbops
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
Jason Yip
 
A Deep Dive into ScyllaDB's Architecture
A Deep Dive into ScyllaDB's ArchitectureA Deep Dive into ScyllaDB's Architecture
A Deep Dive into ScyllaDB's Architecture
ScyllaDB
 

Recently uploaded (20)

AppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSFAppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSF
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
 
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
"Scaling RAG Applications to serve millions of users",  Kevin Goedecke"Scaling RAG Applications to serve millions of users",  Kevin Goedecke
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
 
QA or the Highway - Component Testing: Bridging the gap between frontend appl...
QA or the Highway - Component Testing: Bridging the gap between frontend appl...QA or the Highway - Component Testing: Bridging the gap between frontend appl...
QA or the Highway - Component Testing: Bridging the gap between frontend appl...
 
Mutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented ChatbotsMutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented Chatbots
 
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeckPoznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
Poznań ACE event - 19.06.2024 Team 24 Wrapup slidedeck
 
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and BioinformaticiansBiomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
 
QR Secure: A Hybrid Approach Using Machine Learning and Security Validation F...
QR Secure: A Hybrid Approach Using Machine Learning and Security Validation F...QR Secure: A Hybrid Approach Using Machine Learning and Security Validation F...
QR Secure: A Hybrid Approach Using Machine Learning and Security Validation F...
 
Day 2 - Intro to UiPath Studio Fundamentals
Day 2 - Intro to UiPath Studio FundamentalsDay 2 - Intro to UiPath Studio Fundamentals
Day 2 - Intro to UiPath Studio Fundamentals
 
Containers & AI - Beauty and the Beast!?!
Containers & AI - Beauty and the Beast!?!Containers & AI - Beauty and the Beast!?!
Containers & AI - Beauty and the Beast!?!
 
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge GraphGraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
 
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptxPRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
 
What is an RPA CoE? Session 2 – CoE Roles
What is an RPA CoE?  Session 2 – CoE RolesWhat is an RPA CoE?  Session 2 – CoE Roles
What is an RPA CoE? Session 2 – CoE Roles
 
Northern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving | Modern Metal Trim, Nameplates and Appliance PanelsNorthern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
 
Must Know Postgres Extension for DBA and Developer during Migration
Must Know Postgres Extension for DBA and Developer during MigrationMust Know Postgres Extension for DBA and Developer during Migration
Must Know Postgres Extension for DBA and Developer during Migration
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
 
A Deep Dive into ScyllaDB's Architecture
A Deep Dive into ScyllaDB's ArchitectureA Deep Dive into ScyllaDB's Architecture
A Deep Dive into ScyllaDB's Architecture
 

Http Push

  • 1. “Because as rapid as the arrival of networked pull media was, the second act - networked push media - is coming even faster. ” WIRED Magazine March 1997 Thursday, March 11, 2010
  • 2. Push A 2010 case study with the NGINX HTTP Push Module, Ruby on Rails, and friends Luke Melia Thursday, March 11, 2010
  • 3. Who’s this guy? ★ VP, Engineering at weplay.com ★ Agilist ★ nyc.rb’er since ~2006 ★ Ruby in Practice contributor ★ Interested in startup tech leadership ★ Beach volleyball player ★ Dad Thursday, March 11, 2010
  • 4. What’s this talk? ★ The goal and the problem ★ A quick survey of solutions ★ About the NGINX HTTP Push Module ★ How to use it with Ruby, by example ★ Gotchyas ★Q &A Thursday, March 11, 2010
  • 5. The Goal ★ Immediate encouragement of positive on-site actions ★ “Points!” Thursday, March 11, 2010
  • 7. Constraints ★ Don’t want to figure out points earned while processing the request (offload it to a background work queue) ★ Do want to inform about points earned through another user’s actions ★ Don’t want to wait for a second page load Thursday, March 11, 2010
  • 8. Pure push doesn’t exist on the open web Thursday, March 11, 2010
  • 9. XMPP WebSockets Push-like solutions Streaming Comet Thursday, March 11, 2010
  • 10. Don’t close the connection after sending down the page ★ multipart/x-mixed-replace ★ Supported in non-Microsoft browsers only Streaming Thursday, March 11, 2010
  • 11. XMPP ★ Designed for presence and messaging ★ Browsers don’t speak XMPP natively ★ BOSH ★ Hemlock: Flex + ejabberd, by NYC’s Mint Digital Thursday, March 11, 2010
  • 12. Push data over a long held Ajax request using browser-native technologies ★ Bayeaux protocol ★ Long-polling Ajax Comet Thursday, March 11, 2010
  • 13. WebSockets ★ HTML 5 ★ Full-duplex single socket connection between browser and server ★ ex: ws://websockets.org:8787 ★ very limited browser support today Thursday, March 11, 2010
  • 14. XMPP WebSockets Streaming Comet Thursday, March 11, 2010
  • 15. ejabberd Sunshowers Rainbows! Servers Cramp Juggernaut NGINX HTTP Push Module Orbited Tornado Diesel Faye Thursday, March 11, 2010
  • 16. NGINX HTTP Push Module ★ Turns NGINX into a Comet server ★ “A useful tool with a boring name.” ★ By Leo P ★ http://pushmodule.slact.net/ ★ Currently at 0.692β Thursday, March 11, 2010
  • 17. Basic HTTP Push Relay Protocol ★ Subscriber locations ★ HTTP GET with channel ID ★ Publisher locations ★ HTTP POST with channel ID ★ POSTed data is passed through, becoming the response to the subscriber’s GET Thursday, March 11, 2010
  • 18. Diagramming the simple case BACK-END PROCESS 2. HTTP POST Publisher endpoint 3. POST BODY NGINX IS ROUTED BY CHANNEL ID Subscriber endpoint 4. RESPONSE IS 1. HTTP GET DATA FROM POST BODY End User Thursday, March 11, 2010
  • 19. Channel Concurrency Styles ★ Broadcast ★ Last-in, first-out ★ First-in, last-out Thursday, March 11, 2010
  • 20. Subscriber config # public long‐polling endpoint location /rt/notifications {   push_subscriber;   set $push_channel_id $arg_id;   push_subscriber_concurrency last; } Thursday, March 11, 2010
  • 21. Publisher config # internal publish endpoint # (keep it private / protected) location /rt/publish {   push_publisher;   set $push_channel_id $arg_id;   push_store_messages on;   push_message_timeout 5m;   push_max_message_buffer_length 5;   push_min_message_buffer_length 0;   push_delete_oldest_received_message on; } Thursday, March 11, 2010
  • 22. Diagram with storage BACK-END PROCESS 1. HTTP POST 4. MESSAGE Publisher endpoint 2. POST BODY IS RETRIEVED IS QUEUED FROM QUEUE NGINX Queue BY CHANNEL ID BY CHANNEL ID Subscriber endpoint 5. RESPONSE IS 3. HTTP GET DATA FROM QUEUE End User Thursday, March 11, 2010
  • 23. Code it up. Thursday, March 11, 2010
  • 24. Client-side Gotchas ★ Javascript blocking ★ Put it in an iframe ★ Per domain connection limit ★ use subdomain, with JSONP Thursday, March 11, 2010
  • 25. Server-side Gotchas ★ “Too many open connections” ★ Reduce worker_connections to less than ulimit -n ★ Increase worker_processes to give you enough total connection to serve your users ★ Ours: worker_processes 24 worker_connections 960 Thursday, March 11, 2010
  • 26. Testing ★ Fake Publisher for in-memory cucumber scenarios ★ Run selenium scenarios through NGINX to incorporate actual push module behavior Thursday, March 11, 2010
  • 27. NGINX Configuration Management ★Template it ★Version it ★Automate it Thursday, March 11, 2010
  • 28. The Future ★ Multiplexing: subscribe to more than one channel ★ Use Redis as a message store ★ Convention-based approach for raising javascript events Thursday, March 11, 2010