simple cloud api: accesso semplificato al cloud computing
Post on 05-Dec-2014
1.326 Views
Preview:
DESCRIPTION
TRANSCRIPT
Simple Cloud API: accesso semplificato al cloud computing
Enrico Zimuel (enrico@zend.com)Zend Technologies, the PHP company
Mi presento
• Senior Consultant e Architect presso Zend Technologies
• Software Engineer dal 1996: C/C++, Java, PHP, Perl, VB/C#/ASP.NET, JavaScript
• Speaker: PHPCon, PHP Barcelona Conference, PHPDay, ZendCon, Common Europe, etc
• Laurea in Economia Informatica presso l'Università “G.D'Annunzio” di Pescara
• Blog sullo sviluppo web in PHP: http://www.zimuel.it/blog
Sommario
• Cloud computing
• Sviluppo di applicazioni web in ambienti cloud
• Simple Cloud API– Storage service– Document service
– Queue service
• Esempi in PHP
Cloud Computing
“E' l'insieme di tecnologie informatiche che permettono l'utilizzo di risorse hardware (storage, CPU) o software distribuite in remoto.”
Fonte: Wikipedia
Alcuni servizi di cloud computing
• Vantaggi, dal punto di vista dello sviluppo:– Architettura distribuita
– Facile accesso a risorse “potenti”
– Semplicità d'utilizzo: delega di gestione del servizio
• Alcuni punti critici:– Vendor lock-in– Portabilità– Interoperabilità
Sviluppo di applicazioni in ambienti cloud
Vendor lock-in
• In economia il vendor lock-in è quando un cliente è strettamente legato ad un fornitore a tal punto da impedire il cambio di vendor senza un sostanziale costo (switching cost).
• Rischi legati all'utilizzo di vendor:– Cambio dei costi dei servizi
– Cambio di policy nell'erogazione dei servizi
• In abito software:switching cost = riscrittura del codice
Portabilità
• Portabilità = la capacità di eseguire la stessa applicazione su piattaforme differenti
• Non è semplice cambiare piattaforma di cloud computing, molto spesso è necessaria una modifica sostanziale del proprio software e quindi una riscrittura del codice
• Per fornire portabilità ad un software è necessario effettuare un'astrazione delle operazioni di base
Interoperabilità
• Interoperabilità = la capacità di scrivere software che sia in grado di utilizzare sistemi differenti
• Il vs. software è in grado di utilizzare indifferentemente un servizio di storage su Amazon S3 o Nirvanix?
• Anche qui, il cambio di vendor porta a dei costi derivanti dalla riscrittura del codice
Simple Cloud API
• E' un'interfaccia comune, in PHP, per l'accesso ai servizi di cloud computing
• E' un progetto open source ideato da Zend Technologies con la collaborazione di IBM, Microsoft, Rackspace, Nirvanix e GoGrid
• Dal 2 Novembre 2010 il Simple Cloud API è stato incluso nel progetto Zend Framework con la classe Zend_Cloud
http://simplecloudapi.org/
Simple Cloud API: architettura
Zend_Cloud: servizi
• Servizi attualmente disponibili:– Storage (Amazon S3, Nirvanix, Azure
Blog Storage, Local file system)– Document (Amazon SimpleDB, Azure
Table Storage)– Queue (Amazon SQS, Azure Queue
Service, Zend_Queue (Apache ActiveMQ, MemcacheQ, Zend Platform, Zend Db))
Installazione di Zend_Cloud
• Zend_Cloud è disponibile a partire dalla versione 1.11.0 di Zend Framework
• Download:– http://framework.zend.com/download/latest
• Configurazione di Zend Framework
– Inclusione della libreria nel percorso di default del PHP:• include_path nel php.ini • oppure da script PHP tramite
set_include_path()
Storage service
• Zend_Cloud_StorageService
• Adapter per Amazon S3 e Windows Azure
• Storage di file (item):– Ad ogni item è associata una chiave
univoca (URL, path, etc)– Ad ogni item posso associare dei
metadata (coppie chiave=>valore)– E' possibile accedere ai metodi specifici
di ogni adapter (ad esempio i bucket in S3)
Storage service: esempio
<?php
// il parametro può essere un array o un oggetto Zend_Config$storage = Zend_Cloud_StorageService_Factory::getAdapter(array(Zend_Cloud_StorageService_Factory::STORAGE_ADAPTER_KEY => 'Zend_Cloud_StorageService_Adapter_S3', Zend_Cloud_StorageService_Adapter_S3::AWS_ACCESS_KEY => $amazonKey, Zend_Cloud_StorageService_Adapter_S3::AWS_SECRET_KEY => $amazonSecret));
// memorizzo un nuovo item nello storage$data = file_get_contents('/home/test/picture.jpg');$returnedData = $storage->storeItem('/picture.jpg', $data);
Storage service: esempio (2)
<?php…// leggo un item dallo storage$returnedData = $storage->fetchItem("/picture.jpg");file_put_contents('/tmp/picture.jpg', $returnedData);
// elimino un item dallo storage$storage->deleteItem("/picture.jpg");
// copio un item nello storage$storage->copyItem('/picture.jpg', '/picture_copy.jpg');
// elenco degli item nello storage nella dir /$objects = $storage->listItems('/');foreach ($objects as $objname) {
echo "Found: $objname\n";}
Storage service: metadata
<?php…// memorizzo metadata al file nello storage$data = $storage->storeMetadata('/picture.jpg', array(
'type' => 'JPEG','category' => 'Portrait',
));
// leggo metadata dal file nello storage$data = $storage->fetchMetadata('/picture.jpg');foreach ($data as $key => $value) {
echo "Metadata $key: $value\n";}
// elimino metadata dal file nello storage$storage->deleteMetadata("/picture.jpg");
Storage service: accesso diretto all'adapter
<?php…// accesso diretto ai metodi dell'adapter S3$s3 = $storage->getClient();$s3->cleanBucket("oldBucket");
Nota: l'utilizzo di metodi specifici dell'adapter limita la portabilità del codice poiché lo vincola alla funzione specifica del vendor
Document service
• Zend_Cloud_DocumentService
• Adapter per Amazon SimpleDB e Windows Azure
• Documenti (item):– Collezione di documenti (database)– Ogni documento è una collezione di coppie
(chiave, valore) – Ogni documento è identificato da un ID
Document service: esempio
<?php
$documents = Zend_Cloud_DocumentService_Factory::getAdapter(array(Zend_Cloud_DocumentService_Factory::DOCUMENT_ADAPTER_KEY => 'Zend_Cloud_DocumentService_Adapter_SimpleDb', Zend_Cloud_DocumentService_Adapter_SimpleDb::AWS_ACCESS_KEY => $amazonKey, Zend_Cloud_DocumentService_Adapter_SimpleDb::AWS_SECRET_KEY => $amazonSecret));
// creo una nuova collezione di documenti$documents->createCollection("mydata");
Document service: nuovo documento
<?php…// creo un nuovo documento$document = new Zend_Cloud_DocumentService_Document(array( 'key1' => 'value1', 'key2' => 123, 'key3' => 'thirdvalue',), "DocumentID");
// inserisco il documento nella collection$documents->insertDocument("mydata", $document);
// aggiorno un documento$documents->updateDocument("mydata", "DocumentID", array("key2" => "new value"));
Document service: query
<?php…// ricerca documenti nella collezione$docs = $documents->query( "collectionName", "RowKey eq 'rowkey2' or RowKey eq 'rowkey2'");
foreach ($docs as $doc) { $id = $doc->getId(); echo "Found document with ID: " . var_export($id, 1) . "\n";}
Document service: structured query
<?php…// creo la structured query$query = $documents->select() ->from('collectionName') ->where('year > ?', array(1945)) ->limit(3);
// eseguo la query$docs = $documents->query('collectionName', $query);
foreach ($docs as $doc) { $id = $doc->getId(); echo "Found document with ID: " . var_export($id, 1) . "\n";}
Queue service
• Zend_Cloud_QueueService
• Adapter per Amazon Simple Queue, Windows Azure, Zend Queue
• Code (queue):– Gestione di una o più code– Ogni coda ha uno o più messaggi gestiti
tramite con la tecnica FIFO (First In First Out)
Queue service: esempio
<?php
$queues = Zend_Cloud_QueueService_Factory::getAdapter(array( Zend_Cloud_QueueService_Factory::QUEUE_ADAPTER_KEY => 'Zend_Cloud_QueueService_Adapter_Sqs', Zend_Cloud_QueueService_Adapter_Sqs::AWS_ACCESS_KEY => $amazonKey, Zend_Cloud_QueueService_Adapter_Sqs::AWS_SECRET_KEY => $amazonSecret,));
// creo una coda$queueId = $queues->createQueue('my-queue');
Queue service: esempio (2)
<?php…// invio di un messaggio alla coda$queues->sendMessage($queueId, "Hello world!");
// lettura del messaggio in testa alla coda$messages = $queues->receiveMessages($queueId);if (count($messages)) { foreach ($messages as $message) { echo "Message: " . $message->getBody(); break; }}
// lettura di 2 messaggi dalla testa della coda$messages = $queues->receiveMessages($queueId, 2);
Queue service: lettura messaggi
• Quando un client legge un messaggio da una coda, questo messaggio non è visibile dagli altri client
• Se il client non elimina il messaggio eseguendo il metodo deleteMessage() il messaggio sarà visibile agli altri client dopo un timeout
Queue service: metadata
<?php…// aggiunge metadati alla coda$queues->storeQueueMetadata($queueId, array(
'purpose' => 'Operations','administrator' => 'joe@example.com',
));
// recupero metadati dalla coda$metadata = $queues->fetchQueueMetadata($queueId);
foreach($metadata as $key => $value) {echo "Metadata $key: $value\n";
}
Domande?
Grazie!
Per maggiori informazioni:http://www.zend.comhttp://simplecloud.org
http://framework.zend.com/manual/en/zend.cloud.html
top related