36
GAE Developer - Day3 Simon @ MiCloud 2014Q1

Google App Engine Developer - Day3

Embed Size (px)

DESCRIPTION

GAE Java - Day3 About memcache, task queue concept and operation

Citation preview

Page 1: Google App Engine Developer - Day3

GAE Developer - Day3Simon @ MiCloud2014Q1

Page 2: Google App Engine Developer - Day3

Last Class

● Datastore basic● Datastore operation● Restrictions● Transaction

Page 3: Google App Engine Developer - Day3

Create an Entity with KeyEntity job = new Entity("User", "[email protected]");

job.setProperty("name", "Simon Su");

job.setProperty("start", "20140103");

job.setProperty("create", new Date());

try {

Key k = ds.put(job);

out.println("Done..." + k.getId());

} catch (Exception e) {

e.printStackTrace();

}

Page 4: Google App Engine Developer - Day3

Create an Entity with AncestorKey userKey = KeyFactory.createKey("User", "[email protected]");

Entity job = new Entity("Jobs", userKey);

job.setProperty("name", "engineer");

job.setProperty("start", new Date());

try {

Key k = ds.put(job);

out.println("Done..." + k.getId());

} catch (Exception e) {

e.printStackTrace();

}

Page 5: Google App Engine Developer - Day3

Get data with KeyDatastoreService ds = DatastoreServiceFactory.getDatastoreService();

Key key = KeyFactory.createKey("User", "[email protected]");

try {

Entity ent = ds.get(key);

out.print(ent);

Map m = ent.getProperties();

out.println(m.toString());

} catch (EntityNotFoundException e) {

e.printStackTrace();

}

Page 6: Google App Engine Developer - Day3

Get data with AncestorQuery q = new Query("Jobs");

Key ancestor = KeyFactory.createKey("User", "[email protected]");

q.setAncestor(ancestor);

PreparedQuery results = ds.prepare(q);

Iterator iter = results.asIterable().iterator();

while(iter.hasNext()) {

Entity ent = (Entity) iter.next();

out.println(ent);

}

Page 7: Google App Engine Developer - Day3

Today

● Memcache basic● Task Queue concept● Push Queue● Pull Queue

Page 8: Google App Engine Developer - Day3

Memcache

Page 9: Google App Engine Developer - Day3

Why memcache

● Improve Application Performance● Reduce Application Cost● Caching for Read heavy operations● Caching In Front of Datastore● Semi-durable Shared state Across App

Instances

Page 10: Google App Engine Developer - Day3

Memcache - operationMemcacheService cache = MemcacheServiceFactory.getMemcacheService();

cache.setErrorHandler(

ErrorHandlers.getConsistentLogAndContinue(Level.INFO));

// read from cache

value = (byte[]) cache.get(key);

// save to cache

if (value == null) {

// ........

cache.put(key, value);

}

Page 11: Google App Engine Developer - Day3

Async memcache - get// Using the asynchronous cache

AsyncMemcacheService asyncCache =

MemcacheServiceFactory.getAsyncMemcacheService();

asyncCache.setErrorHandler(

ErrorHandlers.getConsistentLogAndContinue(Level.INFO));

// read from cache

Future<Object> futureValue = asyncCache.get(key);

// ... do other work in parallel to cache retrieval

value = (byte[]) futureValue.get();

Page 12: Google App Engine Developer - Day3

Async memcache - putif (value == null) {

// get value from other source

// ........

// asynchronously populate the cache

// Returns a Future<Void> which can be used to block until completion

asyncCache.put(key, value);

}

Page 13: Google App Engine Developer - Day3

Using jcache - initimport java.util.Collections;

import net.sf.jsr107cache.*;

Cache cache;

try {

CacheFactory cacheFactory =

CacheManager.getInstance().getCacheFactory();

cache = cacheFactory.createCache(Collections.emptyMap());

} catch (CacheException e) {

// ...

}

Page 14: Google App Engine Developer - Day3

Using jcache - get & putString key; // ...

byte[] value; // ...

// Put the value into the cache.

cache.put(key, value);

// Get the value from the cache.

value = (byte[]) cache.get(key);

Page 15: Google App Engine Developer - Day3

Testing with ab benchmark

ab -c 50 -n 50 http://[app-address]/[servlet_path]

or

ab -c 50 -t 50 http://[app-address]/[servlet_path]

Page 16: Google App Engine Developer - Day3

Other Operation● getAll(), putAll(), deleteAll()

A single read or write operation for multiple memcache entries

● increment(key, delta), incrementAll(...)Provide atomic increment of numeric value(s)

● getIdentifiable(), putIfUntouched()A mechanism to update a value consistently by concurrent requests

Page 17: Google App Engine Developer - Day3

Memcache Caveat

● Memcache Is Volatile● Performance suggest: Batch size < 32 MB● Dedicated memcache (pay): 10K OPS/s/GB,

range 1-20 GB

Page 18: Google App Engine Developer - Day3

Task Queue

Page 19: Google App Engine Developer - Day3

Why Task Queue● Frontend restriction of 60 second limit● Need longer-running tasks● Asynchronously outside front end request● Best practice:

○ Email○ Write datastore○ Web crawler○ Backend jobs

Page 20: Google App Engine Developer - Day3

Task Queue Types● By name

○ Default Queue (Push Queue)○ Named Queue

● By type○ Push queues

■ tasks execute automatically■ only for App Engine app

○ Pull queues■ tasks wait to be leased■ available to workers outside the app■ tasks can be batched

Page 21: Google App Engine Developer - Day3

queue.xml<queue-entries>

<queue>

<name>Queue-Name</name>

<rate>1/s</rate>

...

</queue>

<queue>

<name>Queue-Name2</name>

<mode>pull</mode>

...

</queue>

</queue-entries>

Push Queue

Pull Queue

Page 22: Google App Engine Developer - Day3

Task Queue Manage Console

Page 23: Google App Engine Developer - Day3

Task Queue - Default Push Queue

Queue queue = QueueFactory.getDefaultQueue(); //named queue: //QueueFactory.getQueue("Qname");

TaskOptions task = TaskOptions.Builder .withUrl("/path-to-my-worker") .param(key, value);

queue.add(task);

Reachable Servlet

Page 25: Google App Engine Developer - Day3

● rate - usual rate● bucket-size - cap on peak demand● max concurrent requests● Retry options

○ task-retry-limit - min retries○ task-age-limit - min elapsed time to keep retrying

(Both task-retry-limit and task-age-limit are reached, task is deleted)○ min-backoff-seconds -- min delay between retries○ max-backoff-seconds -- max delay between retries○ max-doublings -- max times to double delay

● more parameters see DOC

queue.xml parameters

Page 26: Google App Engine Developer - Day3

Task Queue - With TransactionDatastoreService ds = DatastoreServiceFactory.getDatastoreService();Queue queue = QueueFactory.getDefaultQueue();try { Transaction txn = ds.beginTransaction();

// … other operations queue.add(TaskOptions.Builder.withUrl("/path-to-my-worker")); // … other operations

txn.commit();} catch (DatastoreFailureException e) { // … exception handle}

Page 27: Google App Engine Developer - Day3

Pull Queue - Create Queue

Queue queue =

QueueFactory.getQueue("queue_name");

TaskOptions task =

TaskOptions.Builder

.withMethod(TaskOptions.Method.PULL)

.payload(payload);

queue.add(task);

Page 28: Google App Engine Developer - Day3

Pull Queue - Lease

Queue queue =

QueueFactory.getQueue("queue_name");

tasks = q.leaseTasks(

duration,

TimeUnit.SECONDS,

how-many);

Page 29: Google App Engine Developer - Day3

Pull Queue - Delete Task

//delete named taskqueue.deleteTask("task_ name");

//purge all tasks from queueQueueFactory.getQueue("queue_name").purge();

Page 30: Google App Engine Developer - Day3

Task Queue ACL - queue.xml

<queue>

<name>pull-queue1</name>

<mode>pull</mode>

<acl>

<user-email>[email protected]</user-email>

<writer-email>[email protected]</writer-email>

<writer-email>[email protected]</writer-email>

</acl>

</queue>

Page 31: Google App Engine Developer - Day3

Cron

Page 32: Google App Engine Developer - Day3

Cron

<cronentries>

<cron>

<url>/recache</url>

<description>

Put your description here

</description>

<schedule>every 5 minutes</schedule>

</cron>

</cronentries>

Page 33: Google App Engine Developer - Day3

● every 12 hours● every 5 minutes from 10:00 to 14:00● 2nd,third mon,wed,thu of march 17:00● every monday 09:00● 1st monday of sep,oct,nov 17:00● every day 00:00● every N (hours|mins|minutes) ["from" (time) "to" (time)]● every 2 hours synchronized

Cron Schedule Format

Page 34: Google App Engine Developer - Day3

Cron Manage Console

Page 35: Google App Engine Developer - Day3

Restrictions

● 20 cron jobs for free apps● 100 for paid apps