introduction to minamina.apache.org/assets/pdfs/acus2007.pdf · 2020. 2. 25. · • mina version...
TRANSCRIPT
The high-performance protocol construction toolkit.
Apache
Peter Royal <[email protected]>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
San Francisco5Wednesday, 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
Openfirehttp://www.jivesoftware.com/
products/openfire/
XMPP
30Wednesday, 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
Thank You!82Wednesday, November 14, 2007