SlideShare a Scribd company logo
1 of 35
Download to read offline
Ismael Celis
Networked pub/sub with Go, Ruby and ZMQ
bootic.net - Hosted e-commerce in South America
Store frontsTheme editor
Checkout
Dashboard
Image resizer API
… and more in the pipeline.
• analytics
• automated backups
• activity dashboard
• audit trail
Ancillary services
Also: Play with cool toys
Publisher 1
Publisher 2
Publisher 3
Events hub Events bus
pub/sub
Publisher 1
Publisher 2
Publisher 3
Events hub Events bus
pub/sub
JSON
UDP
msgpack ZMQ
Events hub Events bus
pub/sub
JSON
UDP
msgpack ZMQ
Stats
Backups
Logs
?
Websocket
pub / sub
Publisher 1
pub/sub
require 'socket'



socket = UDPSocket.new



message = {

time: Time.now.to_s,

type: 'pageview',

app: 'store_fronts',

data: {

account: 'acme',

user: 'Joe Bloggs',

domain: 'www.acme.com',

path: '/about/us',

ua: 'Mozilla/5.0 (Windows NT 6.2; Win64; x64)...'

}

}



json = ActiveSupport::JSON.encode(message)



socket.send(json, 0, 'events_hub_host', 5555)
Events hub
pub/sub
github.com/bootic/bootic_data_collector
func (daemon *Daemon) ReceiveDatagrams() {



for {

buffer := make([]byte, 1024)



daemon.Conn.ReadFromUDP(buffer)



event, err := data.DecodeJSON(buffer[:c])

daemon.Dispatch(event)



}



panic("should never have got myself into this.")

}
Events hub
pub/sub
github.com/bootic/bootic_data_collector
// Start up UDP daemon
daemon, err := udp.NewDaemon(udpHost)



// Start up PUB ZMQ client

zmqObserver := fanout.NewZmq(zmqAddress)



// Push incoming UDP events down ZMQ pub/sub socket

daemon.Subscribe(zmqObserver.Notifier)
Events hub
pub/sub
github.com/bootic/bootic_data_collector
daemon, err := udp.NewDaemon(udpHost)
Events hub
pub/sub
github.com/bootic/bootic_data_collector
type Daemon struct {

Conn *net.UDPConn

observers map[string][]data.EventsChannel

}



func NewDaemon(udpHostAndPort string) (daemon *Daemon, err error) {

conn, err := createUDPListener(udpHostAndPort)



if err != nil {

return

}



daemon = &Daemon{

Conn: conn,

observers: make(map[string][]data.EventsChannel),

}



go daemon.ReceiveDatagrams()



return

}
Events hub
pub/sub
github.com/bootic/bootic_data_collector
go daemon.ReceiveDatagrams()
Events hub
pub/sub
github.com/bootic/bootic_data_collector


daemon, err := udp.NewDaemon(udpHost)



// Start up PUB ZMQ client

zmqObserver := fanout.NewZmq(zmqAddress)



// Push incoming UDP events down ZMQ pub/sub socket

daemon.Subscribe(zmqObserver.Notifier)
Events hub
pub/sub
github.com/bootic/bootic_data_collector
daemon.Subscribe(zmqObserver.Notifier)
Events hub
pub/sub
github.com/bootic/bootic_data_collector
// Start up UDP daemon

daemon, err := udp.NewDaemon(udpHost)





// Setup Websockets server

wshub := ws.HandleWebsocketsHub("/ws")



// Push incoming UDP messages to multiple listeners

daemon.Subscribe(wshub.Notifier)



// Start up PUB ZMQ client

zmqObserver := fanout.NewZmq(zmqAddress)



// Push incoming UDP events down ZMQ pub/sub socket

daemon.Subscribe(zmqObserver.Notifier)



log.Fatal("HTTP server error: ", http.ListenAndServe(wsHost, nil))
pub / sub
pageviews
tracker
Events hub
1px tracking .gif JSON / UDP
github.com/bootic/bootic_pageviews
Events hub
Redis
pub sub
aggregator HTTP API
internets
“pageview”
Stats
aggregates
pub/sub
// Setup ZMQ subscriber

daemon, _ := booticzmq.NewZMQSubscriber(zmqAddress)



// Setup Redis tracker

tracker, err := redis_stats.NewTracker(redisAddress)





// Redis subscribes to these events

daemon.SubscribeToType(tracker.Notifier, "pageview")
github.com/bootic/bootic_stats_aggregates
Stats
aggregates
pub/sub
github.com/bootic/bootic_stats_aggregates
year := now.Year()

month := now.Month()

day := now.Day()

hour := now.Hour()



go func () {



// increment current month in year: “track:acme/pageview/2013”

yearKey := fmt.Sprintf("track:%s/%s/%s", account, evtType, year)

self.Conn.HIncrBy(yearKey, month, 1)



// increment current day in month: “track:acme/pageview/2013/12”

monthKey := fmt.Sprintf("track:%s/%s/%s/%s", key, evtType, year, month)

self.Conn.HIncrBy(monthKey, day, 1)



// increment current hour in day: “track:acme/pageview/2013/12/16”

dayKey := fmt.Sprintf("track:%s/%s/%s/%s/%s", key, evtType, year, month, day)

self.Conn.HIncrBy(dayKey, hour, 1)



}()
Stats
aggregates
pub/sub
github.com/bootic/bootic_stats_aggregates
GET /api/stats/track/acme/pageview/2013/12/16
{

"account": "acme",

"event": "pageview",

"year": "2013",

"month": "12",

"day": "16",

"data": {

"0": 2693,

"1": 1215,

"2": 341,

"3": 176,

"4": 80,

"5": 89,

"6": 333,

"7": 779,

"8": 1506,

"9": 2553,

"10": 3734

}

}

Stats
aggregates
pub/sub
github.com/bootic/bootic_stats_aggregates
Git backups
pub/sub
github.com/bootic/bootic_themes_backup
Events hub
pub sub
Git backups
Themes API
“theme”
Git
Git
git clone tufte:/home/git/git_themes/acme
Git backups
pub/sub
doneChan := make(chan string)

bufferChan := make(chan int, 20)



stores := make(map[string]*ThemeStore)



for {

select {

case event := <-writer.Notifier:

account := event.Get("account")



store := stores[account]

// Register store and start delayed writing 

// if not already registered

if store == nil {

store = NewThemeStore(account)

stores[account] = store

go store.DelayedWrite(bufferChan, doneChan)

}



case account := <-doneChan:

// A store is done writing. 

// Un-register it so it can be registered again.

delete(stores, account)

}

}
github.com/bootic/bootic_themes_backup
Git backups
pub/sub
github.com/bootic/bootic_themes_backup
go store.DelayedWrite(bufferChan, doneChan)
doneChan := make(chan string)

bufferChan := make(chan int, 20)



…
Git backups
pub/sub
github.com/bootic/bootic_themes_backup
func (store *ThemeStore) DelayedWrite(bufferChan chan int, doneChan chan string) {



time.Sleep(10)



// Start work. This will block if buffer is full.

bufferChan <- 1



store.Backup()



// Done. Free space in the buffer

<-bufferChan



doneChan <- store.Account

}()

}
doneChan := make(chan string)

bufferChan := make(chan int, 20)



…
The future
The future
• Searchable events history
• Per-account secure websocket
• More stats!
• Webhooks
Ismael Celis @ismasan
bit.ly/1fYmUff
Blog post
bit.ly/1fYmUff
Ismael Celis @ismasan
bootic/bootic_data_collector
bootic/bootic_pageviews
bootic/bootic_stats_aggregates
bootic/bootic_themes_backup
Githubs
bootic/bootic_stathat
Blog post
Ismael Celis @ismasan

More Related Content

Viewers also liked

CYNH Holiday Slideshow with music
CYNH Holiday Slideshow with musicCYNH Holiday Slideshow with music
CYNH Holiday Slideshow with musicbkessling
 
Tribuna Celíaca nº 20
Tribuna Celíaca nº 20Tribuna Celíaca nº 20
Tribuna Celíaca nº 20celiacscat
 
Zmq in context of openstack
Zmq in context of openstackZmq in context of openstack
Zmq in context of openstackYatin Kumbhare
 
Odontologia equina carolina
Odontologia equina carolinaOdontologia equina carolina
Odontologia equina carolinaluirpo
 
Introduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkIntroduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkMahmoud Said
 
Zeromq anatomy & jeromq
Zeromq anatomy & jeromqZeromq anatomy & jeromq
Zeromq anatomy & jeromqDongmin Yu
 
StoreDot Takes Over The World
StoreDot Takes Over The WorldStoreDot Takes Over The World
StoreDot Takes Over The WorldBlonde 2.0
 
Software Architecture over ZeroMQ
Software Architecture over ZeroMQSoftware Architecture over ZeroMQ
Software Architecture over ZeroMQpieterh
 
ZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsJames Dennis
 
Script and practice for the speaking activity level 0
Script and practice for the speaking activity level 0Script and practice for the speaking activity level 0
Script and practice for the speaking activity level 0Karen Villalba
 
Build reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQBuild reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQRobin Xiao
 
Course 7-Unit 10: Superlative adjectives.
Course 7-Unit 10: Superlative adjectives.Course 7-Unit 10: Superlative adjectives.
Course 7-Unit 10: Superlative adjectives.Martin Caicedo
 
Europycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQEuropycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQfcrippa
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The AnswerIan Barber
 

Viewers also liked (18)

CYNH Holiday Slideshow with music
CYNH Holiday Slideshow with musicCYNH Holiday Slideshow with music
CYNH Holiday Slideshow with music
 
Tema 3
Tema 3Tema 3
Tema 3
 
Multiportal 130925112602-phpapp01
Multiportal 130925112602-phpapp01Multiportal 130925112602-phpapp01
Multiportal 130925112602-phpapp01
 
Tribuna Celíaca nº 20
Tribuna Celíaca nº 20Tribuna Celíaca nº 20
Tribuna Celíaca nº 20
 
Zmq in context of openstack
Zmq in context of openstackZmq in context of openstack
Zmq in context of openstack
 
Odontologia equina carolina
Odontologia equina carolinaOdontologia equina carolina
Odontologia equina carolina
 
Introduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkIntroduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalk
 
Zeromq anatomy & jeromq
Zeromq anatomy & jeromqZeromq anatomy & jeromq
Zeromq anatomy & jeromq
 
StoreDot Takes Over The World
StoreDot Takes Over The WorldStoreDot Takes Over The World
StoreDot Takes Over The World
 
Software Architecture over ZeroMQ
Software Architecture over ZeroMQSoftware Architecture over ZeroMQ
Software Architecture over ZeroMQ
 
ZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 Labs
 
Script and practice for the speaking activity level 0
Script and practice for the speaking activity level 0Script and practice for the speaking activity level 0
Script and practice for the speaking activity level 0
 
Build reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQBuild reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQ
 
Leis de Newton
Leis de NewtonLeis de Newton
Leis de Newton
 
Course 7-Unit 10: Superlative adjectives.
Course 7-Unit 10: Superlative adjectives.Course 7-Unit 10: Superlative adjectives.
Course 7-Unit 10: Superlative adjectives.
 
Europycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQEuropycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQ
 
Mejora de la Competitividad
Mejora de la CompetitividadMejora de la Competitividad
Mejora de la Competitividad
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The Answer
 

Recently uploaded

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...apidays
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
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
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 

Recently uploaded (20)

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
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...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 

Networked pub/sub with UDP, Go, Ruby and ZMQ