Desenvolvimento de aplicações para
a Cloud
Desenvolvimento de aplicações para
a Cloud
O serviço Blob
Cátia Vaz 2012 3
}
O serviço Blob é desenhado para armazenar um
conjunto largo de objectos binários , como
documentos, imagens, vídeos e músicas.
Esquema URL Tamanho
Máximo
Referência API
http://[StorageAccount].blob.core.
windows.net/[ContainerName]/[BlobName] 200GB(block blob)/1TB
(page blob)
http://msdn.microsoft.com/ en-us/library/dd135733.aspx
Blob Account
Cátia Vaz 2011/2012 4
Arquitectura do Serviço Storage
Cátia Vaz 2011/2012 5
Limitações e restrições do Blob
Cátia Vaz 2011/2012 6
}
As limitações de armazenamento do serviço Blob são as
seguintes:
}
O tamanho máximo de cada block blob é 200GB e cada página
blob é 1TB.
}
Para blobs com tamanho menor ou igual 64MB , o upload
necessita apenas de uma operação PUT. O upload de blobs
maiores terá de ser realizado como um conjunto de blocos, em
que cada bloco não pode ser maior do que 4MB .
}
O serviço Blob de desenvolvimento suporta apenas blobs com
Arquitectura Blob
Cátia Vaz 2011/2012 7
Contentores Blob
Cátia Vaz 2011/2012 8
}
É um agrupamento lógico de um conjunto de Blobs
}
Podem ser públicos ou privados
}
Restrições nos nomes dos Blobs:
}
O nome tem de ser único no contexto da conta
}
Tem de iniciar com uma letra ou número e apenas letras
minúsculas, com dimensão entre 3 e 63.
}
Não pode conter caracteres especiais excepto (-), o qual
Tipos de Blobs
Cátia Vaz 2011/2012 9
}
Existem 2 tipos de blobs:
}
page
}block
Account
myaccount
Container Blob Block
pictures videos IMG01.jpg IMG02.jpg Video1.wmv V1Block1.wmv V1Block2.wmv
API REST
Cátia Vaz 2011/2012 10
}
A API REST do serviço Blob suporta os serguintes verbos
HTTP:
}
GET,
}
PUT,
}
DELETE.
}
Um request ao serviço inclui:
}
verbo HTTP
}
URI pretendido
}
Parâmetros de URI
}
Request headers
Exemplo
Cátia Vaz 2011/2012 11 Request: GET http://proazurestorage.blob.core.windows.net/?comp=list Response: <?xml version="1.0" encoding="utf-8"?> <EnumerationResults AccountName="http://proazurestorage.blob.core.windows.net/"> <MaxResults>3</MaxResults> <Containers> <Container> <Name>000000004c00f241-staging</Name> <Url>http://proazurestorage.blob.core.windows.net/000000004c00f241-staging</Url> <LastModified>Sun, 26 Apr 2009 15:05:44 GMT</LastModified><Etag>0x8CB94979BAAA0F0</Etag> </Container>
<Container>
<Name>05022009-staging</Name>
<Url>http://proazurestorage.blob.core.windows.net/05022009-staging</Url> <LastModified>Sun, 03 May 2009 04:50:07 GMT</LastModified>
<Etag>0x8CB99C1C3ECE538</Etag> </Container>
<Container>
<Name>050320090743-staging</Name>
<Url>http://proazurestorage.blob.core.windows.net/050320090743-staging</Url> <LastModified>Sun, 03 May 2009 14:44:28 GMT</LastModified>
<Etag>0x8CB9A14CC091F60</Etag> </Container>
</Containers>
<NextMarker>/proazurestorage/050320091143-staging</NextMarker> </EnumerationResults>
Storage Client API
Cátia Vaz 2011/2012 12
}
Microsoft.WindowsAzure.StorageClient
abstrai a interface REST ao
fornecer um cliente no topo da API REST
Classes Descrição
CloudStorageAccount Uma classe utilitária que retorna a informação de um account através de um ficheiro de configuração ou cria uma instância de um storage account a partir dos parâmetros da account.
CloudBlobClient Uma classe wrapper para obter as referências dos objectos blob principais. Exemplo de métodos: GetContainerReference() e GetBlobReference().
CloudBlobContainer A classe consiste de operações de contentor, tais como: Create(), Delete(), ListBlobs(), e GetBlobReference().
CloudBlob A class consiste de operações tais como: Create(), Copy(), UploadFromFile(), UploadByteArray(), UploadStream()…
Operações Comuns de um contentor
}
ListContainers
}
Create
}
CreateIfNotExist
}
Delete
}
SetMetadata
Shared Access Signatures
}
Permite definir um nível de segurança mais granular para
cada utilizador registado numa determinada aplicação
}
São uma série de parâmetros do URL especificados no URI
do recurso para controlar privilégios de acesso aos
recursos
}
As políticas de acesso consistem em:
}
StartTime
}
EndTime
}
Permissions
}
As políticas de acesso pode ser:
}
Incluidas nas queries como parâmetros
Desenvolvimento de aplicações para
a Cloud
O serviço Queue
Cátia Vaz 2011/2012 22
}
Fornece uma infra-estrutura escalável e com grande
disponibilidade para comunicação de mensagens na cloud.
Esquema URL Tamanho máximo Referência API
http:// [StorageAccount].queue.core.wind ows.net/[QueueName] 8KB (string) http://msdn.microsof t.com/en-us/library/ dd179363.aspx
Exemplo de utilização: padrão Web + Worker
Role
Cátia Vaz 2011/2012 23
Web role
Lida com os pedidos dos utilizadores Coloca items na queue
Worker role
Processa os items a partir da queue
Public internet
Web role
Cloud storage (tables, blobs, queues)
Worker
role
Load
balancer
n
m
Q
Arquitectura do serviço Queue
Cátia Vaz 2011/2012 24
Conceitos de Queue Storage
Message
Queue
Account
sally thumbnail jobs 128x128, http://… 256x256, http://… photo processing jobs http://… http://…-
Oferece garantia na entrega
das mensagens
- Despacho do trabalho simples e assíncrono
- A semântica de programação assegura que a mensagem pode ser processada pelo menos uma vez
-
Têm uma performance
eficiente.
2 1
C
1C
2Processamento de mensagens na queue
1
2
3
4
Producers
Consumers
P
2P
13
2. Dequeue(Q, 30 sec)
à
msg 2
1. Dequeue(Q, 30 sec)
à
msg 1
1
2
C
1C
2Processamento de mensagens na queue
3
4
Produtores
Consumidores
P
2P
11
2
2. Dequeue(Q, 30 sec)
à
msg 2
3. C2 consumed msg 2
4. Delete(Q, msg 2)
7. Dequeue(Q, 30 sec)
à
msg 1
1. Dequeue(Q, 30 sec)
à
msg 1
5. C
1crashed
1
2 1
6. msg1 visível 30 segundos após Dequeue
3
Account, Queues e Mensagens
Cátia Vaz 2011/2012 28
Uma
account
pode conter várias
queues
O nome da queue fica contextualizado pela conta.
Uma queue contém messagens
Não existe limite no número de mensagem armazenadas numa
queue
Uma mensagem é armazenada no máximo uma semana numa queue
http://<Account>.
queue
.core.windows.net/<QueueName>
Mensagens
Tamanho das mensagens <= 8 KB
Têm os seguintes atributos:
MessageID PopReceipt Messagettl
Limites e Restrições
Cátia Vaz 2011/2012 29
}
As limitações do serviço Queue são as seguintes:
}
O serviço
queue
suporta um número ilimitado de mensagens, mas
cada mensagem não pode ter mais do que 64KB de tamanho
} Se a mensagem tiver maior tamanho, pode-se armazenar o object no Blob ou
Table e enviar o link como mensagem.
}
O comportamento FIFO das mensagens enviadas para o serviço
Queue não é garantido.
}
As mensagens podem ser recebidas por qualquer ordem.
}
Uma mensagem pode ser recebida mais do que uma vez.
}
As mensagens pode ser em formato texto ou binário, mas sempre
no formato de codificação Base64
}
As mensagens armazenadas no serviço Queue têm como tempo
de expiração de 7 dias. Após 7 dias, as mensagens são
garbage-collected.
Nomes das queues
Cátia Vaz 2011/2012 30
}
Restrições nos nomes das Queues:
}
O nome tem de ser único no contexto da conta
}
Tem de iniciar com uma letra ou número e apenas letras
minúsculas, com dimensão entre 3 e 63.
}
Não pode conter caracteres especiais excepto (-), o qual
Microsoft.WindowsAzure.StorageClient
Cátia Vaz 2011/2012 31
Nome da Classe Descrição
CloudStorageAccount Uma classe utilitária que retorna a informação de um account através de um ficheiro de configuração ou cria uma instância de um storage account a partir dos parâmetros da account.
CloudQueueClient Uma classe wrapper para obter as referências dos objectos principais da queue. A classe consiste de métodos como GetQueueReference() e ListQueues()
CloudQueue Consiste de operações de Queue tais como: Create(), Delete(), AddMessage(), e GetMessage().
CloudQueueMessage Representa uma mensagem da queue com propriedades como InsertionTime, ExpirationTime, NextVisibleTime, ID, e
Operações Comuns
}
ListQueues
}
GetMessage
}
AddMessage
}
Delete
}
DeleteMessage
Inserir uma mensagem
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference("myqueue"); queue.CreateIfNotExist();
CloudQueueMessage message = new CloudQueueMessage("Hello, Cloud"); queue.AddMessage(message);
Obter uma mensagem
CloudStorageAccount storageAccount = CloudStorageAccount.Parse( RoleEnvironment.GetConfigurationSettingValue("StorageConnectionSt ring")); CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient(); CloudQueue queue = queueClient.GetQueueReference("myqueue");
Retirar a próxima mensagem
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString")); CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient(); CloudQueue queue = queueClient.GetQueueReference("myqueue");
CloudQueueMessage retrievedMessage = queue.GetMessage(); queue.DeleteMessage(retrievedMessage);
Obter o tamanho da queue
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString")); CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference("myqueue");
int freshMessageCount = queue.RetrieveApproximateMessageCount(); int? cachedMessageCount = queue.ApproximateMessageCount;
Manipular mensagens cuja dimensão
exceda os 64 KB
Cátia Vaz 2011/2012 37
private static void HandleUploadImage(){
var cloudBlobClient = GetCloudStorageAcount().CreateCloudBlobClient(); var cloudBlobContainer = cloudblobClient.GetContainerReference("images"); cloudBlobContainer.CreateIfNotExist();
var fileStream = new FileStream(@"F:\bg.jpg", FileMode.Open); Console.WriteLine("Image size: {0}", fileStream.Length);
var blobid = Guid.NewGuid().ToString();
var cloudBlob = cloudBlobContainer.GetBlobReference(blobid); cloudBlob.UploadFromStream(fileStream);
var cloudQueueClient = GetCloudStorageAccount().CreateCloudQueueClient(); var cloudQueue = cloudQueueClient.GetQueueReference("imageupload");
cloudQueue.CreateIfNotExist();
var cloudQueueMessage = new CloudQueueMessage(blobid);
cloudQueue.AddMessage(cloudQueueMessage, TimeSpan.FromDays(7)); Console.WriteLine("Blob uploaded and enqueued [ {0} ]", blobid);
Manupular mensagens cuja dimensão
exceda os 64 KB
Cátia Vaz 2011/2012 38
private static void ProcessImage(){
var cloudQueueClient = GetCloudStorageAccount().CreateCloudQueueClient(); var cloudQueue = cloudQueueClient.GetQueueReference("imageupload");
var cloudQueueMessage = cloudQueue.GetMessage(); if(cloudQueueMessage ! = null)
{
var blobid = cloudQueueMessage.AsString;
Console.WriteLine("Queue message retrieved with content . [{0}]", blobid);
var cloudBlobClient = GetCloudStorageAccount().CreateCloudBlobClient(); var cloudBlobContainer = cloudBlobClient.GetContainerReference("images"); var cloudBlob = cloudBlobContainer.GetBlobReference(blobid);
var memoryStream = new MemoryStream(); cloudBlob.DownloadToStream(memoryStream);
Console.WriteLine("Image size: {0}", memoryStream.Length); }
StorageClient API
public void AddMessage(
string queueName, CloudQueueMessage queueMessage)
{
CloudQueue q = QueueClient.GetQueueReference(queueName);
q.AddMessage(queueMessage);
Cenário 1
Cátia Vaz 2011/2012 40
Cenário 2
Cátia Vaz 2011/2012 41
Cenário 3
Cátia Vaz 2011/2012 42
Desenvolvimento de aplicações para
a Cloud
O serviço Table
Cátia Vaz 2011/2012 44
}
Fornece um armazenamento estruturado na cloud.
}
As tables Windows Azure não são tabelas de bases de
dados relacionais, mas seguem um modelo simples e
flexível de entidades e propriedades.
Esquema URL Tamanho máximo Referência API
http://[Storage
Account].table.core.windows.ne
t/[Table Name]?$filter=[Query]
Desenhada para terabytes de dados mas cada entidade só poderá ter 1 MB.
http://msdn.microsoft.com/ en-us/library/
Os conceitos de Table Storage
Cátia Vaz 2011/2012 45
}
O serviço de Table do Azure incorpora os seguintes
conceitos principais:
}
Tables
}
Entities
Tables
Cátia Vaz 2011/2012 46
}
Uma tabela é um contentor para armazenar dados
}
Os dados são armazenados nas tabelas como colecção de
entidades
}
Podem existir várias tabelas na conta do serviço de Table
}
O serviço Table apenas suporte acesso privado.
}
Para aceder a todas as tables
}
<http|https>://<account
name>.table.core.windows.net/Tables
}
Para aceder a uma determinada tabela
}
<http|https>://
<accountname>.table.core.windows.net/
Tables('<table name>')
Azure Tables Versus Traditional Databases
Cátia Vaz 2011/2012 47
}
Dados desnormalizados
}
Sem esquema
Correlação com a terminologia das bases de
dados
Cátia Vaz 2011/2012 48
Database term Azure Table service term
Table Table
Row Row
Column Property
Shard/partition Partition
Nomes das tables
Cátia Vaz 2011/2012 49
}
Restrições nos nomes das Tables:
}
O nome tem de ser único no contexto da conta
}
Tem de iniciar com uma letra ou número e apenas letras
Entidades
Cátia Vaz 2011/2012 50
}
As entidade são análogas às linhas numa tabela de uma
dase de dados relacional.
}
Para obter todas as entidades de uma tabela
}
<http|https>://<account name>.table.core.windows.net/<table
name>()
}
As entidades são a unidade de acesso de escrita e
leitura.
}
As entidades têm 3 propriedades especiais:
}
RowKey
}
PartitionKey
Propriedades
Cátia Vaz 2011/2012 51
}
Cada propriedade tem um nome, um tipo e um valor
}
Os tipos disponíveis são:
} String (até 64 KB), } Binary (até 64 KB), } Bool, } DateTime, } GUID, } Int, } Int64, } Double.
}
Cada entidade pode ter até 255 propriedades
}
Duas entidades na mesma tabela podem ter diferentes números ou
Conceitos de Table Storage
Entity
Table
Account
sally customers Name = … Email = … 256x256, http://… winephotos http://… http://…Arquitectura do serviço table
Cátia Vaz 2011/2012 53
Propriedades
Cátia Vaz 2011/2012 54
}
Uma entidade tem sempre pelo menos 3 propriedades:
}
PartitionKey,
}
RowKey,
}
Timestamp.
}
PartitionKey e RowKey são do tipo string
}
Identificam univocamente uma entidade,
}
Timestamp é uma read-only DateTime
Como funcionam as tabelas
Cátia Vaz 2011/2012 55
Características e Restrições nas entidades e
propriedades
Cátia Vaz 2011/2012 56
}
As tabelas suportam um esquema flexivel.
}
Uma entidade pode conter no máximo 255 propriedades.
}
O tamanho total de uma entidade não pode exceder 1MB.
}
Timestamp é um valor read-only mantido pelo sistema.
}
A PartitionKey e o RowKey não podem exceder1KB cada um.
}
Os nomes das propriedades só podem conter caracteres
ADO. NET Data Services Library
Cátia Vaz 2011/2012 57
}
A API do serviço de table fornece um subconjunto da API
do serviço de dados ADO.NET
}
A biblioteca ADO.NET Data Services pode ser utilizada para
trabalhar com as tabelas e com as entidades no serviço de
tabelas.
}
Pode-se utilizar um conjunto de LINQ para interagir com as
tabelas e com as entidades
Microsoft.WindowsAzure.StorageClient
Nome da Classe Descrição
CloudStorageAccount Uma classe utilitária que retorna a informação de um account através de um ficheiro de configuração ou cria uma instância de um storage account a partir dos parâmetros da account.
CloudTableClient Uma wrapper class para interagir com o serviço table. Tem métodos como o CreateTable(), DeleteTable(), GetDataServiceContext() e ListTables().
TableServiceContext Herda da classe
System.Data.Services.Client.DataServiceContext. Adiciona funcionalidades de autenticação necessária pelo
serviço Table
TableServiceEntity Uma classe Abstracta que representa uma entidade numa tabela
CloudTableQuery<TEl
Criar uma tabela
CloudStorageAccount storageAccount = CloudStorageAccount.Parse( RoleEnvironment.GetConfigurationSettingValue( "StorageConnectionString")); CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); string tableName = "people";Eliminar uma tabela
CloudStorageAccount storageAccount = CloudStorageAccount.Parse( RoleEnvironment.GetConfigurationSettingValue( "StorageConnectionString")); CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); tableClient.DeleteTableIfExist("people");Exemplo de um tipo entidade
public class AzureBookReader : TableServiceEntity {
public AzureBookReader() : base() { CreateKeys("NO CITY"); } public AzureBookReader(string readerCity) {
CreateKeys(readerCity); }
public DateTime PurchaseDate { get; set; } public DateTime EntryDate{ get; set; }
public string Country { get;set;} public string State { get; set; } public string City { get; set; } public string Zip { get; set; }
public string PurchaseLocation { get; set; } public string PurchaseType { get; set; }
public string ReaderName { get; set; } public string ReaderUrl { get; set; } public string Feedback{ get; set; }
Exemplo de um tipo entidade
//...
private void CreateKeys(string readerCity) { EntryDate = DateTime.UtcNow;
City = readerCity;
RowKey = string.Format("{0:10}_{1}",
DateTime.MaxValue.Ticks -‐ EntryDate.Ticks, Guid.NewGuid()); PartitionKey = EntryDate.ToString("MMddyyyy");
} }
Exemplo
public class ProAzureReaderDataContext : TableServiceContext { public ProAzureReaderDataContext() : base(null, null) { }
public IQueryable<BookAzureReader> BookAzureReader{
get { return this.CreateQuery<BookAzureReader>(“BookAzureReader");} }
public void AddRecord( DateTime purchaseDate, string country, string state, string city, string zip,
string purchaseLocation, string purchaseType,
string readerName, string readerUrl, string feedback) {
ProAzureReader pa = new ProAzureReader(city); pa.Country = country; pa.Feedback = feedback;
pa.PurchaseDate = purchaseDate; pa.PurchaseLocation = purchaseLocation; pa.PurchaseType = purchaseType; pa.ReaderName = readerName;
pa.ReaderUrl = readerUrl; pa.State = state; pa.Zip = zip; this.AddObject("BookAzureReader", pa);
this.SaveChanges();
Realizar queries
}
Exemplo de queries que se podem realizar:
}
Obter todas as entradas adicionadas no próprio dia
}
Obter todas as entradas por cidade, estado ou país
}
Obter as Top(n) entradas
}
Obter as entradas por data de compra
Considerando que:
private TableServiceContext dcontext;
Obter as entidades adicionadas hoje
public IEnumerable<ProAzureReader> Select(){ var results = from g in
dContext.CreateQuery<ProAzureReader>(ENTITY_SET)
where g.PartitionKey == DateTime.UtcNow.ToString("MMddyyyy") select g;
var r = results.ToArray<ProAzureReader>(); return r;
Obter todas as entradas por cidade
public IEnumerable<ProAzureReader> SelectByCity(string city){ var results = from g in
dContext.CreateQuery<ProAzureReader>(ENTITY_SET_NAME)
where g.PartitionKey == DateTime.UtcNow.ToString("MMddyyyy") && g.City == city
select g;
var r = results.ToArray<ProAzureReader>(); return r;
Seleccionar por data de pagamento
public IEnumerable<ProAzureReader> SelectByPurchaseDate(DateTime purchaseDate)
{
var results = from g in
dContext.CreateQuery<ProAzureReader>(ENTITY_SET) where g.PurchaseDate.Equals(purchaseDate ) select g; var r = results.ToArray<ProAzureReader>(); return r; }
Obter as 10 entidades no topo
public IEnumerable<ProAzureReader> SelectTopN(int topNumber){ var results =
dContext.CreateQuery<ProAzureReader>(ENTITY).Take(topNumber); var r = results.ToArray<ProAzureReader>();
return r; }
Adicionar e actualizar
public void AddProAzureReader(BookAzureReader newItem) {
dContext.AddObject(ENTITY_SET_NAME, newItem);
dContext.SaveChangesWithRetries(SaveChangesOptions.None); }
public void UpdateFeedback(string PartitionKey, string RowKey, string feedback){
var results = from g in
dContext.CreateQuery<ProAzureReader>(ENTITY)
where g.PartitionKey == PartitionKey && g.RowKey == RowKey select g;
var e = results.FirstOrDefault<ProAzureReader>(); e.Feedback = feedback;
dContext.MergeOption = MergeOption.PreserveChanges; dContext.UpdateObject(e);
Desenvolvimento de aplicações para
a Cloud
Diagnostico
Cátia Vaz 2011/2012 71
}
Pode colectar-se dados de diagnostico ao importar o
módulo Diagnostics para o modelo do serviço e
configurando as fontes dos dados a partir dos quais se
recolhem os dados de diagnostico.
<?xml version="1.0" encoding="utf-‐8"?> <ServiceDefinition name="MyHostedService" xmlns="http://schemas.microsoft.com/ ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1"> <Imports> <Import moduleName="Diagnostics" /> </Imports> </WebRole> </ServiceDefinition>
Fontes dos dados coleccionados
Cátia Vaz 2011/2012 72
Fonte dos dados
Tipo de roles suportados
Windows Azure logs
Web e Worker roles
IIS 7.0 logs
Web roles
Windows Azure Diagnostic
infrastructure logs
Web e Worker roles
Failed Request logs
Web roles
Windows Event logs
Web e Worker roles
Performance counters
Web e Worker roles
Crash dumps
Web e Worker roles
Formatos de armazenamento
Cátia Vaz 2011/2012 73
Fonte dos dados
Formato de armazenamento
Windows Azure logs
Table
IIS 7.0 logs
Blob
Windows Azure diagnostics
infrastructure logs
Table
Failed Request Trace logs
Blob
Windows Event logs
Table
Performance counters
Table
Crash dumps
Blob
Tables
Cátia Vaz 2011/2012 74
}
WadLogsTable
}
Contem os logs escritos pelo trace listener.
}
WADDiagnosticInfrastructureLogsTable
}
Contém informação sobre a monitorização do diagnóstico e
mudanças de configuração
}
WADDirectoriesTable
}
Contém informação sobre as directorias que o diagnostic monitor
está a monitorizar.
} Ex: IIS logs, IIS failed request logs,
}
WADPerformanceCountersTable
}
Contém informação de performance counters.
}
WADWindowsEventLogsTable
Windows Azure Logs
Cátia Vaz 2011/2012 75
}
Os dados são armazenados como parte dos logs do Windows Azure
e por omissão, não são transferidos de forma persistente.
}
Para permitir transferência para um armazenamento persistente, tem de
se configurar a propriedade
Logs
.
}
O armazenamento é realizado na tabela
WADLogsTable
.
<system.diagnostics> <trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.
DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics"> <filter type="" /> </add> </listeners> </trace> </system.diagnostics> Ou programaticamente: System.Diagnostics.Trace.Listeners.Add( new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener());
Configuração programática do Diagnóstico
Cátia Vaz 2011/2012 76
}
IIS Failed Request log
}
Os dados são coleccionados ao adicionar um elemento Tracing ao
ficheiro web.config e ao instalar o serviço de tracing role no IIS.
}
Windows Event log
}
Os dados são colectados através das propriedades
WindowsEventLog e PerformanceCounters da classe
DiagnosticMonitorConfiguration.
}
Crash dump data
}
É colectado ao utilizar o método EnableCollection da classe
CrashDumps.
}
Custom log data
}
É colectado ao utilizar as classes DirectoryConfiguration e
Account
Container
Blobs
Table
En::es
Queue
Messages
Windows Azure Data Storage
h?p://<account>.blob.core.windows.net/<container>
h?p://<account>.table.core.windows.net/<table>
Desenvolvimento de aplicações para
a Cloud
Enterprise Service Bus
Cátia Vaz 2011/2012 79
}
Um
enterprise service bus
(
ESB
) é um modelo arquitectural
de software utilizado para desenhar e implementar a interacção
e a comunicação entre aplicações de software que interagem
numa arquitetura orientada aos serviços.
}
O desenho e a implementação dos ESBs variam nas diferentes
APPFabric Service Bus
Cátia Vaz 2011/2012 80
Segurança: integração ACS
Cátia Vaz 2011/2012 81
Tipo de Autenticação do cliente
Cátia Vaz 2011/2012 82<binding name="default">
<security relayClientAuthenticationType="None" />
</binding>
}
Os serviços e os clientes podem escolher autenticar-se por
uns dos tipos já configurados:
}
Saml
}
SharedSecret
}
SimpleWebToken
Segurança da mensagem
Cátia Vaz 2011/2012 83
}
Refere-se à segurança da mensagem que utiliza o
AppFabric Service Bus para chegar ao seu destino.
}
O AppFabricServiceBus oferece 4 opções para a segurança de
mensagens entre clientes e serviços
}
A enumeração
Microsoft.ServiceBus.EndToEndSecurityMode define 4
modos de segurança
¨None
¨Transport
¨Message
¨TransportWithMessageCredential
Naming Service
Cátia Vaz 2011/2012 84
}
O service Bus AppFabric oference um sistema de nomeação
DNS-compatible para atribuir um único Internet URIs aos
serviços.
}
O AppFabric Service Bus define um root
domain name que pode ser resolvido
através de Internet DNS, mas oferece
um serviço baseado nos namespaces
para nomear a hierarquia sob a raíz.
Service Registry
Cátia Vaz 2011/2012 85
}
O AppFabric Service Bus fornece um serviço de registo e descoberta para
os endpoints do serviço, designado por Service Registry.
} O Service Registry oferece uma solução Atom feed para cada solução.
class Program{
static void Main(string[] args){
ServiceHost host = new ServiceHost(typeof(MyService));
ServiceRegistrySettings settings = new ServiceRegistrySettings(); settings.DiscoveryMode = DiscoveryType.Public;
foreach(ServiceEndpoint s in host.Description.Endpoints) s.Behaviors.Add(settings);
host.Open();
Console.WriteLine("Press [Enter] to exit"); Console.ReadLine();
host.Close(); }}
Messaging Fabric
Cátia Vaz 2011/2012 86
}
O Windows Azure Service Bus fornece duas soluções de
messaging:
}
Relayed Messaging
}
Brokered Messaging
Service BusQueue Relay
Relayed Messaging
Cátia Vaz 2011/2012 87
}
O relay service suporta o modelo de comunicação Relayed
Messaging.
}
É uma componente do Service Bus centralizada
}
Suporta diferentes protocolos de transporte e
stardards
dos
Web Services
}
Suporta os seguintes tipos de comunicação entre clientes e
serviços:
}
One-Way messaging
}
Request-Response messaging
}Peer to peer messaging
}
Conecções directas entre clientes e serviços
Relayed Message pattern
Cátia Vaz 2011/2012 88
Exemplos de App Service Bus Bindings
Cátia Vaz 2011/2012 89
Bindings Descrição
BasicHttpRelayBinding Utiliza HTTP para o transporte
WebHttpRelayBinding Suporta HTTP, XML... Utilizado normalmente em
interfaces REST
WSHttpRelayContextBinding Suporta binding de contexto entre o serviço e o
relay service.
NetTcpRelayBinding Utiliza TCP para o transporte.
NetTcpRelayContextBinding Suporta binding de contexto entre o serviço e o
relay service. Utiliza TCP para o transporte
NetOneWayRelayBinding Suporta mensagens one-way entre o serviço e o
Service Bus Relay Service
Cátia Vaz 2011/2012 90
Utilização do Service Bus Relay
Cátia Vaz 2011/2012 91
}
É necessário:
1.
Criar um service namespace
}
Fornece um contentor de contexto para endereçar os recursos do
Service Bus no contexto da nossa aplicação
}
É realizado no Management Portal
2.
Obter as credenciais de gestão para o namespace
}São obtidas através do Management Portal
3.
Configurar a aplicação para utilizar o Service Bus
Exemplo: IProblemSolver
Cátia Vaz 2011/2012 92using System.ServiceModel;
[ServiceContract(Namespace = "urn:ps")]
interface IProblemSolver {
[OperationContract]
int AddNumbers(int a, int b);
}
interface IProblemSolverChannel : IProblemSolver,
IClientChannel {}
class ProblemSolver : IProblemSolver {
public int AddNumbers(int a, int b) {
return a + b;
}
}
System.ServiceModel.ServiceHost
Cátia Vaz 2011/2012 93
ServiceHost sh = new ServiceHost(typeof(ProblemSolver)); sh.AddServiceEndpoint( typeof (IProblemSolver),
new NetTcpBinding(),
"net.tcp://localhost:9358/solver“ );
ServiceEndpoint se= sh.AddServiceEndpoint( typeof(IProblemSolver), new NetTcpRelayBinding(),
ServiceBusEnvironment.
CreateServiceUri("sb", "**namespace**", "solver") ); se.Behaviors.Add(new TransportClientEndpointBehavior { TokenProvider = TokenProvider.CreateSharedSecretTokenProvider("owner", "**key**")} ); sh.Open();
Console.WriteLine("Press ENTER to close"); Console.ReadLine(); sh.Close();
Ou configurando o ficheiro App.config
Cátia Vaz 2011/2012 94
<services>
<service name="Service.ProblemSolver">
<endpoint contract="Service.IProblemSolver“ binding="netTcpBinding" address="net.tcp://localhost:9358/solver"/>
<endpoint contract="Service.IProblemSolver" binding="netTcpRelayBinding" address="sb://**namespace**.servicebus.windows.net/solver" behaviorConfiguration="sbTokenProvider"/> </service> </services> <behaviors> <endpointBehaviors> <behavior name="sbTokenProvider"> <transportClientEndpointBehavior> <tokenProvider>
<sharedSecret issuerName="owner" issuerSecret="**key**" /> </tokenProvider>
</transportClientEndpointBehavior> </behavior>
</endpointBehaviors> </behaviors>
Configurar o cliente programaticamente
Cátia Vaz 2011/2012 95
var cf = new ChannelFactory<IProblemSolverChannel>( new NetTcpRelayBinding(),
new EndpointAddress(ServiceBusEnvironment.
CreateServiceUri("sb", "**namespace**", "solver")) ); cf.Endpoint.Behaviors.Add( new TransportClientEndpointBehavior { TokenProvider = TokenProvider. CreateSharedSecretTokenProvider("owner","**key**") } );
using (var ch = cf.CreateChannel())
{ Console.WriteLine(ch.AddNumbers(4, 5)); }
Configurar o cliente com ficheiro de
configuração
Cátia Vaz 2011/2012 96 <client> <endpoint name="solver" contract="MyService.IProblemSolver" binding="netTcpRelayBinding" address="sb://**namespace**.servicebus.windows.net/solver" behaviorConfiguration="sbTokenProvider"/> </client> <behaviors> <endpointBehaviors> <behavior name="sbTokenProvider"> <transportClientEndpointBehavior> <tokenProvider> <sharedSecret issuerName="owner" issuerSecret="**key**" /> </tokenProvider> </transportClientEndpointBehavior> </behavior> </endpointBehaviors> </behaviors>Brokered Messaging
Cátia Vaz 2011/2012 97
}
O modelo de comunicação Brokered Messaging fornece
capacidade de comunicação assíncrona ou desacoplada
que suportacenários de publish/subscribe, desacoplamento
temporal e load balancing.
}
Existem 3 padrões de messaging para este modelo:
}
Queues;
}
Topics/Subscriptions
Service Bus Queues
Cátia Vaz 2011/2012 98
Aplicações das Service Bus Queues
Cátia Vaz 2011/2012 99
}
Comunicação entre web e worker roles numa aplicação
Windows Azure multi-tier
}
Comunicações entre aplicações que não estejam na cloud
e aplicações que estejam alojadas na cloud
}
Comunicação entre componentes de uma aplicação
Criação de uma Service Bus Queue
Cátia Vaz 2011/2012 100
}
Criar uma queue é um processo multi-passo. É necessário
1.
Criar um service namespace
}
Fornece um contentor de contexto para endereçar os recursos do
Service Bus no contexto da nossa aplicação
}
É realizado no Management Portal
2.
Obter as credenciais de gestão para o namespace
}São obtidas através do Management Portal
3.
Configurar a aplicação para utilizar o Service Bus
4.
Criar um Security Token Provider
3. Configurar a aplicação para utilizar o
Service Bus
Cátia Vaz 2011/2012 101
}
Adicionar a referência Microsoft.ServiceBus.dll
}
Importar os seguintes namespaces:
}
using Microsoft.ServiceBus
4. Criar um security token provider
Cátia Vaz 2011/2012 102
string issuer=“<obtido do portal>”:
string key=“<obtido do portal>”
TokenProvider tP=
TokenProvider.CreateSharedSecretTokenProvider(issue,key);
Criar uma queue
Cátia Vaz 2011/2012 103
string issuer=“<obtido do portal>”: string key=“<obtido do portal>”
TokenProvider tP=
TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment.
CreateServiceUri(“sb”,”MyServiceNamespace”, string.Empty); NameSpaceManager manager= new NameSpaceManager(uri,tP);
manager.CreateQueue(“MyQueue”);
QueueDescription qd= new QueueDescription(“MyQueue”);
qd.MaxSizeInMegaBytes=5120;
qd.DefaultMessageTimeToLive = new TimeSpan(0,1,0): manager.CreateQueue(qd);
Enviar mensagem a uma queue
Cátia Vaz 2011/2012 104
string issuer=“<obtido do portal>”: string key=“<obtido do portal>”
TokenProvider tP=
TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment.
CreateServiceUri(“sb”,”MyServiceNamespace”, string.Empty);
MessagingFactory factory = MessagingFactory.Create(uri, tP); MessageSender myQueue = factory.CreateMessageSender(“MyQueue");
for (int i=0; i<5; i++) {
BrokeredMessage message =
new BrokeredMessage("Test message " + i); myQueue.Send(message);
Receber mensagens de uma queue
Cátia Vaz 2011/2012 105
string issuer=“<obtido do portal>”: string key=“<obtido do portal>” TokenProvider tP=
TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment.
CreateServiceUri(“sb”,”MyServiceNamespace”, string.Empty); MessagingFactory factory = MessagingFactory.Create(uri, tP);
MessageReceiver myQueue = factory.CreateMessageReceiver(“MyQueue");
while (true) {
BrokeredMessage message = myQueue.Receive(); if (message != null) {
try {
Console.WriteLine("Body: " + message.GetBody<string>()); Console.WriteLine("MessageID: " + message.MessageId); message.Complete();
} catch (Exception) {message.Abandon(); } }
Sessões
Cátia Vaz 2011/2012 106
// Create a SessionReceiver to get next available session
SessionReceiver
sr =
myQueue.AcceptSessionReceiver(
ReceiveMode
.PeekLock);
BrokeredMessage
message = sr.Receive();
try
{
ProcessMessage(message);
message.Complete();
}
catch
(
Exception
)
{
message.Abandon();
}
Windows Azure Queues e Service Bus
Queues
Cátia Vaz 2011/2012 107
Critério Windows Azure Queues Service Bus Queues
Garantia na ordem Não Sim – (FIFO)
(através do uso de sessões) Garantia na entrega At-Least-Once At-Least-Once/At-Most-Once
Suporte nas transacções Não Sim
(utilização de transacções locais) Comportamento de recepção Não bloqueante Bloqueante com ou sem timeout Modo de recepção Peek & Lease Peek & Lock
Receive & Delete Modo de acesso exclusivo Lease-Based Lock-Based
Duração do Lease/Lock 30 s (omissão) /7 d (máximo) 60 s (omissão) /5 m (máximo) Granularidade do Lease/Lock Ao nível da mensagem Ao nível da queue
Recepção em lote Sim (especificar o Message Count) Sim (permitir a propriedade pre-fetch ou utilizar transacções)
Windows Azure Queues e Service Bus
Queues -Cotas
Cátia Vaz 2011/2012 108
Critério Windows Azure Queues Service Bus Queues
Tamanho máximo da mensagem 64KB (48KB se é utilizado a codificação Base64) 256KB Tamanho máximo da queue 100 TB 1,2,3,4 ou 5 GB
TTL da mensagem máximo 7 dias Ilimitado
Número máximo de queues Ilimitado 10 000 Número máximo de clientes concorrentes Ilimitado Ilimitado
Topics/Subscriptions
Cátia Vaz 2011/2012 109
Criação de um Service Bus Topic
Cátia Vaz 2011/2012 110
}
É necessário
1.
Criar um service namespace
}
Fornece um contentor de contexto para endereçar os recursos do
Service Bus no contexto da nossa aplicação
}
É realizado no Management Portal
2.
Obter as credenciais de gestão para o namespace
}São obtidas através do Management Portal
3.
Configurar a aplicação para utilizar o Service Bus
4.
Criar um Security Token Provider
Criar um topic
Cátia Vaz 2011/2012 111
string issuer=“<obtido do portal>”: string key=“<obtido do portal>”
TokenProvider tP=
TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment.
CreateServiceUri(“sb”,”MyServiceNamespace”, string.Empty); NameSpaceManager manager= new NameSpaceManager(uri,tP);
manager.CreateTopic(“MyTopic”);
TopicDescription td = new TopicDescription("TestTopic");
td.MaxSizeInMegabytes = 5120;
td.DefaultMessageTimeToLive = new TimeSpan(0, 1, 0); manager.CreateTopic(td);
Criar um subscription
Cátia Vaz 2011/2012 112
string issuer=“<obtido do portal>”: string key=“<obtido do portal>”
TokenProvider tP=
TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment.
CreateServiceUri(“sb”,”MyServiceNamespace”, string.Empty); NameSpaceManager manager= new NameSpaceManager(uri,tP);
Enviar mensagens a um topic
Cátia Vaz 2011/2012 113
string issuer=“<obtido do portal>”: string key=“<obtido do portal>”
TokenProvider tP=
TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment.
CreateServiceUri(“sb”,”MyServiceNamespace”, string.Empty);
MessagingFactory factory = MessagingFactory.Create(uri, tP); MessageSender myTopic = factory.CreateMessageSender(“MyTopic");
for (int i=0; i<5; i++) {
BrokeredMessage message =
new BrokeredMessage("Test message " + i); myTopic.Send(message);