architecture of messagepack

Post on 08-Mar-2015

249 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Architecture of

MessagePackSadayuki Furuhashi

What’s MessagePack?

• Efficient serialization library

• Rich data structures - compatible with JSON

• Dynamic typing

• Remote Procedure Call (RPC)

• Synchronous, Asynchronous and Callback style

• Concurrent calls with multiple servers

• Event-driven I/O

• Interface Definition Language (IDL) - compatible with Thrift

Efficient Serialization

1. Compact 2. Fast

・ Zero-copy (C++)

・ Stream deserialization

・ Binary-based format

・ Embed type information

Format of MessagePack

JSON MessagePack

null

Integer

Array

String

Map

null c0

10 0a

[20] 91 14

”30” a2 ‘3’ ‘0’

{“40”:null} 81 a1 ‘4’ ‘0’ c0

Format of MessagePack

JSON MessagePack

null

Integer

Array

String

Map

null c0

10 0a

[20] 91 14

”30” a2 ‘3’ ‘0’

{“40”:null} 81 a1 ‘4’ ‘0’ c0

4 bytes 1 byte

2 bytes 1 byte

4 bytes 2 bytes

4 bytes 3 bytes

11 bytes 5 bytes

Format of MessagePack

Fixed length types Variable length types

・ Raw bytes

・ Array

・ Map

・ Integer

・ Floating point

・ Boolean

・ Nil

type value type body...length

Type information

Type information0x000xc20xc30xca0xcb0xcc0xcd0xce0xcf0xdf...

nil false true float double uint8 uint16 uint32 uint64 int8 ...

Types

0xc00xe0

Type information

Embed value

Positive FixNum

Negative FixNum

FixMapFixArray

FixRaw

0x00

0xc0

0x800x900xa0

0xe0

0x000xc20xc30xca0xcb0xcc0xcd0xce0xcf0xdf...

nil false true float double uint8 uint16 uint32 uint64 int8 ...

Type information Types

Zero-copy serialization

Zero-copy deserialization

Performance

It measured the elapsed time of serializing and deserializing 200,000 target objects. The target object consists of the three integers and 512 bytes string.

Remote Procedure Call

MessagePack-RPC

Inter-process messaging library forclients, servers and cluster applications.

Inter-process messaging library forclients, servers and cluster applications.

Remote Procedure Call

MessagePack-RPC

Concept of Future

Multithreadedevent-driven I/O

Communicates with multiple servers concurrently

Synchronous call

require 'msgpack/rpc'

client = MessagePack::RPC::Client.new(host, port)

result = client.call(:method, arg1, arg2)

Asynchronous callrequire 'msgpack/rpc'

client = MessagePack::RPC::Client.new(host, port)

future1 = client.call_async(:methodA, arg1, arg2)future2 = client.call_async(:methodB, arg1, arg2)

result1 = future1.getresult2 = future2.get

Callbackrequire 'msgpack/rpc'

client = MessagePack::RPC::Client.new(host, port)

client.callback(:method, arg, arg2) do |future| result = future.getend

client.join

Concurrent calls with multiple servers

require 'msgpack/rpc'

loop = MessagePack::RPC::Loop.new

client1 = MessagePack::RPC::Client.new(host1, port1, loop)client2 = MessagePack::RPC::Client.new(host2, port2, loop)

future1 = client1.call_async(:methodA, arg1, arg2)future2 = client2.call_async(:methodB, arg1, arg2)

result1 = future1.getresult2 = future2.get

Connection Poolingrequire 'msgpack/rpc'

sp = MessagePack::RPC::SessionPool.new

session1 = sp.get_session(host1, port1)session2 = sp.get_session(host2, port2)

future1 = session1.call_async(:methodA, arg1, arg2)future2 = session2.call_async(:methodB, arg1, arg2)

result1 = future1.getresult2 = future2.get

Concurrent calls with multiple servers

Client

Session Loop Server

Client

ServerSession Loop

sharedevent loop

Client

Client

Concurrent calls with multiple servers

Server

Server

Loop

Session

Session

Connection Pooling

Session PoolServer

Server

pools these connectionsLoop

Session

Session

Server architecture

Dispatcher

ServerClient

Client

Loop

Event-driven I/O

• Performance of the Loop is important.

• Java version uses Netty (JBoss’ I/O framework)

• Multithreaded

• Utilizes Java’s NIO

• C++ version uses mpio (Kumofs’ I/O architecture)

• Multithreaded

• Utilizes epoll or kqueue

• Ruby version uses Rev (libev for Ruby)

• Utilizes epoll or kqueue

Multithreaded event-driven I/O

The MessagePack Project

http://msgpack.sourceforge.net/

top related