• Nenhum resultado encontrado

Desenvolvimento de aplicações para a Cloud. Windows Azure

N/A
N/A
Protected

Academic year: 2021

Share "Desenvolvimento de aplicações para a Cloud. Windows Azure"

Copied!
118
0
0

Texto

(1)

Desenvolvimento de aplicações para

a Cloud

(2)

Desenvolvimento de aplicações para

a Cloud

(3)

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

(4)

Blob Account

Cátia Vaz 2011/2012 4

(5)

Arquitectura do Serviço Storage

Cátia Vaz 2011/2012 5

(6)

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

(7)

Arquitectura Blob

Cátia Vaz 2011/2012 7

(8)

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

(9)

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

(10)

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

(11)

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>

(12)

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()…

(13)

Operações Comuns de um contentor

}

ListContainers

}

Create

}

CreateIfNotExist

}

Delete

}

SetMetadata

(14)
(15)
(16)
(17)
(18)
(19)

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

(20)
(21)

Desenvolvimento de aplicações para

a Cloud

(22)

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

(23)

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

(24)

Arquitectura do serviço Queue

Cátia Vaz 2011/2012 24

(25)

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.

(26)

2   1  

C

1

C

2

Processamento de mensagens na queue

1  

2  

3  

4  

Producers

Consumers

P

2

P

1

3  

2. Dequeue(Q, 30 sec)

à

msg 2

1. Dequeue(Q, 30 sec)

à

msg 1

1  

2  

(27)

C

1

C

2

Processamento de mensagens na queue

3

4  

Produtores

Consumidores

P

2

P

1

1  

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

1

crashed

1  

2   1  

6. msg1 visível 30 segundos após Dequeue

3  

(28)

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

(29)

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.

(30)

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

(31)

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

(32)

Operações Comuns

}

ListQueues

}

GetMessage

}

AddMessage

}

Delete

}

DeleteMessage

(33)

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);  

(34)

Obter uma mensagem

CloudStorageAccount  storageAccount  =  CloudStorageAccount.Parse(             RoleEnvironment.GetConfigurationSettingValue("StorageConnectionSt ring"));                          CloudQueueClient  queueClient  =   storageAccount.CreateCloudQueueClient();                          CloudQueue  queue  =   queueClient.GetQueueReference("myqueue");  

(35)

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);  

(36)

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;  

(37)

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);  

(38)

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);        }  

(39)

StorageClient API

public  void  AddMessage(  

                 string  queueName,  CloudQueueMessage  queueMessage)  

{  

 CloudQueue  q  =  QueueClient.GetQueueReference(queueName);  

 q.AddMessage(queueMessage);  

(40)

Cenário 1

Cátia Vaz 2011/2012 40

(41)

Cenário 2

Cátia Vaz 2011/2012 41

(42)

Cenário 3

Cátia Vaz 2011/2012 42

(43)

Desenvolvimento de aplicações para

a Cloud

(44)

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/

(45)

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

(46)

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>')

 

(47)

Azure Tables Versus Traditional Databases

Cátia Vaz 2011/2012 47

}

Dados desnormalizados

}

Sem esquema

(48)

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

(49)

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

(50)

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

(51)

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

(52)

Conceitos de Table Storage

Entity

Table

Account

sally customers Name = … Email = … 256x256, http://… winephotos http://… http://…

(53)

Arquitectura do serviço table

Cátia Vaz 2011/2012 53

(54)

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

(55)

Como funcionam as tabelas

Cátia Vaz 2011/2012 55

(56)

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

(57)

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

(58)

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

(59)

Criar uma tabela

CloudStorageAccount  storageAccount  =            CloudStorageAccount.Parse(      RoleEnvironment.GetConfigurationSettingValue(            "StorageConnectionString"));     CloudTableClient  tableClient  =    storageAccount.CreateCloudTableClient();     string  tableName  =  "people";    

(60)

Eliminar uma tabela

CloudStorageAccount  storageAccount  =            CloudStorageAccount.Parse(      RoleEnvironment.GetConfigurationSettingValue(            "StorageConnectionString"));     CloudTableClient  tableClient  =    storageAccount.CreateCloudTableClient();         tableClient.DeleteTableIfExist("people");  

(61)

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;  }  

(62)

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");  

 }   }  

(63)

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();  

(64)

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;  

(65)

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;  

(66)

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;  

(67)

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;   }  

(68)

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;   }  

(69)

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);  

(70)

Desenvolvimento de aplicações para

a Cloud

(71)

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>  

(72)

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

(73)

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  

(74)

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

(75)

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());    

(76)

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

(77)

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>  

(78)

Desenvolvimento de aplicações para

a Cloud

(79)

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

(80)

APPFabric Service Bus

Cátia Vaz 2011/2012 80

(81)

Segurança: integração ACS

Cátia Vaz 2011/2012 81

(82)

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

(83)

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  

(84)

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.

(85)

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();      }}  

(86)

Messaging Fabric

Cátia Vaz 2011/2012 86

} 

O Windows Azure Service Bus fornece duas soluções de

messaging:

} 

Relayed Messaging

} 

Brokered Messaging

Service Bus

Queue Relay

(87)

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

(88)

Relayed Message pattern

Cátia Vaz 2011/2012 88

(89)

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

(90)

Service Bus Relay Service

Cátia Vaz 2011/2012 90

(91)

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

(92)

Exemplo: IProblemSolver

Cátia Vaz 2011/2012 92

using  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;    

         }    

}  

(93)

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();  

(94)

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>  

(95)

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));     }  

(96)

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>  

(97)

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

(98)

Service Bus Queues

Cátia Vaz 2011/2012 98

(99)

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

(100)

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

(101)

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  

(102)

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);  

(103)

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);  

(104)

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);  

(105)

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();  }        }  

(106)

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();  

}

(107)

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)

(108)

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

(109)

Topics/Subscriptions

Cátia Vaz 2011/2012 109

(110)

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

(111)

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);  

(112)

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);  

(113)

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);  

Referências

Documentos relacionados

Para evitar danos ao equipamento, não gire a antena abaixo da linha imaginária de 180° em relação à base do equipamento.. TP400 WirelessHART TM - Manual de Instrução, Operação

limitações no uso do sistema de informação; isolamento do Serviço de Atenção Domiciliar em relação aos demais serviços da rede de saúde; limitações da Atenção Básica

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

Objetivando avaliar a utilização de óleos vegetais de diferentes origens em rações no desempenho e características de carcaça do escargot francês “gros gris” (Helix

Este estudo, assim, aproveitou uma estrutura útil (categorização) para organizar dados o que facilitou a sistematização das conclusões. Em se tratando do alinhamento dos

Somente na classe Aberta Jr e Sr, nas modalidades de Apartação, Rédeas e Working Cow Horse, que será na mesma passada dessas categorias e os resultados serão separados. O

Mestrado em: Nutrição Humana ou Nutrição Clínica ou Saúde Coletiva ou Ciências da Saúde ou Ciências ou Saúde ou Alimentos e Nutrição e Desenvolvimento na

A fisioterapia é de extrema importância ma reabilitação de pacientes com paraparesia, auxiliando na prevenção de deformidades, maior independência funcional,