Mais conteúdo relacionado
TDC 2011 - Open a Window, see the clouds
- 1. Open a Window, see the clouds
Rafael Dohms photo credit: Denis Grzetic
Saturday, July 9, 2011
- 2. Rafael Dohms
photo credit: Eli White
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.
Saturday, July 9, 2011
- 3. OLHANDO PELA JANELA
•O que é a nuvem?
• Por que escolher a nuvem?
• Vamos conhecer o Windows Azure
• Como isso vai afetar meu código?
Saturday, July 9, 2011
- 4. O QUE É A NUVEM?
não é só mais uma palavra no buzzword bingo
Saturday, July 9, 2011
- 5. HOSPEDAGEM COMUM
• Conta compatilhada, VPS ou
máquina local
• Uma máquina, um local
• Pagamento mensal
Saturday, July 9, 2011
- 6. Própria
HOSPEDAGEM COMUM
• Conta compatilhada, VPS ou
máquina local
• Uma máquina, um local
• Pagamento mensal
Saturday, July 9, 2011
- 7. 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
Saturday, July 9, 2011
- 8. Dados
Aplicação
Software
Sistema Operacional
Hardware/Rede
Saturday, July 9, 2011
- 9. Armazenamento Dados Compartilhar
Publicação Aplicação Desenvolvimento
MySQL Software Apache
Configuração Sistema Operacional Upgrades
Resfriamento Hardware/Rede Cabeamento
Saturday, July 9, 2011
- 10. IaaS a Service”
“Infrastructure as
“Infraestrutura como Serviço”
Dados
Aplicação
Software
Sistema Operacional
Hardware/Rede
Saturday, July 9, 2011
- 11. IaaS a Service”
“Infrastructure as
“Infraestrutura como Serviço”
Dados
Aplicação
Software
Sistema Operacional você
eles
Hardware/Rede
Saturday, July 9, 2011
- 12. PaaS
“Platform as a Service”
“Plataforma como Serviço”
Dados
Aplicação
Software
Sistema Operacional
Hardware/Rede
Saturday, July 9, 2011
- 13. PaaS
“Platform as a Service”
“Plataforma como Serviço”
Dados
Aplicação você
eles
Software
Sistema Operacional
Hardware/Rede
Saturday, July 9, 2011
- 14. SaaS
“Software as a Service”
“Software como Serviço”
Dados
Aplicação
Software
Sistema Operacional
Hardware/Rede
Saturday, July 9, 2011
- 15. SaaS
“Software as a Service”
“Software como Serviço”
Dados você
eles
Aplicação
Software
Sistema Operacional
Hardware/Rede
Saturday, July 9, 2011
- 16. X
POR QUE ESCOLHER A NUVEM?
Quais são as vantagens de escolher a nuvem?
Saturday, July 9, 2011
- 17. trafego
tempo
O MODELO CONTA DE LUZ
Saturday, July 9, 2011
- 18. trafego
tempo
O MODELO CONTA DE LUZ
Saturday, July 9, 2011
- 19. trafego
pico
tempo
O MODELO CONTA DE LUZ
Saturday, July 9, 2011
- 20. trafego
pico
tempo
O MODELO CONTA DE LUZ
Saturday, July 9, 2011
- 21. trafego
pico
tempo
O MODELO CONTA DE LUZ
Saturday, July 9, 2011
- 22. IaaS Paas SaaS
custos
gerenciamento do
servidor
gerenciamento do
software
publicação da
aplicação
Saturday, July 9, 2011
- 26. ESCALABILIDADE
Computação sem estado + Armazenamento durável
Saturday, July 9, 2011
- 27. ESCALABILIDADE
Computação sem estado + Armazenamento durável
Saturday, July 9, 2011
- 30. Fabric
Middleware, usado para desenvolver, testar, publicar e
gerenciar sua aplicação.
AppFabric
developer
Saturday, July 9, 2011
- 31. Fabric
Compute Storage
Saturday, July 9, 2011
- 32. Compute
Web Role Worker Role VM Role
Máquina virtual de
Aplicação Web
Processamento em Windows Server
rodando sobre o
plano de fundo 2008 carregada
IIS
sob demanda
Saturday, July 9, 2011
- 33. Fabric
Compute Storage
Saturday, July 9, 2011
- 34. Versão cacheada de
CDN qualquer recurso
com uma URI
Storage
Armazenamento de dados
Table Storage Blob Storage SQL Azure Queue
Troca de
Armazenamento Texto e dados Compatível com o
mensagens entre o
estruturado binários SQL Server
Web e o Worker
Saturday, July 9, 2011
- 35. PRONTO PRA RODAR
para Desenvolver e Publicar
• Requisitos:
• IIS7 e ferramentas
• Azure SDK (instala o DevAppFabric, o simulador de
azure)
• Command Line Tools (linha de comando)
• Command line tools for PHP
Saturday, July 9, 2011
- 36. 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.
Saturday, July 9, 2011
- 37. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
Ferramentas de empacotamento
(linha de comando ou eclipse)
Pacote + Configuração
do Serviço
Azure
Window Azure
(AppFabric)
SQLAzure Storage
Saturday, July 9, 2011
- 38. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
PHP
Ferramentas de empacotamento
(linha de comando ou eclipse)
Pacote + Configuração
do Serviço
Azure
Window Azure
(AppFabric)
SQLAzure Storage
Saturday, July 9, 2011
- 39. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
PHP
Ferramentas de empacotamento
(linha de comando ou eclipse)
Pacote + Configuração
do Serviço
Azure
Window Azure
(AppFabric)
SQLAzure Storage
Saturday, July 9, 2011
- 40. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
php package.php
PHP
--project="twitter-azure"
Ferramentas de empacotamento
--target="c:azure-build" de comando ou eclipse)
(linha
--source="C:twitter-azure"
Pacote + Configuração
do Serviço --defaultDoc="public/index.php"
--phpRuntime="C:Program Files (x86)PHPv5.3"
--cleanRebuild
--runDevFabric Azure
Window Azure
(AppFabric)
SQLAzure Storage
Saturday, July 9, 2011
- 41. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
PHP
Ferramentas de empacotamento
(linha de comando ou eclipse)
Pacote + Configuração
do Serviço
Azure
Window Azure
(AppFabric)
SQLAzure Storage
Saturday, July 9, 2011
- 42. O BOM
• APIs em REST
• Armazenamento
• Diagnósticos
• BD Relacional: SQL Azure
• Arquitetura por “Roles”
Saturday, July 9, 2011
- 43. O RUIM
• Gerenciamento apenas
pelo Windows
• Sem Emulador Azure
para SO não-Windows
• Sem ferramentas de
empacotamento para
SO não-Windows
Saturday, July 9, 2011
- 44. COMO ISSO AFETA MEU CÓDIGO?
Que ferramentas podemos usar e como devemos desenhar
nossas aplicações?
Saturday, July 9, 2011
- 45. COM O QUE DEVO ME PREOCUPAR?
Saturday, July 9, 2011
- 46. COM O QUE DEVO ME PREOCUPAR?
Código
Saturday, July 9, 2011
- 47. COM O QUE DEVO ME PREOCUPAR?
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 48. COM O QUE DEVO ME PREOCUPAR?
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 49. COM O QUE DEVO ME PREOCUPAR?
Escalando a
aplicação
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 50. COM O QUE DEVO ME PREOCUPAR?
Escalando a Sem Armazenamento
aplicação Local
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 51. COM O QUE DEVO ME PREOCUPAR?
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 52. COM O QUE DEVO ME PREOCUPAR?
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 53. COM O QUE DEVO ME PREOCUPAR?
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 54. COM O QUE DEVO ME PREOCUPAR?
Armazenamento
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 55. COM O QUE DEVO ME PREOCUPAR?
Que tipo?
Armazenamento
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 56. COM O QUE DEVO ME PREOCUPAR?
Tabela / Blob
Que tipo?
Armazenamento
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 57. COM O QUE DEVO ME PREOCUPAR?
Tabela / Blob Framework ou PHP SDK
Que tipo?
Armazenamento
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 58. COM O QUE DEVO ME PREOCUPAR?
Tabela / Blob Framework ou PHP SDK
Que tipo?
Banco de
Dados
Armazenamento Relacional
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 59. COM O QUE DEVO ME PREOCUPAR?
Tabela / Blob Framework ou PHP SDK
Que tipo?
Banco de Migrar para SQL Azure
Dados
Armazenamento Relacional
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Saturday, July 9, 2011
- 61. O QUE FAZ ELE SER
COMPATÍVEL?
Código Roda usando PHP no Windows?
Ferramentas Tem wrappers das APIs?
Banco de Dados É compatível com MS SQL Server?
Saturday, July 9, 2011
- 62. Ferramentas
• 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
Banco de Dados
• Não testado, mas deve
funcionar.
Saturday, July 9, 2011
- 63. Banco de Dados
• Drivers de MS-SQL* são
compatíveis com
SQLAzure
* Usando pdo_sql_server, possivelmente o pdo_dblib
Powered by Doctrine:
Saturday, July 9, 2011
- 64. • 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!
Saturday, July 9, 2011
- 65. AZURE PHP SDK
• Serviços:
• Blob Storage
• Table Storage
• Queue Storage
• Diagnostic Tools
• Compatível com PHP 5+
Saturday, July 9, 2011
- 66. SAINDO PELA JANELA
Aplicação de teste para ilustrar
• 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
Saturday, July 9, 2011
- 67. SAINDO PELA JANELA
Aplicação de teste para ilustrar
• 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
Saturday, July 9, 2011
- 72. Twitter OAuth
Segura ai..
MySQL
Resultados
Saturday, July 9, 2011
- 73. Twitter OAuth
Segura ai..
MySQL
Resultados
Saturday, July 9, 2011
- 74. Twitter OAuth
Segura ai..
MySQL
Resultados
Saturday, July 9, 2011
- 76. Twitter OAuth
Queue
Te ligo mais tarde..
Saturday, July 9, 2011
- 77. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Saturday, July 9, 2011
- 78. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Saturday, July 9, 2011
- 79. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Saturday, July 9, 2011
- 80. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
SQLAzure
Saturday, July 9, 2011
- 81. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
SQLAzure
Saturday, July 9, 2011
- 82. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Resultados
SQLAzure
Saturday, July 9, 2011
- 83. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Resultados
SQLAzure
Saturday, July 9, 2011
- 84. USANDO SQLAZURE
PDO MSSQL Driver
doctrine.dbal.connection_options:
driver: pdo_sqlsrv
dbname: twitter-sample-app
host: pl69qjwy8k.database.windows.net
port: 1433
user: rdohmsDemo@pl69qjwy8k
password: *password*
Saturday, July 9, 2011
- 85. TODOS PARA A FILA
//Add user to our Queue
$qItem = new stdClass();
$qItem->twitter_handle = $twitterInfo->screen_name;
$qManager = new AzureQueue($this->getApp()->getConfig('azure'));
$qManager->addToQueue($qItem);
Saturday, July 9, 2011
- 86. TODOS PARA A FILA
//Add user to our Queue
$qItem = new stdClass();
$qItem->twitter_handle = $twitterInfo->screen_name;
$qManager = new AzureQueue($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()
Saturday, July 9, 2011
- 87. TODOS PARA A FILA
//Add user to our Queue
$qItem = new stdClass();
$qItem->twitter_handle = $twitterInfo->screen_name;
$qManager = new AzureQueue($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()
public function addToQueue($item)
{
$this->client->putMessage($this->queue->name, serialize($item));
}
Saturday, July 9, 2011
- 88. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$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);
}
Saturday, July 9, 2011
- 89. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$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);
}
Saturday, July 9, 2011
- 90. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again
if ($qMessage === null){
$this->logAction("No pending messages...");
sleep(3);
continue; function getMessage()
public
} {
$messages = $this->client->getMessages($this->queue->name, 1);
//Retrieve User
{... doctrine query for stored twitter handle ...}
if (count($messages) > 0){
$qMessage = array_shift($messages);
//Clear Message
$this->logAction("Removing= message form queue...");
$message new stdClass();
$qManager->deleteMessage($qMessage); = $qMessage;
$message->qMessage
$message->decoded = unserialize($qMessage->messagetext);
//Process User
$this->processUser($user);
return $message;
}
//Warn User
$this->sendWarning($user);
return null;
} catch (Exception $e) {
}
$this->logAction("Exception found:" .$e->getMessage
}
$this->logAction("Initiating sleep for next loop.");
sleep(2);
}
Saturday, July 9, 2011
- 91. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again
if ($qMessage === null){
$this->logAction("No pending messages...");
sleep(3);
continue; function getMessage()
public
} {
$messages = $this->client->getMessages($this->queue->name, 1);
//Retrieve User
{... doctrine query for stored twitter handle ...}
if (count($messages) > 0){
$qMessage = array_shift($messages);
//Clear Message
$this->logAction("Removing= message form queue...");
$message new stdClass();
$qManager->deleteMessage($qMessage); = $qMessage;
$message->qMessage
$message->decoded = unserialize($qMessage->messagetext);
//Process User
$this->processUser($user);
return $message;
}
//Warn User
$this->sendWarning($user); array(
return null; 'messageid' => $messageId,
'insertiontime' => $insertionTime,
} catch (Exception $e) {
} 'expirationtime' => $expirationTime,
$this->logAction("Exception found:" .$e->getMessage
'popreceipt' => $popReceipt,
'timenextvisible' => $timeNextVisible,
}
'dequeuecount' => $dequeueCount,
'messagetext' => $messageText
$this->logAction("Initiating sleep for next loop.");
);
sleep(2);
}
Saturday, July 9, 2011
- 92. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$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);
}
Saturday, July 9, 2011
- 93. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$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); Após 20 segundos, a mensagem
//Process User volta para a fila
$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);
}
Saturday, July 9, 2011
- 94. SAINDO PELA JANELA
• Veja todas mudanças: github.com/rdohms/Sample-Azure-
App
• Compare estes branches:
non-cloud-version x cloud-designed-version
Saturday, July 9, 2011
- 95. 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
Saturday, July 9, 2011
- 96. LEITURA COMPLEMENTAR...
PHP Development in the
Cloud
ISBN: 9780981034522
Pages: 172
Authors: Ivo Jansch and Vito Chin
http://bit.ly/i9Awk0
Saturday, July 9, 2011
- 97. COMECE A BRINCAR..
• Conta de teste gratuita: WindowsAzurePass.com
• Procure o pessoal da Microsoft no evento
http://azurephp.com
http://phpazure.codeplex.com/
http://azurephptools.codeplex.com/
http://www.ben-waine.co.uk/blog/php-azure
http://marvelley.com/category/php/php-on-azure/
Saturday, July 9, 2011