Jfokus - Hazlecast

74
@PeterVeentjer Distributed Systems Using Hazelcast Peter Veentjer

description

www.hazelcast.com

Transcript of Jfokus - Hazlecast

Page 1: Jfokus - Hazlecast

@PeterVeentjer

Distributed Systems Using Hazelcast

Peter Veentjer

Page 2: Jfokus - Hazlecast

@PeterVeentjer

• Working for Hazelcast

• Senior developer

• Solution architect

• Author of ‘Mastering Hazelcast 3'

• 14 years Java experience

• Big love

• Concurrency control

• Distributed computing

Whoami

Page 3: Jfokus - Hazlecast

@PeterVeentjer

Page 4: Jfokus - Hazlecast

@PeterVeentjer

What is Hazelcast?

Page 5: Jfokus - Hazlecast

@PeterVeentjer

What is Hazelcast?

• Leading Open Source Java In Memory Data/Compute Grid

• Out main goal is to simplify development of:

• Scalable systems

• Highly available systems

Page 6: Jfokus - Hazlecast

@PeterVeentjer

Why Hazelcast?

• 2.5 MByte JAR

• no other dependencies!

• no need to install software!

• Its a library, not an application framework

• Apache 2 License

• Free to use

• no limitations

Page 7: Jfokus - Hazlecast

@PeterVeentjer

Distributed Data-structures

• IAtomicLong/Ref

• IdGenerator

• Lock/Condition

• CountDownLatch

• Semaphore

• Queue

• Map

• MultiMap

• Set

• List

• Topic

• Executor

• TransactionalMap/Q/S…

• Write your own!

Page 8: Jfokus - Hazlecast

@PeterVeentjer

So what can I do with it?

Page 9: Jfokus - Hazlecast

@PeterVeentjer

Scaling

Page 10: Jfokus - Hazlecast

@PeterVeentjer

Scale up

Page 11: Jfokus - Hazlecast

@PeterVeentjer

Scale Out

Page 12: Jfokus - Hazlecast

@PeterVeentjer

High Availability

Page 13: Jfokus - Hazlecast

@PeterVeentjer

Raspberry Pi Cluster

Page 14: Jfokus - Hazlecast

@PeterVeentjer

When?• Caching

• Messaging Solution

• Event processing

• Clustered Scheduling

• Job Processing

• Cluster management

• HTTP session clustering

Page 15: Jfokus - Hazlecast

@PeterVeentjer

Which companies

• E-Commerce

• Apple, eBay

• Financials

• JP Morgan, Morgan Stanley, HSBC, Deutsche Bank

• Telco’s

• AT&T, Ericsson

• Gaming

• Ubisoft/Blue Byte

Page 16: Jfokus - Hazlecast

@PeterVeentjer

Which Open Source Projects

• WSO2 Carbon

• Mule ESB

• Vert.x

• Apache Camel

• Apache Shiro

• OrientDB

• Alfresco

• Karaf

Page 17: Jfokus - Hazlecast

@PeterVeentjer

How Often

• In October 2013

• 3M startups

• 48K unique

Page 18: Jfokus - Hazlecast

@PeterVeentjer

Where is the code!

Page 19: Jfokus - Hazlecast

@PeterVeentjer

HazelcastInstance  hz  =  Hazelcast.newHazelcastInstance();

Creating Hazelcast Cluster

Page 20: Jfokus - Hazlecast

@PeterVeentjer

<hazelcast>          <network>…</network>          <map  name=“m”>…</map>          <queue  name=“q”>…</queue>          <…  </hazelcast>

XML Configuration

Page 21: Jfokus - Hazlecast

@PeterVeentjer

Config  config  =  new  Config();  …  make  config  modifications  HazelcastInstance  hz  =  Hazelcast.newHazelcastInstance(config);

Programmatic Configuration

Page 22: Jfokus - Hazlecast

Demo

@PeterVeentjer

Page 23: Jfokus - Hazlecast

@PeterVeentjer

Map<String,String>  products  =  new  HashMap();  map.put("1","IPhone");

Map

Page 24: Jfokus - Hazlecast

@PeterVeentjer

Map<String,String>  products  =  new  ConcurrentHashMap();  map.put("1","IPhone");

Map

Page 25: Jfokus - Hazlecast

@PeterVeentjer

HazelcastInstance  hz  =  Hazelcast.newHazelcastInstance();  Map<String,String>  products  =  hz.getMap("products");  cities.put("1","IPhone");  

Map

Page 26: Jfokus - Hazlecast

Demo

@PeterVeentjer

Page 27: Jfokus - Hazlecast

@PeterVeentjer

!<map  name="products">        <time-­‐to-­‐live-­‐seconds>4</time-­‐to-­‐live-­‐seconds>        <indexes>                <index>name</index>        </indexes>        <..>  </map>

Map Configuration

Page 28: Jfokus - Hazlecast

@PeterVeentjer

Map Scalability and High Availability

271 Partitions

partitionid = hash(key) % partitioncount

Page 29: Jfokus - Hazlecast

@PeterVeentjer

Map Scalability and High Availability

Member 1

Page 30: Jfokus - Hazlecast

@PeterVeentjer

Map Scalability and High Availability

Member 1

Member 2

Page 31: Jfokus - Hazlecast

@PeterVeentjer

Map Scalability and High Availability

Member 1

Member 2

Member 3

Page 32: Jfokus - Hazlecast

@PeterVeentjer

Map Scalability and High Availability

Member 1

Member 2

Member 3

Page 33: Jfokus - Hazlecast

@PeterVeentjer

Map Scalability and High Availability

Member 1

Member 2

Member 3

Page 34: Jfokus - Hazlecast

@PeterVeentjer

Map Scalability and High Availability

Member 1

Member 2

Page 35: Jfokus - Hazlecast

Demo

@PeterVeentjer

Page 36: Jfokus - Hazlecast

@PeterVeentjer

Multimap

• Collection as value

• Serialization Overhead

• Lost update

Page 37: Jfokus - Hazlecast

Demo

@PeterVeentjer

Page 38: Jfokus - Hazlecast

@PeterVeentjer

BlockingQueue  queue  =  new  LinkedBlockingQueue();  queue.offer("1");  Object  item  =  queue.take();  

Queue

Page 39: Jfokus - Hazlecast

@PeterVeentjer

!HazelcastInstance  hz  =  Hazelcast.newHazelcastInstance();  BlockingQueue  queue  =  hz.getQueue("queue");  queue.offer("1");  Object  item  =  queue.take();

Queue

Page 40: Jfokus - Hazlecast

Demo

@PeterVeentjer

Page 41: Jfokus - Hazlecast

@PeterVeentjer

ITopic  topic  =  hz.getTopic("topic");          //publishing  topic.publish(msg);      !//subscribing        topic.addMessageListener(new  TopicSubscriber());  !public  class  TopicSubscriber  implements  MessageListener<String>  {          public  void  onMessage(Message<String>  m)  {                  System.out.println(m.getMessageObject());          }  }

Topic

Page 42: Jfokus - Hazlecast

@PeterVeentjer

Client

• Simplified

• Encryption

• Load Balance Policy

• C++ and C# version

Page 43: Jfokus - Hazlecast

@PeterVeentjer

HazelcastInstance  client  =  HazelcastClient.newHazelcastClient();  

Client

Page 44: Jfokus - Hazlecast

@PeterVeentjer

Network Communication

• Cluster Discovery

• Multicast

• TCP/IP Cluster

• AWS Cluster

• Normal Network Communication

• TCP/IP

Page 45: Jfokus - Hazlecast

@PeterVeentjer

Advanced Hazelcast

Page 46: Jfokus - Hazlecast

@PeterVeentjer

!ILock  lock  =  hz.getLock(“someLock”);  IAtomicLong  counter  =  getAtomicLong(“someCounter”);  IMap  map  =  hz.getMap(“someMap”);  map.put(“somePerson”,new  Person());  map.get(“somePerson”);

Data Locality: Problem

Page 47: Jfokus - Hazlecast

@PeterVeentjer

Member 1

Member 2

Member 3

SomeLock

SomeCounter

SomePerson

Page 48: Jfokus - Hazlecast

@PeterVeentjer

name@partitionkey

name

Page 49: Jfokus - Hazlecast

@PeterVeentjer

ILock  lock  =  hz.getLock(“someLock@foo”);IAtomicLong  counter  =  hz.getAtomicLong(“someCounter@foo”);  IMap  map  =  hz.getMap(“someMap”);  map.put(“somePerson@foo”,  new  Person());  Person  p  =  map.get(“somePerson@foo”);

Data Locality: Fixed

Page 50: Jfokus - Hazlecast

@PeterVeentjer

Member 1

Member 2

Member 3

SomeLock

SomeCounter

SomePerson

Foo Partition

Page 51: Jfokus - Hazlecast

@PeterVeentjer

IAtomicLong  c1  =  …  IAtomicLong  c2  =  hz.getAtomicLong(“c2@“+c1.getPartitionKey());

Adding object in same partition

Page 52: Jfokus - Hazlecast

@PeterVeentjer

Executor

• Execute task anywhere

• Execute task on key owner

• Execute task

• one/all/subset members

• Synchronisation

• Future

• ExecutionCallback

• CompletableFuture Hazelcast 3.3

Page 53: Jfokus - Hazlecast

Demo

@PeterVeentjer

Page 54: Jfokus - Hazlecast

@PeterVeentjer

Locking

• Locks

• TransactionalMap.getForUpdate

• Map.Lock

Page 55: Jfokus - Hazlecast

Demo

@PeterVeentjer

Page 56: Jfokus - Hazlecast

@PeterVeentjer

public  void  increment(int  accountId,int  amount){          Account  account  =  accounts.get(accountId);          account.balance+=amount;          accounts.put(accountId,  account);  }  

Race problem

Page 57: Jfokus - Hazlecast

@PeterVeentjer

public  void  increment(int  accountId,int  amount){          accounts.lock(accountId);          try{                  Account  account  =  accounts.get(accountId);                  account.balance+=amount;                  accounts.put(accountId,  account);          }finally{                  accounts.unlock(accountId);          }  }  

Pessimistic Increment

Page 58: Jfokus - Hazlecast

@PeterVeentjer

public  void  increment(int  accountId,int  amount){          accounts.lock(accountId);          try{                  Account  account  =  accounts.get(accountId);                  account.balance+=amount;                  accounts.put(accountId,  account);          }finally{                  accounts.unlock(accountId);          }  }  

Pessimistic Increment

Page 59: Jfokus - Hazlecast

@PeterVeentjer

public  void  increment(int  accountId,int  amount){          for(;;){                  Account  oldAccount  =  accounts.get(accountId);                  Account  newAccount  =  new  Account(oldAccount);                  newAccount.balance+=amount;                  if(accounts.replace(accountId,  oldAccount,newAccount)){                          return;                  }          }  }  

Optimistic Increment

Page 60: Jfokus - Hazlecast

@PeterVeentjer

public  void  increment(int  accountId,int  amount){          for(;;){                  Account  oldAccount  =  accounts.get(accountId);                  Account  newAccount  =  new  Account(oldAccount);                  newAccount.balance+=amount;                  if(accounts.replace(accountId,  oldAccount,newAccount)){                          return;                  }          }  }  

Optimistic Increment

Page 61: Jfokus - Hazlecast

@PeterVeentjer

DATA

Bad: Send Data to Function

DATA

Good: Send Function to Data

Read Data

Write Data

Write Function

Page 62: Jfokus - Hazlecast

@PeterVeentjer

private  class  BalanceTask  implements  Runnable,Serializable{          private  int  accountId,  amount;  !        public  void  run()  {                  for(;;){                          Account  oldAccount  =  accounts.get(accountId);                          Account  newAccount  =  new  Account(oldAccount);                          newAccount.balance+=amount;                          if(accounts.replace(accountId,  oldAccount,newAccount)){                                  return;                          }                  }          }  }        

Increment with runnable

Page 63: Jfokus - Hazlecast

@PeterVeentjer

public  void  increment(int  accountId,  int  amount){          BalanceTask  task  =  new  BalanceTask(accountId,amount);          executorService.executeOnKeyOwner(task,accountId);  }

Increment with runnable

Page 64: Jfokus - Hazlecast

@PeterVeentjer

class  BalanceProcessor                  extends  AbstractEntryProcessor<Integer,Account>{          int  amount;          BalanceProcessor(int  amount)  {                  this.amount  =  amount;          }  !        @Override          public  Object  process(Map.Entry<Integer,  Account>  entry)  {                  entry.getValue().balance+=amount;                  return  null;          }  }

Increment with EntryProcessor

Page 65: Jfokus - Hazlecast

@PeterVeentjer

public  void  increment(int  accountId,  int  amount){          BalanceProcessor  processor  =  new  BalanceProcessor(amount);          accounts.executeOnKey(accountId,  processor);  }  

Using entry processor

Page 66: Jfokus - Hazlecast

@PeterVeentjer

Map: In Memory Format

• 2 Options

• BINARY

• OBJECT

• Predicates

• EntryProcessor

Page 67: Jfokus - Hazlecast

@PeterVeentjer

SPI• You can write your own distributed data-structures

• Example

• Distributed Actors implementation

Page 68: Jfokus - Hazlecast

@PeterVeentjer

Serialization API

• Serializable/Externalizable

• Portable

• ByteArraySerializable

• StreamSerializer

• Kryo

• Jackson Smile

• Protobuf

Page 69: Jfokus - Hazlecast

@PeterVeentjer

Kryo SerializationSi

ze in

Byt

es

0

5,000

10,000

15,000

20,000

Serialization Kryo Kryp + Compr

Page 70: Jfokus - Hazlecast

@PeterVeentjer

!SerializerConfig  productSerializer  =  new  SerializerConfig()            .setTypeClass(Product.class)            .setImplementation(new  ProductSerializer());  !Config  config  =  new  Config();  config.getSerializationConfig().addSerializerConfig(productSerializer);  HazelcastInstance  hz  =  Hazelcast.newHazelcastInstance(config);

Pluggable Serialization

Page 71: Jfokus - Hazlecast

@PeterVeentjer

IMap<Integer,Account>  accounts  =  hz.getMap(“accounts”);  Map<Integer,Integer>  result  =  accounts            .map(new  AccountSumMapper())            .reduce(new  AccountSumReducer())            .submit()

Hazelcast 3.2 Map Reduce

Page 72: Jfokus - Hazlecast

@PeterVeentjer

Enterprise vs Community edition

• Support contracts

• Elastic Memory

• Security

• Management Center

Page 73: Jfokus - Hazlecast

@PeterVeentjer

The Future

• Topologies

• Hosted Management Center

• Dynamic Creation

• Map of Maps

• Tiered storage

Page 74: Jfokus - Hazlecast

@PeterVeentjer

Questions?

You can find us at the Hazelcast booth!

Good Question? Get a Hazelcast

book!