Piattaforma cloud di hosting per applicazioni web
Tre linguaggi supportati: Python, Java e GO!
Datastore NoSQL e tanti servizi a disposizione
Sistema di pagamento a counsumo
Database non relazionale, basato su Big Table, pensato per lavorare su enormi quantità di dati.
Il peso di una query é dato dal numero di dati restituti, indipendentemente dalla dimensione della tabella: una query su milioni di record ha lo stesso peso di una query su qualche centinaio.
Ci sono limitazioni (non banali): niente join, niente filtri con disuguaglianze su più attributi, niente IN o simili.
// Inserire un record
Entity employee = new Entity("Employee");
employee.setProperty("lastName", "Antonio");
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
ds.put(employee);
// Gerarchia padre figlio
Entity address = new Entity("Address", employee.getKey());
ds.put(address);
// Effettuare una query
Query q = new Query("Employee");
q.addFilter("lastName", Query.FilterOperator.EQUAL, lastNameParam);
PreparedQuery pq = ds.prepare(q);
for (Entity result : pq.asIterable()) {
String firstName = (String) result.getProperty("firstName");
Integer weight = (Integer) result.getProperty("weight");
System.out.println(firstName + " pesa " + weight +" kg");
}
Transaction txn = ds.beginTransaction();
try {
Key employeeKey = KeyFactory.createKey("Employee", "Joe");
Entity employee = datastore.get(employeeKey);
employee.setProperty("vacationDays", 10);
ds.put(employee);
txn.commit();
} finally {
if (txn.isActive())
txn.rollback();
}
Nel Datastore sono incluse le implementazioni di JDO e JPA
<form action="<%= blobstore.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">
<input type="file" name="myFile">
Map<String, BlobKey> blobs = blobstore.getUploadedBlobs(req);
BlobKey blobKey = blobs.get("myFile");
ImagesService imageService =
ImagesServiceFactory.getImagesService();
Image old = ImagesServiceFactory.makeImage(bytesArray);
Transform r = ImagesServiceFactory.makeResize(200, 300);
Image new = imagesService.applyTransform(resize, old);
MemcacheService syncCache =
MemcacheServiceFactory.getMemcacheService();
value = (byte[]) syncCache.get(key); // read from cache
if (value == null) { ... // reload the value
syncCache.put(key, value); // populate cache
}
logine
logout,
Sono Task asincroni indipendenti dalle request di un utente.
Push Queue: coda di default, i task vengono inseriti dall'app stessa
Pull Queue: i task vengono inseriti da app esterne
// push queue
Queue queue = QueueFactory.getDefaultQueue();
queue.add(withUrl("/worker").param("key", key));