open a window, see the clouds - teched 2011
DESCRIPTION
Palestra realizada no TechEd 2011 em São Paulo.TRANSCRIPT
Open a Window, see the clouds
Rafael Dohmsphoto credit: Denis Grzetic
Azure e PHP
Friday, September 30, 2011
Rafael Dohms
Evangelista PHP, membro ativo da Comunidade PHP e certificado ZCE. Ele ajudou na fundação de dois Grupos de Usuários de PHP ao longo do tempo e hoje compartilha a coordenação do PHPSP. Desenvolvedor, gamer e apaixonado por código ele também é host do primeiro podcast de PHP do Brasil: PHPSPCast.
Atualmente ele trabalha na equipe SWAT do grupo MIH, uma equipe de experts que fornecem conhecimento técnico para o grupo além de trabalhar com P&D buscando novos nichos da internet e tecnologia. Seu papel como Desenvolvedor Sênior é codar, treinar e auxiliar outras empresas e se divertir enquanto faz isso.
phot
o cr
edit:
Rob
Alle
n
Friday, September 30, 2011
OLHANDO PELA JANELA
•O que é a nuvem?
• Por que escolher a nuvem?
• Vamos conhecer o Windows Azure com PHP
• Como isso vai afetar meu código?
Friday, September 30, 2011
O QUE É A NUVEM?não é só mais uma palavra no buzzword bingo
Friday, September 30, 2011
HOSPEDAGEM COMUM
• Conta compartilhada, VPS ou máquina local
• Uma máquina, em um local
• Pagamento mensal
Friday, September 30, 2011
HOSPEDAGEM COMUM
• Conta compartilhada, VPS ou máquina local
• Uma máquina, em um local
• Pagamento mensal
Própria
Friday, September 30, 2011
COMPUTAÇÃO NA NUVEM
• Menos “apego físico” (virtualização)
• Uma ou mais máquinas ou “instancias”
• Geograficamente espalhada
• Pagamento por hora/recurso
• “abstração” de recursos
• 3 Sabores: IaaS, PaaS, SaaS
Friday, September 30, 2011
Hardware/Rede
Sistema Operacional
Software
Aplicação
Dados
Friday, September 30, 2011
Hardware/Rede
Sistema Operacional
Software
Aplicação
Dados
UpgradesConfiguração
ApacheMySQL
Resfriamento Cabeamento
DesenvolvimentoPublicação
Armazenamento Compartilhar
Friday, September 30, 2011
IaaS“Infrastructure as a Service”
Hardware/Rede
Sistema Operacional
Software
Aplicação
Dados
“Infraestrutura como Serviço”
Friday, September 30, 2011
IaaS“Infrastructure as a Service”
Hardware/Rede
Sistema Operacional
Software
Aplicação
Dados
você
eles
“Infraestrutura como Serviço”
Friday, September 30, 2011
PaaS“Platform as a Service”
Hardware/Rede
Sistema Operacional
Software
Aplicação
Dados
você
eles
“Plataforma como Serviço”
Friday, September 30, 2011
SaaS“Software as a Service”
Hardware/Rede
Sistema Operacional
Software
Aplicação
Dadosvocê
eles
“Software como Serviço”
Friday, September 30, 2011
IaaS Paas SaaS
custos
gerenciamento do servidor
gerenciamento do software
publicação da aplicação
Friday, September 30, 2011
POR QUE ESCOLHER A NUVEM?Quais são as vantagens de escolher a nuvem?
X
Friday, September 30, 2011
tempo
trafego
O MODELO CONTA DE LUZ
Friday, September 30, 2011
tempo
trafego
O MODELO CONTA DE LUZ
Friday, September 30, 2011
tempo
trafego
pico
O MODELO CONTA DE LUZ
Friday, September 30, 2011
tempo
trafego
pico
O MODELO CONTA DE LUZ
Friday, September 30, 2011
tempo
trafego
pico
O MODELO CONTA DE LUZ
Friday, September 30, 2011
DISPONIBILIDADE
Friday, September 30, 2011
DISPONIBILIDADE
Friday, September 30, 2011
DISPONIBILIDADE
Friday, September 30, 2011
ESCALABILIDADEComputação sem estado + Armazenamento durável
Friday, September 30, 2011
ESCALABILIDADEComputação sem estado + Armazenamento durável
Friday, September 30, 2011
OLHANDO POR DENTRO
Friday, September 30, 2011
Fabric
StorageCompute
Windows Azure
Friday, September 30, 2011
AppFabric
Fabric
developer
Middleware, usado para desenvolver, testar, publicar e gerenciar sua aplicação.
Friday, September 30, 2011
Fabric
StorageCompute
Friday, September 30, 2011
Compute
Web Role Worker Role VM Role
Aplicação Web rodando sobre o
IIS
Processamento em plano de fundo
Máquina virtual de Windows Server 2008 carregada sob demanda
Friday, September 30, 2011
Fabric
StorageCompute
Friday, September 30, 2011
Storage
Table Storage Blob Storage QueueSQL Azure
Compatível com o SQL Server
Armazenamento estruturado
Texto e dados binários
Troca de mensagens entre o Web e o Worker
CDN
Armazenamento de dados
Versão cacheada de qualquer recurso
com uma URI
Friday, September 30, 2011
PRONTO PRA RODAR
• Requisitos:
• IIS7 e ferramentas
• Azure SDK (instala o DevAppFabric, o simulador de azure)
• Command Line Tools (linha de comando)
• Command line tools for PHP
para Desenvolver e Publicar
Friday, September 30, 2011
CAIXA DE FERRAMENTAS
• Command Line tools for PHP
• Cria o pacote da aplicação e roda no emulador, simulando o computacional e o armazenamento.
• Azure Tools para Eclipse
• Torna a maioria dos processos “next, next finish” e fornece uma IDE completa.
Friday, September 30, 2011
Am
biente do Desenvolvedor
Window
Azure
CódigoSimulador Azure (Dev fabric)
Ferramentas de empacotamento(linha de comando ou eclipse)
Azure(AppFabric)
SQLAzure Storage
Pacote + Configuração do Serviço
Friday, September 30, 2011
Am
biente do Desenvolvedor
Window
Azure
CódigoSimulador Azure (Dev fabric)
Ferramentas de empacotamento(linha de comando ou eclipse)
Azure(AppFabric)
SQLAzure Storage
Pacote + Configuração do Serviço
PHP
Friday, September 30, 2011
Am
biente do Desenvolvedor
Window
Azure
CódigoSimulador Azure (Dev fabric)
Ferramentas de empacotamento(linha de comando ou eclipse)
Azure(AppFabric)
SQLAzure Storage
Pacote + Configuração do Serviço
PHP
Friday, September 30, 2011
Am
biente do Desenvolvedor
Window
Azure
CódigoSimulador Azure (Dev fabric)
Ferramentas de empacotamento(linha de comando ou eclipse)
Azure(AppFabric)
SQLAzure Storage
Pacote + Configuração do Serviço
PHP php package.php --project="twitter-azure" --target="c:\azure-build" --source="C:\twitter-azure" --defaultDoc="public/index.php" --phpRuntime="C:\Program Files (x86)\PHP\v5.3" --cleanRebuild --runDevFabric
Friday, September 30, 2011
Am
biente do Desenvolvedor
Window
Azure
CódigoSimulador Azure (Dev fabric)
Ferramentas de empacotamento(linha de comando ou eclipse)
Azure(AppFabric)
SQLAzure Storage
Pacote + Configuração do Serviço
PHP
Friday, September 30, 2011
O BOM
• APIs em REST
• Armazenamento
•Diagnósticos
•BD Relacional: SQL Azure
• Arquitetura por “Roles”
Friday, September 30, 2011
O RUIM
• Gerenciamento apenas pelo Windows
• Sem Emulador Azure para SO não-Windows
• Sem ferramentas de empacotamento para SO não-Windows
Friday, September 30, 2011
COMO ISSO AFETA MEU CÓDIGO?Que ferramentas podemos usar e como devemos desenhar
nossas aplicações?
Friday, September 30, 2011
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Sem ArmazenamentoLocal
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Sem ArmazenamentoLocal
Compartilhamento de sessão
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Sem ArmazenamentoLocal
Worker Roles
Compartilhamento de sessão
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Sem ArmazenamentoLocal
Worker Roles
Compartilhamento de sessão
Filas
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Armazenamento
Sem ArmazenamentoLocal
Worker Roles
Compartilhamento de sessão
Filas
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Armazenamento
Sem ArmazenamentoLocal
Worker Roles
Compartilhamento de sessão
Filas
Que tipo?
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Armazenamento
Sem ArmazenamentoLocal
Worker Roles
Compartilhamento de sessão
Filas
Que tipo?Tabela / Blob
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Armazenamento
Sem ArmazenamentoLocal
Worker Roles
Compartilhamento de sessão
Filas
Que tipo?Tabela / Blob Framework ou PHP SDK
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Armazenamento
Sem ArmazenamentoLocal
Worker Roles
Compartilhamento de sessão
Filas
Que tipo?Banco de Dados
Relacional
Tabela / Blob Framework ou PHP SDK
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
Código PHP rodando no IIS/Windows
Arquitetura
Armazenamento
Sem ArmazenamentoLocal
Worker Roles
Compartilhamento de sessão
Filas
Que tipo?Banco de Dados
Relacional
Tabela / Blob
Migrar para SQL Azure
Framework ou PHP SDK
Escalando a aplicação
COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
FRAMEWORKS PRONTOS PARA O AZURE
Friday, September 30, 2011
O QUE FAZ ELE SER COMPATÍVEL?
Roda usando PHP no Windows?
Tem wrappers das APIs?
É compatível com MS SQL Server?
Código
Ferramentas
Banco de Dados
Friday, September 30, 2011
• Blobs, Tables e Queues (operações CRUD)
• Classes auxiliares para transporte HTTP, AuthN/AuthZ, REST and Gerenciamento de Erros
• Gerenciamento, Instrumentação e supporte a logs
• Não testado, mas deve funcionar.
Ferramentas
Banco de Dados
Friday, September 30, 2011
•Drivers de MS-SQL* são compatíveis com SQLAzure
Powered by Doctrine:
Banco de Dados
* Usando pdo_sql_server, possivelmente o pdo_dblib
Friday, September 30, 2011
• PHP roda normalmente no Azure, qualquer framework vai funcionar.
•Outras ferramentas para se comunicar com recursos como: BD, Filas etc...
• Estes aqui já foram testados!
Friday, September 30, 2011
AZURE PHP SDK
• Serviços:
•Blob Storage
•Table Storage
•Queue Storage
•Diagnostic Tools
• Compatível com PHP 5+
Friday, September 30, 2011
SAINDO PELA JANELA
• Aplicação de teste: “Twitter RT Calculator”
• Objetivo: Analisar sues últimos tweets, verificar quais foram re-tuitados e fazer cálculos baseado em palavras e localizações.
• Exemplificar a migração:
• Banco de dados: MySQL > SQLAzure
• Mover o processamento para um Worker Role e usar a Fila
Aplicação de teste para ilustrar
Friday, September 30, 2011
SAINDO PELA JANELA
• Aplicação de teste: “Twitter RT Calculator”
• Objetivo: Analisar sues últimos tweets, verificar quais foram re-tuitados e fazer cálculos baseado em palavras e localizações.
• Exemplificar a migração:
• Banco de dados: MySQL > SQLAzure
• Mover o processamento para um Worker Role e usar a Fila
Aplicação de teste para ilustrar
Friday, September 30, 2011
Twitter OAuth
Segura ai..
Friday, September 30, 2011
Twitter OAuth
Segura ai..
Friday, September 30, 2011
Twitter OAuth
Segura ai..
Friday, September 30, 2011
Twitter OAuth
Segura ai..
MySQL
Friday, September 30, 2011
Twitter OAuth
Segura ai..
Resultados
MySQL
Friday, September 30, 2011
Twitter OAuth
Segura ai..
Resultados
MySQL
Friday, September 30, 2011
Twitter OAuth
Segura ai..
Resultados
MySQL
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Queue
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Worker
Queue
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Worker
Queue
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Worker
Queue
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Worker
SQLAzure
Queue
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Worker
SQLAzure
Queue
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Resultados
Worker
SQLAzure
Queue
Friday, September 30, 2011
Twitter OAuth
Te ligo mais tarde..
Resultados
Worker
SQLAzure
Queue
WorkerWorkerWorkerWorkerWorkerWorkerWorkerWorkerWorkerWorker
Friday, September 30, 2011
USANDO SQLAZURE
doctrine.dbal.connection_options: driver: pdo_sqlsrv dbname: twitter-sample-app host: pl69qjwy8k.database.windows.net port: 1433 user: rdohmsDemo@pl69qjwy8k password: *password*
PDO MSSQL Driver
Friday, September 30, 2011
TODOS PARA A FILA //Add user to our Queue $qItem = new \stdClass(); $qItem->twitter_handle = $twitterInfo->screen_name; $qManager = new Azure\Queue($this->getApp()->getConfig('azure')); $qManager->addToQueue($qItem);
Friday, September 30, 2011
TODOS PARA A FILA //Add user to our Queue $qItem = new \stdClass(); $qItem->twitter_handle = $twitterInfo->screen_name; $qManager = new Azure\Queue($this->getApp()->getConfig('azure')); $qManager->addToQueue($qItem);
$this->client = new \Zend_Service_WindowsAzure_Storage_Queue( $qConfig['host'], $qConfig['accountName'], $qConfig['accountKey'] );
$this->queue = $this->getQueueInstance($queueName); __contruct()
Friday, September 30, 2011
TODOS PARA A FILA //Add user to our Queue $qItem = new \stdClass(); $qItem->twitter_handle = $twitterInfo->screen_name; $qManager = new Azure\Queue($this->getApp()->getConfig('azure')); $qManager->addToQueue($qItem);
$this->client = new \Zend_Service_WindowsAzure_Storage_Queue( $qConfig['host'], $qConfig['accountName'], $qConfig['accountKey'] );
$this->queue = $this->getQueueInstance($queueName);
public function addToQueue($item) { $this->client->putMessage($this->queue->name, serialize($item)); }
__contruct()
Friday, September 30, 2011
PRIMEIRO QUE ENTRA, PRIMEIRO
QUE SAI
while (true){ try{ $this->logAction("Checking for messages..."); //Read Queue $qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again if ($qMessage === null){ $this->logAction("No pending messages..."); sleep(3); continue; }
//Retrieve User {... doctrine query for stored twitter handle ...}
//Clear Message $this->logAction("Removing message form queue..."); $qManager->deleteMessage($qMessage);
//Process User $this->processUser($user);
//Warn User $this->sendWarning($user);
} catch (\Exception $e) { $this->logAction("Exception found:" .$e->getMessage()); } $this->logAction("Initiating sleep for next loop."); sleep(2); }
Friday, September 30, 2011
PRIMEIRO QUE ENTRA, PRIMEIRO
QUE SAI
while (true){ try{ $this->logAction("Checking for messages..."); //Read Queue $qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again if ($qMessage === null){ $this->logAction("No pending messages..."); sleep(3); continue; }
//Retrieve User {... doctrine query for stored twitter handle ...}
//Clear Message $this->logAction("Removing message form queue..."); $qManager->deleteMessage($qMessage);
//Process User $this->processUser($user);
//Warn User $this->sendWarning($user);
} catch (\Exception $e) { $this->logAction("Exception found:" .$e->getMessage()); } $this->logAction("Initiating sleep for next loop."); sleep(2); }
Friday, September 30, 2011
PRIMEIRO QUE ENTRA, PRIMEIRO
QUE SAI
while (true){ try{ $this->logAction("Checking for messages..."); //Read Queue $qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again if ($qMessage === null){ $this->logAction("No pending messages..."); sleep(3); continue; }
//Retrieve User {... doctrine query for stored twitter handle ...}
//Clear Message $this->logAction("Removing message form queue..."); $qManager->deleteMessage($qMessage);
//Process User $this->processUser($user);
//Warn User $this->sendWarning($user);
} catch (\Exception $e) { $this->logAction("Exception found:" .$e->getMessage()); } $this->logAction("Initiating sleep for next loop."); sleep(2); }
public function getMessage() { $messages = $this->client->getMessages($this->queue->name, 1); if (count($messages) > 0){ $qMessage = array_shift($messages); $message = new \stdClass(); $message->qMessage = $qMessage; $message->decoded = unserialize($qMessage->messagetext); return $message; } return null; }
Friday, September 30, 2011
PRIMEIRO QUE ENTRA, PRIMEIRO
QUE SAI
while (true){ try{ $this->logAction("Checking for messages..."); //Read Queue $qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again if ($qMessage === null){ $this->logAction("No pending messages..."); sleep(3); continue; }
//Retrieve User {... doctrine query for stored twitter handle ...}
//Clear Message $this->logAction("Removing message form queue..."); $qManager->deleteMessage($qMessage);
//Process User $this->processUser($user);
//Warn User $this->sendWarning($user);
} catch (\Exception $e) { $this->logAction("Exception found:" .$e->getMessage()); } $this->logAction("Initiating sleep for next loop."); sleep(2); }
public function getMessage() { $messages = $this->client->getMessages($this->queue->name, 1); if (count($messages) > 0){ $qMessage = array_shift($messages); $message = new \stdClass(); $message->qMessage = $qMessage; $message->decoded = unserialize($qMessage->messagetext); return $message; } return null; }
array( 'messageid' => $messageId, 'insertiontime' => $insertionTime, 'expirationtime' => $expirationTime, 'popreceipt' => $popReceipt, 'timenextvisible' => $timeNextVisible, 'dequeuecount' => $dequeueCount, 'messagetext' => $messageText );
Friday, September 30, 2011
PRIMEIRO QUE ENTRA, PRIMEIRO
QUE SAI
while (true){ try{ $this->logAction("Checking for messages..."); //Read Queue $qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again if ($qMessage === null){ $this->logAction("No pending messages..."); sleep(3); continue; }
//Retrieve User {... doctrine query for stored twitter handle ...}
//Clear Message $this->logAction("Removing message form queue..."); $qManager->deleteMessage($qMessage);
//Process User $this->processUser($user);
//Warn User $this->sendWarning($user);
} catch (\Exception $e) { $this->logAction("Exception found:" .$e->getMessage()); } $this->logAction("Initiating sleep for next loop."); sleep(2); }
Friday, September 30, 2011
PRIMEIRO QUE ENTRA, PRIMEIRO
QUE SAI
while (true){ try{ $this->logAction("Checking for messages..."); //Read Queue $qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again if ($qMessage === null){ $this->logAction("No pending messages..."); sleep(3); continue; }
//Retrieve User {... doctrine query for stored twitter handle ...}
//Clear Message $this->logAction("Removing message form queue..."); $qManager->deleteMessage($qMessage);
//Process User $this->processUser($user);
//Warn User $this->sendWarning($user);
} catch (\Exception $e) { $this->logAction("Exception found:" .$e->getMessage()); } $this->logAction("Initiating sleep for next loop."); sleep(2); }
Após 20 segundos, a mensagem volta para a fila
Friday, September 30, 2011
SAINDO PELA JANELA
• Veja todas mudanças: github.com/rdohms/Sample-Azure-App
• Compare estes branches:
non-cloud-version x cloud-designed-version
Friday, September 30, 2011
FECHANDO A JANELA
•Descobrimos o que é a nuvem
• Vimos razões por que escolher a nuvem
• Conhecemos o Windows Azure e seus recursos
•Olhamos rapidamente em como isso afeta nosso código
Friday, September 30, 2011
LEITURA COMPLEMENTAR...
PHP Development in the Cloud
ISBN: 9780981034522Pages: 172Authors: Ivo Jansch and Vito Chin
http://bit.ly/i9Awk0
Friday, September 30, 2011
COMECE A BRINCAR..
• Conta de teste gratuita: WindowsAzurePass.com
http://azurephp.comhttp://phpazure.codeplex.com/
http://azurephptools.codeplex.com/http://www.ben-waine.co.uk/blog/php-azure
http://marvelley.com/category/php/php-on-azure/
Friday, September 30, 2011
twitter.com/rdohmshttp://doh.ms
Perguntas?
http://slides.doh.ms
Friday, September 30, 2011