Open a Window, see the clouds - TechEd 2011

Preview:

DESCRIPTION

Palestra realizada no TechEd 2011 em São Paulo.

Citation preview

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

OBRIGADO!rafael@doh.ms

twitter.com/rdohmshttp://doh.ms

Perguntas?

http://slides.doh.ms

Friday, September 30, 2011

Recommended