Introduction to MINA · 2020-02-25 · ByteBuffer • Core NIO construct • MINA version that...

Preview:

Citation preview

The high-performance protocol construction toolkit.

Apache

Peter Royal <proyal@apache.org>Originally presented at ApacheCon US 2007 in

Atlanta, GA

(if you can’t read this, move closer!)

1Wednesday, November 14, 2007

Hi, I’m Peterhttp://fotap.org/~osi

2Wednesday, November 14, 2007

MINA hacker since Fall 2005

3Wednesday, November 14, 2007

Radar Networkshttp://radarnetworks.com

4Wednesday, November 14, 2007

Apache Memberhttp://apache.org

6Wednesday, November 14, 2007

What is MINA?

7Wednesday, November 14, 2007

MINA?8Wednesday, November 14, 2007

MultipurposeInfrastructureNetworkedApplications

http://mina.apache.org

9Wednesday, November 14, 2007

Built on Java NIO

10Wednesday, November 14, 2007

Non-Blocking

11Wednesday, November 14, 2007

Asynchronous

12Wednesday, November 14, 2007

Event-Driven(SEDA!)

13Wednesday, November 14, 2007

Multiple Transports(framework is really agnostic)

14Wednesday, November 14, 2007

TCP

15Wednesday, November 14, 2007

UDP(being re-written for 2.0)

16Wednesday, November 14, 2007

In-VM(great for testing)

17Wednesday, November 14, 2007

Apache Portable Runtime (APR)

(under development, alternate TCP/UDP implementation)

18Wednesday, November 14, 2007

(and more..)

19Wednesday, November 14, 2007

Smartly Designed

20Wednesday, November 14, 2007

Follows Inversion of Control Pattern

(plays nicely with PicoContainer, Spring, etc)

21Wednesday, November 14, 2007

Separation of Concerns

22Wednesday, November 14, 2007

Application Logic

Wire Protocol

Rather than this...23Wednesday, November 14, 2007

Concerns are Separated

Wire Protocol

Application Logic

24Wednesday, November 14, 2007

Stable and Production-Ready

• v1.0 released Fall 2006

• v1.1 released April 2007

• Same API as v1.0 but uses Java 5 Concurrency primitives

• v2.0 this year

• API simplification based on lessons learned

• Performance boosts too!

25Wednesday, November 14, 2007

Many Protocols & Users(here are a few...)

26Wednesday, November 14, 2007

Apache Directory

http://directory.apache.org

LDAPv3, NTP, DNS, DHCP and Kerberos

27Wednesday, November 14, 2007

SubEthaSTMPhttp://subethasmtp.tigris.org/

SMTP

28Wednesday, November 14, 2007

Apache (incubating)

Qpidhttp://cwiki.apache.org/qpid/

Advanced Messaging Queuing Protocol (AMQP)

(from Wall Street!)

29Wednesday, November 14, 2007

red5http://www.osflash.org/red5

RTMP(talk to Flash player)

31Wednesday, November 14, 2007

...and more!(maybe you, next time!)

32Wednesday, November 14, 2007

Key Concepts

33Wednesday, November 14, 2007

ByteBuffer

• Core NIO construct

• MINA version that wraps and provides additional convenience methods

• auto-expanding, string encoding

• MINA gives control...

• allocate from the Heap or Stack

• optional Pooling

• (in v2, will be non-pooled and heap-only, as it provides the best performance)

34Wednesday, November 14, 2007

Future

• Represents a function call that completes asynchronously

• Provides blocking functions to retrieve the result

• MINA allows callbacks to be invoked upon completion, so invoking thread can “fire and forget”

• (unlike the Java 5 Future)

35Wednesday, November 14, 2007

IoService

IoHandler

IoFilter

IoFilter

IoFilter

IoProcessor

Reads

Writes

36Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Two Versions

37Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

IoAcceptor“act as server”

single thread for new connections

38Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

IoConnector“act as client”

39Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Connection instance is an IoSession

40Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Handles reads and writes

41Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Instance count scales with CPU/Load

42Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Session fixed to an Instance(under review for v2)

43Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Chain of IoFilter’s

44Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Per Connection

45Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Reusable

46Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Hot Deployable

47Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Filter all eventsRead / Write / Idle / etc

48Wednesday, November 14, 2007

IoHandler

IoProcessor

IoFilter

IoFilter

IoFilter

IoService

Reads

Writes

Application Logic Lives Here

49Wednesday, November 14, 2007

Large Library of IoFilter’s

50Wednesday, November 14, 2007

Protocol Conversion

• Framework to plug in your own codecs to handle conversion to/from a ByteBuffer

• Existing codecs

• Text-based

• Java Serialization

51Wednesday, November 14, 2007

Blacklist

52Wednesday, November 14, 2007

Logging(great for debugging!)

53Wednesday, November 14, 2007

SSL / TLS

54Wednesday, November 14, 2007

Compression

55Wednesday, November 14, 2007

Read Throttling(write throttling is in 2.0)

56Wednesday, November 14, 2007

Thread Models(a necessary evil)

57Wednesday, November 14, 2007

“single threaded”

58Wednesday, November 14, 2007

One IoProcessor Thread

59Wednesday, November 14, 2007

Scalability sucks

60Wednesday, November 14, 2007

Add more IoProcessor Threads

(at least one per CPU core)

61Wednesday, November 14, 2007

Lowest latencyScales nicely

(connection latency to be addressed in v2)

62Wednesday, November 14, 2007

“multi threaded”

63Wednesday, November 14, 2007

use ExecutorFilter

64Wednesday, November 14, 2007

IoProcessor threads only do reads & writes

(the intent)

65Wednesday, November 14, 2007

Filters execute on a different thread.

(filter location is key!)

66Wednesday, November 14, 2007

Work for a session is serialized(queued per session)

67Wednesday, November 14, 2007

Work is delegated to an Executor

(generally a java.util.concurrent.ThreadPoolExecutor)

68Wednesday, November 14, 2007

Size thread pool to “active” session count

(too much in queue == OOM!Use the Read Throttle filter)

69Wednesday, November 14, 2007

“recommended application pattern”

• use ExecutorFilter as first in chain

• unless you need really low latency

• use ProtocolCodecFilter

• convert the wire protocol into a Java representation

• put application logic into an IoHandler

• store state in the IoSession

• minimum of Java 5

• java.util.concurrent rocks!

70Wednesday, November 14, 2007

Example Time!

71Wednesday, November 14, 2007

Everybody loves a Haiku

72Wednesday, November 14, 2007

This is our Haiku validator73Wednesday, November 14, 2007

Simple Protocol

• Connect

• Send 3 lines of text

• Receive HAIKU! or NOT A HAIKU:

• (plus a little reason why not)

74Wednesday, November 14, 2007

ProtocolCodecFilter + TextLineCodecFactory

Bytes to Java String’s. For free!

75Wednesday, November 14, 2007

ToHaikuIoFilterThree String’s to a Haiku

76Wednesday, November 14, 2007

Filter is very testable(mock objects rock!)

77Wednesday, November 14, 2007

IoHandler is very simpleValidate Haiku, send result

78Wednesday, November 14, 2007

Also very testable79Wednesday, November 14, 2007

Very easy to hook it all up80Wednesday, November 14, 2007

Questions?(I’m here all week!)

81Wednesday, November 14, 2007

http://mina.apache.org

83Wednesday, November 14, 2007