coherence(implementa/on( pa1erns(...2011/11/04  ·...

70
Coherence Implementa/on Pa1erns Ben Stopford The Royal Bank of Scotland

Upload: others

Post on 07-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Coherence(Implementa/on(

Pa1erns(

Ben(Stopford(

The(Royal(Bank(of(Scotland(

Page 2: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Some(Ideas((

Nothing(More(

Page 3: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Why(do(we(use(Coherence?(

Fast?(

Scalable?(

Applica/on(layer?(

Page 4: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Simplifying(the(Contract(

Page 5: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

•  We(don’t(want(ACID(all(of(the(/me(

•  We(want(to(pick(the(bits(we(need(when(we(

need(them(

•  We(want(to(use(the(context(of(our(business(

requirement(to(work(our(way(around(the(ones(

we(don’t(need.(

Page 6: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Version(your(Objects(

Page 7: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Why(do(we(care?(

Without(versioning(it’s(a(freeOforOall.((

•  What(changed?(

•  Was(something(overwri1en?(

•  How(can(you(prevent(concurrent(updates?(•  What(did(the(system(look(like(10(seconds(ago.(

•  How(can(I(provide(a(consistent(view?(•  How(to(I(ensure(ordering(of(updates(in(an(asynchronous(system?(

Page 8: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

A.1(

A.2(

B.1(

C.1(

Versioned(

Cache(

C.2(

D.1(

Versioning(your(Objects(

Page 9: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Versioning(your(Objects(

A.1(

A.2(

Cache(

Coherence(Trigger(

New(Version(=(Old(Version(+(1(??(

Page 10: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Running(a(Coherence(Filter(

Page 11: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Using(KeyOBased(Access(

Page 12: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Latest(Cache(

Write(

A(

B(

C(

D(

A.1(

A.2(

B.1(

C.1(

Versioned(

Cache(

C.2(

D.1(

Coherence(Trigger(

Latest(/(Versioned(Pa1ern(

Page 13: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Latest(/(Versioned(Pa1ern(

Latest(Cache(Key(=([Business(Key](

Versioned(Cache(Key(=([Business(Key][Version](

!"

#"

$"

%"

!&'"

!&("

#&'"

$&'"

$&("

%&'"

Page 14: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Suffers(from(data(duplica/on(

Page 15: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

A.1(

A.L(

B.L(

C.1(

Versioned(

Cache(

C.L(

D.L(

Write(

Coherence(Trigger(

Latest(Marker(Pa1ern(

Well(Known(

Marker(Version(

Page 16: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

However(our(trigger(can’t(use(

cache.put()(

Why?(

Page 17: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Need(to(consider(the(threading(model(

Page 18: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

So(we’ll(need(to(use(the(backing(map(

directly(

public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)(

{(

(((MyValue(value(=((MyValue)entry.getValue();(

(((MyKey(versionedKey(=((MyKey)value.getKey();(

(

(((BinaryEntry(binary(=((BinaryEntry)entry;(

(((Binary(binaryValue(=(binaryEntry.getBinaryValue();(

(

(((Map(map(=(binary.getContext().getBackingMap("VersionedCacheName");(

(((map.put(toBinary(versionedKey),(binaryValue);(

}(

Page 19: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

A(third(approach(

Page 20: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

The(Collec/ons(Cache(

A( [O1,(O2,(O3..](

B( [O1,(O2,(O3..](

C( [O1,(O2,(O3..](

D( [O1,(O2,(O3..](

Collec/onsCache(

Trigger(Appends(to(Collec/on(

collec/onsCache.put(key,(val);(

collec/onsCache.invoke(key,(

new(LastValueGe1er());(

…or(override(backing(store(

Page 21: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

So(we(have(3(pa1erns(for(managing(

versioning(whilst(retaining(key(

based(access(

Page 22: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Using(versioning(to(manage(

concurrent(changes(

Mul/(Version(Concurrency(Control((

(MVCC)(

Page 23: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Version(1(

Version(2(

Cache(

Coherence(Trigger(

New(Version(=(Old(Version(+(1(??(

Page 24: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Concurrent(Object(Update(

(2(Clients(update(the(same(object(at(the(same(/me)(

A.1(

A.2(

Client1( Client2(

A.2(

Page 25: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Concurrent(Object(Update(

(Client2(fails(to(update(dirty(object)(

A.1(

A.2(

Versioned(

Cache(

Client1( Client2(

Page 26: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Concurrent(Object(Update(

(Client(2(updates(clean(object)(

A.1(

A.2(

A.3(

Versioned(

Cache(

Client1(

Client2(

Page 27: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

So(a(concurrent(update(results(in(

an(error(and(must(be(retried.(

!"#$

!"%$

&'()*+#$ &'()*+%$

Page 28: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

What’s(going(to(happen(if(we(are(

using(putAll?(

Page 29: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Reliable(PutAll(

We(want(putAll(to(tell(us(which(

objects(failed(the(write(process(

Page 30: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Reliable(PutAll(

Client( Extend( Node(

Node( Node(

Node( Node(

Node(

Invocable:(

•  Split(keys(by(member(

•  Send(appropriate(values(to(each(member(

•  Collect(any(excep/ons(returned((

Invocable:(

•  Write(entries(to(

backing(map((we(

use(an(EP(for(

this)(

Page 31: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

This(gives(us(a(reliable(mechanism(

for(knowing(what(worked(and(what(

failed(

Page 32: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Synthesising(Transac/onality(

Page 33: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

A(

B(

C(

D(

Cache(

The(Fat(Object(Method(

Page 34: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

The(Single(Entry(Point(Method(

(objects(are(stored(separately)(

(

(Collocate(with(

key(associa/on(

Page 35: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

EP(

All(writes(synchronize(on(the(

primary(object.(

Page 36: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

EP(

All(reads(synchronize(on(the(

primary(object.(

Page 37: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Wri/ng(Orphaned(Objects(

Write(orphaned(objects(first(

Write(read(

entry(point(

object(last(

This(mechanism(is(subtly(flawed(

Page 38: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Reading(several(objects(as(an(

atomic(unit(

aka(Joins(

Page 39: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

The(trivial(approach(to(joins(

Get(

Cost(

Centers(

Get(

Ledger

Books(

Get(

Source(

Books(

Get(

Transac

O/ons(

Get(

MTMs(

Get(

Legs(

Get(

Cost(

Centers(

Network

Time(

Page 40: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Server(Side,(Sharded(Joins(

Orders(Shipping(Log(

Common(Key(

Use(KeyAssocia/on(to(

keep(related(en//es(

together(

Page 41: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Server(Side,(Sharded(Joins(

Transactions

Cashflows

Mtms Aggregator joins data across cluster

Page 42: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

So(we(have(a(set(of(mechanisms(for(

reading(and(wri/ng(groups(of(

related(objects.(

Page 43: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Cluster(Singleton(Service(

Page 44: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

A(service(that(automa/cally(restarts(

amer(failure(

Page 45: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

A(service(that(automa/cally(restarts(

amer(failure(

Page 46: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

What(is(the(cluster(singleton(good(for(

•  Adding(indexes(•  Loading(data(•  Keeping(data(up(to(date(•  Upda/ng(cluster(/me(

•  You(can(probably(think(of(a(bunch(of(others(yourselves.(

Page 47: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Code(for(Cluster(Singleton(

//run in a new thread on every Cache Server while (true) { boolean gotLock = lockCache.lock("singletonLock", -1); if (gotLock) { //Start singletons wait(); } }

Page 48: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Implemen/ng(Consistent(Views(

and(Repeatable(Queries(

Page 49: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

BiOtemporal((

public(interface(MyBusinessObject{(

(((//data((

(((public(Date(getBusinessDate();(

(((public(Date(validFrom();(

(((public(Date(validTo();(

}(

(

Business(

Time(

System(

Time(

Page 50: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Where(does(the(System(Time(

come(from?(

Page 51: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

You(can’t(use(the(

System.currentTimeMillis()(in(a(

distributed(environment!(

Page 52: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

You(need(a(cluster(synchronised(

clock(

Page 53: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Singleton((

Service(

Repeatable(Time:(A(guaranteed(Tick(

Write(Time(

Read(Time(

Replicated(Caches(

(pessimis/c)(

Write(first(

Write(second(

Page 54: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

As(we(add(objects(we(/mestamp(them(

with(Write(Time(

Singleton((

Service(

Write(Time(

Page 55: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Singleton((

Service(

When(we(read(objects(we(use(Read(

Time(

Read(Time(

Page 56: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Singleton((

Service(

Repeatable(Time:(A(guaranteed(Tick(

Write(Time(

Read(Time(

Replicated(Caches(

(pessimis/c)(

Write(first(

Write(second(

7(8( 7(8( 7(8(

6(7( 6(7( 6(7(

Page 57: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Event(Based(Processing(

A(

B(

C(

D(

Async((

Cachestore(

cache.put(key,(val);(

Page 58: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Messaging(as(a(System(of(Record(

Messaging System (use Topics for scalability)

Page 59: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Messaging(as(a(System(of(Record(

A(

B(

C(

D(

Trigger(

cache.put(key,(val);(

JMS

TOPIC(

Page 60: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Easy(Grid(Implementa/on(in(GUIs(

Page 61: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

CQCs(on(a(CQC(

CQC( Cache(CQC(

GUI(JVM(

Define(this(in(config(

Page 62: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

How(do(you(release(quickly(to(a(

Coherence(cluster?(

Page 63: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Rolling(Restart?(

Page 64: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

DiskOPersist(

Page 65: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Final(Thoughts(

Page 66: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Data(is(the(most(important(

commodity(that(you(have((

Keep(it(safe(

Page 67: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Use(a(Par//on(Listener(

Page 68: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Have(Proac/ve(Monitoring(of(

Memory(

Page 69: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Version(your(Objects(

Page 70: Coherence(Implementa/on( Pa1erns(...2011/11/04  · So(we’ll(need(to(use(the(backing(map(directly(public(void(copyObjectToVersionedCacheAddingVersion(MapTrigger.Entry(entry)({((((MyValue(value(=((MyValue)entry

Thanks(

Slides(&(related(ar/cles(available(at:(

(

h1p://www.benstopford.com(

(