client-server-kommunikation mit dem command pattern

63
Client-Server-Kommunikation mit dem Command Pattern p.g.taboada | pgt technology scouting GmbH

Upload: pgt-technology-scouting-gmbh

Post on 24-Jun-2015

1.423 views

Category:

Technology


2 download

DESCRIPTION

Eine Client-Server-Architektur stellt besondere Anforderungen an die Client-Server-Kommunikation. Einerseits wird Sparsamkeit angestrebt, andererseits absolute Flexibilität, Wiederverwendbarkeit und Wartbarkeit. Gerade im GWT-Umfeld fehlen clientseitig eine vollwertige JVM und das Reflection-API. Hinzu kommt noch der teilweise ungewohnte Umgang mit den asynchronen Aufrufen. In diesem Vortrag wird das Command Pattern vorgestellt. Es werden konkrete Lösungsansätze für Batching, Caching, Security und Journaling vorgestellt.

TRANSCRIPT

Page 1: Client-Server-Kommunikation mit dem Command Pattern

Client-Server-Kommunikation mit dem Command Pattern

p.g.taboada | pgt technology scouting GmbH

Page 2: Client-Server-Kommunikation mit dem Command Pattern

Papick G. Taboada

pgt technology scouting GmbH!http://pgt.de

Orientation in Objects GmbH!http://oio.de

Page 3: Client-Server-Kommunikation mit dem Command Pattern

http://gwtreferencelist.appspot.com

Page 4: Client-Server-Kommunikation mit dem Command Pattern

‣Client-Server communication

‣Command pattern

‣Versioning

‣Batching, Caching

‣Scaling

Page 5: Client-Server-Kommunikation mit dem Command Pattern

Browser Server

user action

full html response

full html response

full html response

user action

user action

classi

c web !

development

Page 6: Client-Server-Kommunikation mit dem Command Pattern

Browser Server

event

first request

full html response

data

data request

data

data request

event

event

event

RIA web

development

Page 7: Client-Server-Kommunikation mit dem Command Pattern

Honor the A in JAX

‣ Javascript does not block !Get over it

‣ Latency is not a myth

‣ Results must not arrive in the call order

Page 8: Client-Server-Kommunikation mit dem Command Pattern

BUILDING A GENERIC FRAMEWORK FOR MARSHALLING/ UNSMARSHALLING DATA SUCKS

Page 9: Client-Server-Kommunikation mit dem Command Pattern

MARSHALLING / UNMARSHALLING IN JAVASCRIPT IS SLOW

Page 10: Client-Server-Kommunikation mit dem Command Pattern

DON‘T BIND YOU NEXT 3 YEARS OF

WORK AGAINST SOME

COMMUNICATION PROTOCOLL

Page 11: Client-Server-Kommunikation mit dem Command Pattern

LOADING TOO MUCH DATA WILL ALWAYS

HURT

Page 12: Client-Server-Kommunikation mit dem Command Pattern

‣Client-Server communication

‣Command pattern

‣Versioning

‣Batching, Caching

‣Scaling

Page 13: Client-Server-Kommunikation mit dem Command Pattern

GWT-RPC is a good solution if handled with care

SomeResult someMethodName(SomeParameter spo)

GWT-RPC binds many

methods into one interface

Interface Versioning

is a monstrous

thing

Page 14: Client-Server-Kommunikation mit dem Command Pattern

SomeResult someMethodName(SomeParameter spo)

this will be an object

this will be an object too

Page 15: Client-Server-Kommunikation mit dem Command Pattern

SomeResult someMethodName(SomeParameter spo)

the method names bind the requests to the result

typesafety all the way

Page 16: Client-Server-Kommunikation mit dem Command Pattern

USING GENERICS FOR !

TYPESAFETY, !

GET RID OF METHODS !

AND INTERFACES

Page 17: Client-Server-Kommunikation mit dem Command Pattern

<A extends Action<R>, R extends Result> R execute(A action);

now we just one interface with one method

typesafety all the way

Page 18: Client-Server-Kommunikation mit dem Command Pattern

!

command pattern

GOF Pattern !

commonly used in Rich Clients

!

Page 19: Client-Server-Kommunikation mit dem Command Pattern

someAction

someResult

someActionHandlerEXECUTE

Page 20: Client-Server-Kommunikation mit dem Command Pattern

someAction

someResult

someActionHandlerPOJOS

Page 21: Client-Server-Kommunikation mit dem Command Pattern

someAction

someResult

someActionHandler

GWT-RPC

client server

batching caching security

caching exception translation security

GWT client

Page 22: Client-Server-Kommunikation mit dem Command Pattern

someAction

someResult

someActionHandler

RMI / HTTPInvoker

client server

batching caching security

caching exception translation security

Java client

Page 23: Client-Server-Kommunikation mit dem Command Pattern

someAction

someResult

someActionHandler

JSON-servlet

client server

batching caching security

caching exception translation security

Mobile client

Page 24: Client-Server-Kommunikation mit dem Command Pattern

public class TerminLoadAction implements Action<DataResult<TerminData>> { ! private String terminId; ! public TerminLoadAction(String terminId) { this.terminId = terminId; } ! public String getTerminId() { return terminId; } }

public class DataResult<DATA extends Data> implements Result { ! private DATA data; ! public DataResult(DATA data) { this.data = data; } ! public void setData(DATA data) { this.data = data; } ! public DATA getData() { return data; } !}

aka DTOs

Action Result

Reusabletype safety

Page 25: Client-Server-Kommunikation mit dem Command Pattern

dispatch.execute( ! new TerminLoadAction(terminId), new AsyncCallback<DataResult<TerminData>>() { ! @Override public void onFailure(Throwable caught) { } ! @Override public void onSuccess(DataResult<TerminData> result) { } ! } !);

<A extends Action<R>, R extends Result> void execute(A action, AsyncCallback<R> callback)

Page 26: Client-Server-Kommunikation mit dem Command Pattern

public interface ActionHandler <A extends Action<R>, R extends Result> { ! Class<A> getActionType(); !!!! R execute( A action, ExecutionContext context) throws DispatchException; !}

Server side

type safety

handler to action

mapping

action execution

declared exception hiearchy

Execution context for server side command

execution

Page 27: Client-Server-Kommunikation mit dem Command Pattern

@ActionHandlerBean @Transactional public final class TerminDataLoadHandler implements ActionHandler<TerminLoadAction, DataResult<TerminData>> { ! @Autowired private TerminDAO terminDao; ! @Override public DataResult<TerminData> execute( TerminLoadAction action, ExecutionContext context) throws DispatchException { ! TerminBean termin = … ! TerminData data = … ! return new DataResult<TerminData>(data); ! } ! @Override public Class<TerminLoadAction> getActionType() { return TerminLoadAction.class; } !}

Server side

custom annotation

spring

access to backend

type safe result

business logic, etc…

Page 28: Client-Server-Kommunikation mit dem Command Pattern

‣Client-Server communication

‣Command pattern

‣Versioning

‣Batching, Caching

‣Scaling

Page 29: Client-Server-Kommunikation mit dem Command Pattern

RPC interface

hell?

Page 30: Client-Server-Kommunikation mit dem Command Pattern

public interface SomeNiceService extends RemoteService { ! String someService(String param); ! String someServiceV2(String param); ! String someServiceV3(String param); }

public interface SomeNiceService extends RemoteService { ! String someService(String param); !} !public interface SomeNiceServiceV2 extends RemoteService { ! String someService(String param); !} !public interface SomeNiceServiceV3 extends RemoteService { ! String someService(String param); !}

easy way right way?

maintainability?maintainability?

Page 31: Client-Server-Kommunikation mit dem Command Pattern

someAction

someResult

someActionHandlerPOJOS

Page 32: Client-Server-Kommunikation mit dem Command Pattern

someAction

someResult

someActionHandlermultiple versions

someActionV2

someActionHandlerV2

same result

different versions can coexist!

Page 33: Client-Server-Kommunikation mit dem Command Pattern

someAction

someResult

someActionHandlermultiple versions

someActionV2

someActionHandlerV2

someResultV2 different results

Page 34: Client-Server-Kommunikation mit dem Command Pattern

‣Client-Server communication

‣Command pattern

‣Versioning

‣Batching, Caching

‣Scaling

Page 35: Client-Server-Kommunikation mit dem Command Pattern

why batch?

Page 36: Client-Server-Kommunikation mit dem Command Pattern

solving common problems

• one batch call is better than 10 single calls

• less data

• less roundtrip latency

• avoid connection bottleneck

• ensure server side execution order

• less roundtrips

Page 37: Client-Server-Kommunikation mit dem Command Pattern

batchAction

someAction1

batchActionHandler

someAction2

someAction3

batchResult

someResult1

someResult2

someResult3

client server

batching can be manual or

automatic

server executes actions in given order

someAction1

someAction2

someAction3

Page 38: Client-Server-Kommunikation mit dem Command Pattern

automatic batching?

Page 39: Client-Server-Kommunikation mit dem Command Pattern

GWT code execution

IDLE

browser event loop

Scheduler.scheduleEntry(…)

Scheduler.scheduleFinally(…)

Scheduler.scheduleDeferred(…)

Page 40: Client-Server-Kommunikation mit dem Command Pattern

GWT code execution

IDLE

Scheduler.scheduleFinally(…)

collect commands

fire batch command

cmd 1!cmd 2!cmd 3!cmd …

Page 41: Client-Server-Kommunikation mit dem Command Pattern

BATCH EXECUTION ALLOWS FOR FINE GRAINED COMMANDS AND REUSE

Page 42: Client-Server-Kommunikation mit dem Command Pattern

toggleTerminMetadata

reloadDashboardTermine

BooleanResult

DataListResult<Termin>

Page 43: Client-Server-Kommunikation mit dem Command Pattern

toggleTerminMetadata

reloadTermin

BooleanResult

DataResult<Termin>

Page 44: Client-Server-Kommunikation mit dem Command Pattern

toggleTerminMetadata

loadMonthStats

BooleanResult

DataResult<MonthStats>

loadMonthTermine DataListResult<Termin>

Page 45: Client-Server-Kommunikation mit dem Command Pattern

Caching

• Introduce cacheable interface

• simple marker interface,

• or more elaborate version with cache id, expiration time, etc…

• Implement caching (client or server side)

Page 46: Client-Server-Kommunikation mit dem Command Pattern

Patient 1!!

Patient 2

Patient 1 details

0101010101010101001010101010101010101010101010101!0101010101010101001010101010101010101010101010101!0101010101010101001010101010101010101010101010101!0101010101010101001010101010101010101010101010101!0101010101010101001010101010101010101010101010101!0101010101010101001010101010101010101010101010101!0101010101010101001010101010101010101010101010101!0101010101010101001010101010101010101010101010101

Page 47: Client-Server-Kommunikation mit dem Command Pattern

Ops.

action 1

action 2

result 2

result 1

execution 1

execution 2

Page 48: Client-Server-Kommunikation mit dem Command Pattern

action 2

Ensure „only last“ resultaction 1

result 1

action 1 handler

action

result

„smart dispatch“

result 2

check resultdeliver if last!

last action is:

result 1

Page 49: Client-Server-Kommunikation mit dem Command Pattern

Re-Auth

• If server exception is security exception, try to reauth and than re-execute commands

Page 50: Client-Server-Kommunikation mit dem Command Pattern

‣Client-Server communication

‣Command pattern

‣Versioning

‣Batching, Caching

‣Scaling

Page 51: Client-Server-Kommunikation mit dem Command Pattern

• Every client brings his own CPU power

• The client does the page rendering

• GWT provides different ways to reduce number of requests even more

• The server must „only“ authenticate the user and provide the data, perform the actions requested by the client

GWT scaling is easy...

Page 52: Client-Server-Kommunikation mit dem Command Pattern

WHAT CAN POSSIBLY GO WRONG?

Page 53: Client-Server-Kommunikation mit dem Command Pattern

LETS TALK HIGH TRAFFIC... HIGH TRAFFIC IS WHEN ONE SERVER IS NOT ENOUGH

Page 54: Client-Server-Kommunikation mit dem Command Pattern

• Bandwith issues

• Connection pool bottlenecks

• Thread pool bottlenecks

• CPU bottlenecks caused by reflection API calls

• High JVM garbage collection CPU usage

HIGH TRAFFIC PROBLEMS

Page 55: Client-Server-Kommunikation mit dem Command Pattern

NOT REALLY GWT PROBLEMS, BUT WHAT CAN WE DO?

Page 56: Client-Server-Kommunikation mit dem Command Pattern

TX TX

TX TX

TX

TX

TX TX

TX

TXavoid „tx collisions“

5 gleichzeitige Transaktionen

Page 57: Client-Server-Kommunikation mit dem Command Pattern

TX TX TX TX

TX

TXTX

TX TX

TX

TX

TXTX

TX

TX

load small portions of data, do it often

Page 58: Client-Server-Kommunikation mit dem Command Pattern
Page 59: Client-Server-Kommunikation mit dem Command Pattern

IMPLEMENT REAL LOAD BALANCING EACH REQUEST GOES TO THE NEXT AVAILABLE SERVER

Page 60: Client-Server-Kommunikation mit dem Command Pattern

• Don‘t stick a session to a server. Why send a user over and over again to a possible overloaded server?

• Don‘t store anything on the HTTP session. Share session content outside web container

• Session replication is expensive and does not scale well

• Let the load balancer distribute calls to available servers

SCALING HOW-TO

Page 61: Client-Server-Kommunikation mit dem Command Pattern

Webserver

Webserver

LB Webserver

Webserver

Webserver

Session Cache

STATELESS WEBAPP

Webserver

Page 62: Client-Server-Kommunikation mit dem Command Pattern

Session Cache

Session state could contain user id, client id, session id, user roles

If session cache becomes bottleneck, use distributed cache

Session Cache

Session Cache

Page 63: Client-Server-Kommunikation mit dem Command Pattern

Thanks!