SlideShare une entreprise Scribd logo
1  sur  35
Télécharger pour lire hors ligne
Vetebra
Nanite
George Palmer
Background processing

• Work should be moved to the background
  to stop application server load
• This keeps website responsive
• Useful for: images, videos, web services,
  slow database queries....anything that isn’t
  quick!
Current background
       offerings
• Fork into background of rails process
  •   eg spawn, run_later

• Record to database (or file) and
  background daemon picks up from there
  •   eg background_job, delayed_job

• Fork onto some kind of queue
  •   eg backgroundRB, beanstalk, starling with workling
Introducing Nanite

• Developed by EngineYard
• Gives presence - we know what’s available
• Handles failure
• Instant scalability
• Event based architecture
Pre-reqs

• Erlang
 • Not R12B5 (the version installed by
    MacPorts)
• RabbitMQ
 • Untar to erlang lib directory - most
    likely /usr/local/lib/erlang/lib
AMQP
• Advanced Message Queuing Protocol
• Enterprise quality protocol developed by
  several financial institutions
• Includes wire protocol to ensure language
  neutral
• RabbitMQ implements AMQP 0.8
Installing AMQP for Ruby


$ sudo gem install eventmachine
$ git clone git://github.com/tmm1/amqp.git
$ cd amqp && rake gem && sudo gem install
  amqp-<version>.gem
Nanite
         NA                         A   Nanite
   Thin                                 Actor
          a M                       M
   App
         ni Q                       Q   Nanite
  Server
         te P                       P   Actor

Nanite Mappers   m e s s a g e s   Nanite Agents

         NA                         A   Nanite
  Ruby a M                          M   Actor
  Script ni Q                       Q   Nanite
         te P                       P   Actor
Nanite Mappers
• Control and track work
• Unlimited number can be run that get
  updates from mapper exchange
 •   mapper exchange itself is just a heartbeat and
     registration MQ

• Run either inside Rails/MERB app (on Thin)
  or via command line
Nanite Agents
• Do the work
• A given nanite agent can have multiple
  actors
• Scale by adding more agents
• Pings the mapper exchange every
  @ping_time seconds to report health
Nanite Actors

class Manor < Nanite::Actor
 expose :name

 def name(vars)
  # Do something interesting here
  :result => “RubyManor”
 end
end

Nanite::Dispatcher.register(Manor.new)
Agent directory
        structure
+ myagent
 + actors
  - manor.rb
 + files
 - init.rb
 - config.yml
Agent config.yml
---
:vhost: /nanite   # Allow multiple agents with different queues [compulsory]
:user: nanite     # Username for queue
:pass: testing    # Password for queue
:identity: barney # Can be auto-generated but useful to send work to specific
                  # agents
:file_root: path   # where to store any transfered files
:format: marshal # or :json


# Additional options include host and port. All options can be passed into
# nanite command so can avoid config file if want
Getting Started...

• Start RabbitMQ
 •   /usr/local/lib/erlang/lib/rabbitmq/sbin/rabbitmq-
     server

• On first run nanite/bin/rabbitconf
 • Sets up RabbitMQ with a vhost and users
     for that vhost (more on this later)
Starting agents
• cd <agentdir> && <nanite basedir>/bin/
  nanite
• I’ve been using:
  cd <agentdir> && <nanite basedir>/bin/
  nanite -t <identity> &
• Could be managed better through a
  daemon/monitoring system though
Offloading work to
        Nanite
• Use the following code:
  Nanite.request(callable, params = ‘’,   options =
  {}) {|res| # use res to do something}


 •   callable is the actor and method - eg ‘/manor/
     name’

 •   params are parameters for the callable method -
     eg ‘2008’

 •   options includes timeout, target and the routing
     algorithm - more on this later
Interfaces into the
         Mappers
• Via console:
 • nanite/nanite-mapper -i
• Via command line:
 • See nanite/examples/cli.rb
• Via Rails/MERB app:
 • See next slide....
Rails/MERB & Nanite
# Updates the user
def update
 ...
 if (@user.save)
    Nanite.request(‘/updates/twitter’, ‘georgio_1999’) {|res|
      # This block won’t execute until the event fires
      @user.status = res[:status]
      @user.save
    }
 end
end

def ajax_call
 # Must use database for state and not Nanite job
end
Allocation of work
• The pings are used by the mappers to find
  the healthiest nanite agents
• If a nanite agent doesn’t ping inside a
  window it is removed from the active list
  (until it does ping again)
  • perfect for busy or error hit nanites
• The default routing algorithm is based on
  server load
Routing options
• In options argument of        Nanite.request   you
  can choose:

 • selector
   •   :least_loaded (default), :all, :random, :rr

 • target - use this to target a specific agent
 • timeout - override the default timeout
    (60s)
Custom algorithms
• Nanites report state with their ping
  •   By default this is the server load

• Can override this by adding code to agent
  init.rb
  •   Nanite.status_proc = lambda
      { MyApp.some_statistic_indicating_load }


  •   Must be comparable

• Can use with existing routing algorithms or
  create own more complex ones
File transfers
• Nanite can handle file transmission
 • Agents subscribe (for all actors) in init.rb
    or Actors subscribe individually:
    •   Nanite.subscribe_to_files(domain)


  • Mappers send via:
    •   Nanite.broadcast_file(filepath, opts)


    •   where opts can contain :domain
        and :destination (destination filename)
The beauty of JSON
• Nanite is built on top of AMQP, so if the
  queue items are serialised using JSON...
  • Then Nanite isn’t needed at the agent
    side
  • Any AMQP implementing daemon can
    read message and respond
  • Useful for legacy code (or legacy people)
Understanding Security
• Security is implemented using RabbitMQ’s
  vhosts and username/passwords
• The username/password is defined in
  config.yml for each nanite
• Need to configure RabbitMQ using the
  rabbitmqctl command

• Generally one vhost per application
Let’s play
• cd <git_resources>/nanite/examples/myagent
• ../../bin/nanite -t <identity> -h <host>
    •      Let’s use fullname for identity - eg georgepalmer

    • Should see something like:
  # subscribing to file broadcasts for foobar

  # loading actor: /Users/georgepalmer/work/git_resources/nanite/examples/myagent/actors/gems.rb

  # loading actor: /Users/georgepalmer/work/git_resources/nanite/examples/myagent/actors/mock.rb

  # quot;advertise_servicesquot;

  # [quot;/gems/listquot;, quot;/mock/listquot;]
Resources

• RabbitMQ: http://www.rabbitmq.com
• Ruby AMQP with RabbitMQ tutorial:
  http://hopper.squarespace.com/blog/2008/7/22/simple-amqp-library-for-ruby.html




• Nanite: http://github.com/ezmobius/nanite
    •     Doc isn’t great, code is very readable

Contenu connexe

Similaire à Rubymanor - Nanite talk

XMPP & AMQP
XMPP & AMQPXMPP & AMQP
XMPP & AMQP
voluntas
 
Automated Performance Testing With J Meter And Maven
Automated  Performance  Testing With  J Meter And  MavenAutomated  Performance  Testing With  J Meter And  Maven
Automated Performance Testing With J Meter And Maven
PerconaPerformance
 
Openshift: Deployments for the rest of us
Openshift: Deployments for the rest of usOpenshift: Deployments for the rest of us
Openshift: Deployments for the rest of us
Anurag Patel
 

Similaire à Rubymanor - Nanite talk (20)

Security testing with gauntlt
Security testing with gauntltSecurity testing with gauntlt
Security testing with gauntlt
 
Merb + Nanite
Merb + NaniteMerb + Nanite
Merb + Nanite
 
Zen map
Zen mapZen map
Zen map
 
Be Mean to Your Code
Be Mean to Your CodeBe Mean to Your Code
Be Mean to Your Code
 
Nmap
NmapNmap
Nmap
 
AMS Node Meetup December presentation Phusion Passenger
AMS Node Meetup December presentation Phusion PassengerAMS Node Meetup December presentation Phusion Passenger
AMS Node Meetup December presentation Phusion Passenger
 
The Current State of Asynchronous Processing With Ruby
The Current State of Asynchronous Processing With RubyThe Current State of Asynchronous Processing With Ruby
The Current State of Asynchronous Processing With Ruby
 
Network Mapper (NMAP)
Network Mapper (NMAP)Network Mapper (NMAP)
Network Mapper (NMAP)
 
Nmap
NmapNmap
Nmap
 
Combining the strength of erlang and Ruby
Combining the strength of erlang and RubyCombining the strength of erlang and Ruby
Combining the strength of erlang and Ruby
 
Combining the Strengths or Erlang and Ruby
Combining the Strengths or Erlang and RubyCombining the Strengths or Erlang and Ruby
Combining the Strengths or Erlang and Ruby
 
Neutron Network Namespaces and IPtables--A Technical Deep Dive
Neutron Network Namespaces and IPtables--A Technical Deep DiveNeutron Network Namespaces and IPtables--A Technical Deep Dive
Neutron Network Namespaces and IPtables--A Technical Deep Dive
 
Monitoring as Code: Getting to Monitoring-Driven Development - DEV314 - re:In...
Monitoring as Code: Getting to Monitoring-Driven Development - DEV314 - re:In...Monitoring as Code: Getting to Monitoring-Driven Development - DEV314 - re:In...
Monitoring as Code: Getting to Monitoring-Driven Development - DEV314 - re:In...
 
XMPP & AMQP
XMPP & AMQPXMPP & AMQP
XMPP & AMQP
 
Automated Performance Testing With J Meter And Maven
Automated  Performance  Testing With  J Meter And  MavenAutomated  Performance  Testing With  J Meter And  Maven
Automated Performance Testing With J Meter And Maven
 
Nmap basics-1198948509608024-3
Nmap basics-1198948509608024-3Nmap basics-1198948509608024-3
Nmap basics-1198948509608024-3
 
Openshift: Deployments for the rest of us
Openshift: Deployments for the rest of usOpenshift: Deployments for the rest of us
Openshift: Deployments for the rest of us
 
Null Delhi chapter - Feb 2019
Null Delhi chapter - Feb 2019Null Delhi chapter - Feb 2019
Null Delhi chapter - Feb 2019
 
Recon with Nmap
Recon with Nmap Recon with Nmap
Recon with Nmap
 
The Art of Grey-Box Attack
The Art of Grey-Box AttackThe Art of Grey-Box Attack
The Art of Grey-Box Attack
 

Dernier

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Dernier (20)

2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
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
 
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
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
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)
 
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
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
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
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
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...
 
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
 
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
 
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
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 

Rubymanor - Nanite talk

  • 2. Background processing • Work should be moved to the background to stop application server load • This keeps website responsive • Useful for: images, videos, web services, slow database queries....anything that isn’t quick!
  • 3.
  • 4.
  • 5. Current background offerings • Fork into background of rails process • eg spawn, run_later • Record to database (or file) and background daemon picks up from there • eg background_job, delayed_job • Fork onto some kind of queue • eg backgroundRB, beanstalk, starling with workling
  • 6. Introducing Nanite • Developed by EngineYard • Gives presence - we know what’s available • Handles failure • Instant scalability • Event based architecture
  • 7. Pre-reqs • Erlang • Not R12B5 (the version installed by MacPorts) • RabbitMQ • Untar to erlang lib directory - most likely /usr/local/lib/erlang/lib
  • 8. AMQP • Advanced Message Queuing Protocol • Enterprise quality protocol developed by several financial institutions • Includes wire protocol to ensure language neutral • RabbitMQ implements AMQP 0.8
  • 9. Installing AMQP for Ruby $ sudo gem install eventmachine $ git clone git://github.com/tmm1/amqp.git $ cd amqp && rake gem && sudo gem install amqp-<version>.gem
  • 10.
  • 11. Nanite NA A Nanite Thin Actor a M M App ni Q Q Nanite Server te P P Actor Nanite Mappers m e s s a g e s Nanite Agents NA A Nanite Ruby a M M Actor Script ni Q Q Nanite te P P Actor
  • 12. Nanite Mappers • Control and track work • Unlimited number can be run that get updates from mapper exchange • mapper exchange itself is just a heartbeat and registration MQ • Run either inside Rails/MERB app (on Thin) or via command line
  • 13. Nanite Agents • Do the work • A given nanite agent can have multiple actors • Scale by adding more agents • Pings the mapper exchange every @ping_time seconds to report health
  • 14. Nanite Actors class Manor < Nanite::Actor expose :name def name(vars) # Do something interesting here :result => “RubyManor” end end Nanite::Dispatcher.register(Manor.new)
  • 15. Agent directory structure + myagent + actors - manor.rb + files - init.rb - config.yml
  • 16. Agent config.yml --- :vhost: /nanite # Allow multiple agents with different queues [compulsory] :user: nanite # Username for queue :pass: testing # Password for queue :identity: barney # Can be auto-generated but useful to send work to specific # agents :file_root: path # where to store any transfered files :format: marshal # or :json # Additional options include host and port. All options can be passed into # nanite command so can avoid config file if want
  • 17.
  • 18. Getting Started... • Start RabbitMQ • /usr/local/lib/erlang/lib/rabbitmq/sbin/rabbitmq- server • On first run nanite/bin/rabbitconf • Sets up RabbitMQ with a vhost and users for that vhost (more on this later)
  • 19. Starting agents • cd <agentdir> && <nanite basedir>/bin/ nanite • I’ve been using: cd <agentdir> && <nanite basedir>/bin/ nanite -t <identity> & • Could be managed better through a daemon/monitoring system though
  • 20. Offloading work to Nanite • Use the following code: Nanite.request(callable, params = ‘’, options = {}) {|res| # use res to do something} • callable is the actor and method - eg ‘/manor/ name’ • params are parameters for the callable method - eg ‘2008’ • options includes timeout, target and the routing algorithm - more on this later
  • 21. Interfaces into the Mappers • Via console: • nanite/nanite-mapper -i • Via command line: • See nanite/examples/cli.rb • Via Rails/MERB app: • See next slide....
  • 22. Rails/MERB & Nanite # Updates the user def update ... if (@user.save) Nanite.request(‘/updates/twitter’, ‘georgio_1999’) {|res| # This block won’t execute until the event fires @user.status = res[:status] @user.save } end end def ajax_call # Must use database for state and not Nanite job end
  • 23.
  • 24. Allocation of work • The pings are used by the mappers to find the healthiest nanite agents • If a nanite agent doesn’t ping inside a window it is removed from the active list (until it does ping again) • perfect for busy or error hit nanites • The default routing algorithm is based on server load
  • 25. Routing options • In options argument of Nanite.request you can choose: • selector • :least_loaded (default), :all, :random, :rr • target - use this to target a specific agent • timeout - override the default timeout (60s)
  • 26. Custom algorithms • Nanites report state with their ping • By default this is the server load • Can override this by adding code to agent init.rb • Nanite.status_proc = lambda { MyApp.some_statistic_indicating_load } • Must be comparable • Can use with existing routing algorithms or create own more complex ones
  • 27.
  • 28. File transfers • Nanite can handle file transmission • Agents subscribe (for all actors) in init.rb or Actors subscribe individually: • Nanite.subscribe_to_files(domain) • Mappers send via: • Nanite.broadcast_file(filepath, opts) • where opts can contain :domain and :destination (destination filename)
  • 29.
  • 30. The beauty of JSON • Nanite is built on top of AMQP, so if the queue items are serialised using JSON... • Then Nanite isn’t needed at the agent side • Any AMQP implementing daemon can read message and respond • Useful for legacy code (or legacy people)
  • 31.
  • 32. Understanding Security • Security is implemented using RabbitMQ’s vhosts and username/passwords • The username/password is defined in config.yml for each nanite • Need to configure RabbitMQ using the rabbitmqctl command • Generally one vhost per application
  • 33.
  • 34. Let’s play • cd <git_resources>/nanite/examples/myagent • ../../bin/nanite -t <identity> -h <host> • Let’s use fullname for identity - eg georgepalmer • Should see something like: # subscribing to file broadcasts for foobar # loading actor: /Users/georgepalmer/work/git_resources/nanite/examples/myagent/actors/gems.rb # loading actor: /Users/georgepalmer/work/git_resources/nanite/examples/myagent/actors/mock.rb # quot;advertise_servicesquot; # [quot;/gems/listquot;, quot;/mock/listquot;]
  • 35. Resources • RabbitMQ: http://www.rabbitmq.com • Ruby AMQP with RabbitMQ tutorial: http://hopper.squarespace.com/blog/2008/7/22/simple-amqp-library-for-ruby.html • Nanite: http://github.com/ezmobius/nanite • Doc isn’t great, code is very readable