41
Implementações paralelas Willian Molinari a.k.a PotHix

Implementações paralelas

Embed Size (px)

Citation preview

Implementações paralelasWillian Molinari

a.k.a PotHix

WTF

John Carmack

1996!!

https://github.com/id-Software

Várias formas de implementações paralelas

1. Substitution

Master

Código no branch principalclass VirtualMachine def name hypervisor_session.VM.get_name(uuid) end . . .end

Código código no branch novoclass VirtualMachine def name on_hypervisor.VM.get_name(uuid) end . . .end

Master NewFeature

Feature

"Virar a chave"

Dá para evitar?

2. Feature Toggle

2. Feature TogglePara adição de funcionalidade

Martin Fowler

http://martinfowler.com/bliki/FeatureToggle.html

Master

Merge

Feature1

Feature2

Feature3

Release

Martin Fowler

http://martinfowler.com/bliki/FeatureToggle.html

Nando Vieira

http://simplesideias.com.br/usando-presenters-no-rails/

2. Feature TogglePara várias implementações

Fabio Kung

http://fabiokung.com/2010/10/16/dsls-one-interface-multiple-implementations/

Qual a idéia?

module Resque class Consumer class << self def queue(name) @queue = name end

def timeout(seconds=nil) @lock_timeout = seconds unless seconds @lock_timeout || 1.hour end

def exclusive(param) @exclusive = param self.extend(Resque::Plugins::LockTimeout) if exclusive? @lock_timeout ||= 1.hour end def publish(message={}) Resque.enqueue(self, message) end . . . end endend

module ActiveMQ class Consumer class << self attr_reader :queue_name, :queued_process, :headers, :timeout_value

def queue(name) @queue_name = "/queue/#{name}" end

def timeout(seconds) @timeout_value = seconds end

def exclusive(param) @exclusive = param end

def publish(message = {}) client = Stomp::Client.new(NephelaeConfig[:broker].merge(:max_reconnect_attempts => 1)) client.publish(queue_name, message.to_yaml, { :persistent => true, :suppress_content_length => true }) end . . . end endend

require 'xmpp4r'module XMPP class Consumer class << self attr_reader :queue_name, :queued_process, :timeout_value

def queue(name) @queue_name = "#{name}@localhost" end

def timeout(seconds) @timeout_value = seconds end

def exclusive(param) @exclusive = param end

def publish(message={}) publisher_client.send(Jabber::Message.new(queue_name, message.to_yaml)) end . . . end endend

Consumer = ActiveMQ::Consumerapp/consumers/consumer.rb

Consumer = XMPP::Consumerapp/consumers/consumer.rb

app/consumers/consumer.rbConsumer = Resque::Consumer

Injeção de dependenciaMyQueue.new(Resque::Consumer)

Por configuração

3. Feature versioning

Ver1 Ver2

Manager

module Network class Ver1 def insert_filter_rule(filter_rule) filter_rule.firewalls.in_parallel do |firewall| ssh_executor = SSHExecutor.new(firewall.ip_address, 'sservice') result = ssh_executor.exec( :insert_filter_firewall_rules, :rule => filter_rule, :internal_address => filter_rule.ip_pair.private_ip, :firewall => firewall ) raise "Insertion failed: #{result[:out]}" if result[:status] != 0 end filter_rule.update_attribute(:status, :done) end def insert_dhcp_entry(vm) vm.zone.dhcps.in_parallel do |dhcp_server| result = dhcp_server.synchronize raise "DHCP failed: #{result[:out]}" if result[:status] != 0 end end endend

Ver1 Ver2

Manager

module Network class Ver2 def insert_filter_rule(filter_rule) quantum = Openstack::QuantumClient::L2l3.new(NephelaeConfig[:quantum]) quantum_response = quantum.filter_rule.create( filter_rule.filter_address, filter_rule.ip_pair.public_ip.to_s, filter_rule.filter_port, filter_rule.filter_protocol ) filter_rule.update_attribute(:quantum_uuid, quantum_response["filter_rule"]["id"]) end

def insert_dhcp_entry(vm) quantum = Openstack::QuantumClient::L2l3.new(NephelaeConfig[:quantum]) quantum_response = quantum.dhcp_entry.create(vm.public_ip.to_s, vm.mac, vm.name) endend

Ver1 Ver2

Manager

"1.0" "2.0"

module Network module Manager extend self

def for(versioning_object) versioning_object.version == "2.0" ? Network::Ver2.new : Network::Ver1.new end endend

module Network module Manager extend self

def for(versioning_object) versioning_object.version.constantize.new end endend

Network::Manager.for(pool).insert_filter_rule(virtual_machine)

ResumindoNo silver bullet

Custo X benefícioSua necessidade

Várias formas de atacar o problema

Perguntas?