SlideShare a Scribd company logo
Asynchronous, Event-driven
Network Application Development
with Netty
Rapid development of maintainable high performance protocol servers & clients
Ankara JUG, June 2015
Ersin Er - @ersiner
About the speaker, Ersin Er
Summary of what’s on LinkedIn
● Computer Sci. Student @ Hacettepe Univ. - BSc (’03), MSc (’06), PhD (~)
● Teaching Assistant [and System Admin.] @ Hacettepe Univ. (’03-’11)
● Committer and PMC Member @ Apache Software Foundation (’05-’10)
● Software Architect @ Peak Games (’11-’13)
● Co-founder and Solutions Architect @ Metasolid (’14-’15)
● Hands-on Solutions and Software Architect.
● Distributed Systems, Concurrency and Performance Programming
enthusiast.
● Does tech biz, manages projects, deals with people.
● Used to be a perfectionist. Does not produce garbage.
How to name your presentation
Today’s Agenda
● Blocking vs Non-Blocking I/O
● NIO and Netty Abstractions
● What sets Netty apart
● Netty Reusables
● Netty & HTTP
● Servlet 3.0 and 3.1 (for our beloved JavaEE friends )
● Netty Ecosystem
Do not expect a 1-1
matched flow with
these titles.
I prefer discussions to
static information
dumping.
Let’s review
Blocking Socket I/O in Java
by examples
in order to steer
our discussions on
Non-Blocking I/O,
Java NIO
and Netty.
Blocking I/O Socket Server Example
Single Client, Single Request
public static void serve1() throws IOException {
ServerSocket serverSocket = new ServerSocket(10000);
Socket clientSocket = serverSocket.accept();
InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
BufferedReader in = new BufferedReader(isr);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
if ((request = in.readLine()) != null) {
response = request + " processed at " + new Date();
out.println(response);
}
in.close();
out.close();
}
Protocol
Implementation
Blocking I/O Socket Server Example
Single Client, Multi Request
public static void serve2() throws IOException {
ServerSocket serverSocket = new ServerSocket(10000);
Socket clientSocket = serverSocket.accept();
InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
BufferedReader in = new BufferedReader(isr);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {
response = request + " processed at " + new Date();
out.println(response);
}
in.close();
out.close();
}
Wow!
That was
easy!
Blocking I/O Socket Server Example
Single Client, Multi Request, Client Exit Control
public static void serve3() throws IOException {
ServerSocket serverSocket = new ServerSocket(10000);
Socket clientSocket = serverSocket.accept();
InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
BufferedReader in = new BufferedReader(isr);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {
if ("Exit".equals(request)) {
break;
}
response = request + " processed at " + new Date();
out.println(response);
}
in.close();
out.close();
}
More Protocol
Blocking I/O Socket Server Example
Multi Client, Multi Request, Client Exit Control
public static void serve4() throws IOException {
ServerSocket serverSocket = new ServerSocket(10000);
while (true) {
Socket clientSocket = serverSocket.accept();
InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
BufferedReader in = new BufferedReader(isr);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {
if ("Exit".equals(request)) {
break;
}
response = request + " processed at " + new Date();
out.println(response);
}
in.close();
out.close();
}
}
A new generation ofInternet servicesupporting multipleusers?..
Blocking I/O Socket Server Example
Concurrent Clients, Multi Request, Client Exit Control
public static void serve5() throws IOException {
ServerSocket serverSocket = new ServerSocket(10000);
while (true) {
final Socket clientSocket = serverSocket.accept();
new Thread() {
public void run() {
try {
InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
BufferedReader in = new BufferedReader(isr);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {
if ("Exit".equals(request)) { break; }
response = request + " processed at " + new Date(); out.println(response);
}
in.close(); out.close();
} catch (IOException e) { e.printStackTrace(); }
}
}.start();
}
}
!!!
These are far from
being production
code. In fact, they
are terrible ones.
Uncontrolled
Power!
Multi-Threaded Blocking I/O Exhausting Resources
What to do?
public static void serve5() throws IOException {
ServerSocket serverSocket = new ServerSocket(10000);
while (true) {
final Socket clientSocket = serverSocket.accept();
new Thread() {
public void run() {
try {
InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
BufferedReader in = new BufferedReader(isr);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {
if ("Exit".equals(request)) { break; }
response = request + " processed at " + new Date(); out.println(response);
}
in.close(); out.close();
} catch (IOException e) { e.printStackTrace(); }
}
}.start();
}
}
!!!
These are far from
being production
code. In fact, they
are terrible ones.
Uncontrolled
Power!
What to do?
● Pooling?
● Executors?
● Queuing?
Multi-Threaded Blocking I/O Exhausting Resources
What to do? - Critical Discussion
public static void serve5() throws IOException {
ServerSocket serverSocket = new ServerSocket(10000);
while (true) {
final Socket clientSocket = serverSocket.accept();
new Thread() {
public void run() {
try {
InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
BufferedReader in = new BufferedReader(isr);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {
if ("Exit".equals(request)) { break; }
response = request + " processed at " + new Date(); out.println(response);
}
in.close(); out.close();
} catch (IOException e) { e.printStackTrace(); }
}
}.start();
}
}
!!!
These are far from
being production
code. In fact, they
are terrible ones.
Uncontrolled
Power!
What to do?
● Pooling?
● Executors?
● Queuing?
The discussion here iscritical for switching(our minds) to Non-Blocking I/O, Java NIOand Netty
Asynchronous, Event-driven Network Application Development with Netty
Non-Blocking I/O
● Sockets in Non-Blocking Mode
● I/O Multiplexing
○ epoll (Linux)
○ kqueue (FreeBSD)
○ IOCP (Windows, Solaris)
● Single Thread for many sockets (or file
descriptors)
● Key to high performance servers
Non-Blocking or
Asynchronous?
(Blocking or Synchronous?)
Simplified definitions that can work for us today:
● Non-Blocking: No waiting for the operation
to complete
● Asynchronous: Notification upon completion
of non-blocking operation
Java NIO
● NIO = Non-Blocking I/O?
● It’s Java New I/O
● It’s no longer new (came with Java 1.4)
○ Java 7 comes with V2
● Not only for Socket I/O
● First Class Citizens
○ Channels
○ Buffers
○ Selectors
NIO - Channels and Buffers
● Channels
○ FileChannel
○ DatagramChannel
○ SocketChannel
○ ServerSocketChannel
● Buffers
○ ByteBuffer
○ CharBuffer
○ DoubleBuffer
○ FloatBuffer
○ IntBuffer
○ LongBuffer
○ ShortBuffer
● Data are read from
Channels into Buffers
● Data are written from
Buffers into Channels
NIO - Buffers are serious business
Buffer capacity, position and limit
in write and read mode.
Buffer.flip() makes the mode
change.
We also have:
● Heap Buffers
○ Array Based
○ ByteBuffer.allocate()
● Direct Buffers
○ Off-Heap
○ ByteBuffer.allocateDirect()
NIO - Selectors & I/O Multiplexing
OIO vs NIO
From NIO to Netty
Using NIO directly is like using
Naked Threads.
Netty replaces NIO APIs
with superiors and
provides incredible
capabilities.
Netty Core Components and Utilities
● Channels and Transports
● ByteBuf and Un/Pooled Allocation
Management
● ChannelHandlers and ChannelPipeline
● The Codec Framework and Reusable
Codecs
● Bootstraps and ChannelInitializers
● Futures and EventLoops
Channels and Transports
Package View
● io.netty.channel.embedded
● io.netty.channel.epoll
● io.netty.channel.local
● io.netty.channel.nio
● io.netty.channel.oio
● io.netty.channel.rxtx
● io.netty.channel.sctp
● io.netty.channel.sctp.nio
● io.netty.channel.sctp.oio
● io.netty.channel.socket
● io.netty.channel.socket.nio
● io.netty.channel.socket.oio
● io.netty.channel.udt
● io.netty.channel.udt.nio
● io.netty.channel.unix
● You can both read from write into Channels
(they are duplex as opposed to streams)
● All I/O operations on channels are
asynchronous and return listenable
futures
● Channels are implemented for various
Transports types:
○ Unified API for NIO and OID (and
others)
○ Epoll transport for extreme
performance
○ Local transport for in VM
communication
○ Embedded transport for Unit Testing
ByteBuf and Un/Pooled Allocation
Management
● ByteBuf is improved version of ByteBuffer
● ByteBuf has both write and read index, does not need
flip()
● CompositeByteBuf enables Zero-Copy
● ByteBufs can be pooled for reducing garbage collector
pressure
https://blog.twitter.com/2013/netty-4-at-twitter-reduced-gc-overhead
ChannelHandlers and ChannelPipeline
Channel
Inbound
Handler
Channel
Inbound
Handler
Channel
Outbound
Handler
Channel
Outbound
Handler
Head Tail
Socket
Channel
Pipeline
ChannelPipeline has been designed
with Intercepting Filter pattern and
resembles Servlet Filters
Codec Framework
● Simplified and focused API on top of
ChannelHandlers
● Decoders are ChannelInboundHandlers
● Encoders are ChannelOutboundHandlers
● Codecs are both CIH and COH
Reusable Codecs
● io.netty.handler.codec.base64
● io.netty.handler.codec.bytes
● io.netty.handler.codec.compression
● io.netty.handler.codec.haproxy
● io.netty.handler.codec.http
● io.netty.handler.codec.http.cookie
● io.netty.handler.codec.http.cors
● io.netty.handler.codec.http.multipart
● io.netty.handler.codec.http.websocketx
● io.netty.handler.codec.marshalling
● io.netty.handler.codec.protobuf
● io.netty.handler.codec.rtsp
● io.netty.handler.codec.sctp
● io.netty.handler.codec.serialization
● io.netty.handler.codec.socks
● io.netty.handler.codec.spdy
● io.netty.handler.codec.string
● io.netty.handler.logging
● io.netty.handler.ssl
● io.netty.handler.stream
● io.netty.handler.timeout
● io.netty.handler.traffic
● DelimiterBasedFrameDecoder
● LengthFieldBasedFrameDecoder
● FixedLengthFrameDecoder
● LineBasedFrameDecoder
Some primitive
ones
All of these
represent
patterns of
protocol
development
Bootstraps and
ChannelInitializers
Bootstraps help bootstrap
channels (server or client
side)
● Set EventLoopGroups
● Set ChannelHandlers
● Bind to Network
Interfaces
ChannelInitializer is a
special ChannelHandler
● Handles
channelRegistered
event and applies its
pipeline config to the
channel
● (Suggested: See its
source code)
Futures and EventLoops
● All I/O operations on Channels return listenable futures
● Each Channel is assigned to a single EventLoop and
stays so during its lifetime
● EventLoops handle all I/O operations of their Channels
● EventLoopGroups are like Thread Pools and number of
EventLoops they manage depends on number of CPU
cores (and possible other factors)
● Listeners registered to Futures are handled by
appropriate EventLoop selected by Netty
Now, Examples
Servlet
● Servlet 3.0 - Async Processing of Response
● Servlet 3.1 - Non-Blocking Processing of
Request (Content)
Did you expect more?
Come on, this is Netty :-)
Netty Versions
● 3.x Old, Stable
● 4.0.x Current, Stable
○ Huge improvements over 3.x
○ https://github.com/netty/netty/wiki/New-and-noteworthy-in-4.0
● 4.1 Beta (Close to be Stable)
○ Mostly backward compatible with 4.0
○ Android support and lots of new codecs
○ https://github.com/netty/netty/wiki/New-and-noteworthy-in-4.1
● 5.0 Alpha - Backward Incompatible Improvements
○ https://github.com/netty/netty/wiki/New-and-noteworthy-in-5.0
Ecosystem - Related Projects
(The ones I’ve been interested in and mostly using Netty at its heart)
● Vert.x - A toolkit for building reactive applications on the JVM
● Ratpack - Simple, lean & powerful HTTP apps
● async-http-client - Asynchronous Http and WebSocket Client
library for Java
● RxNetty - Reactive Extension (Rx) Adaptor for Netty
● nettosphere - A Java WebSocket/HTTP server based on the
Atmosphere and Netty Framework
● grpc-java - The Java gRPC implementation (by Google)
● Play Framework - The High Velocity Web Framework For Java and
Scala
● More at http://netty.io/wiki/related-projects.html and http://netty.
io/wiki/adopters.html
Ecosystem - Resources
● Netty Documentation & Examples
○ http://netty.io/wiki/index.html
● StackOverflow
○ http://stackoverflow.com/questions/tagged/netty
● Netty in Action
○ http://www.manning.com/maurer/
Thanks
● You, attenders!
● Ankara JUG organizers, for having me here
● Jakob Jenkov, for allowing me use his diagrams for
explaining NIO Concepts (http://tutorials.jenkov.
com/java-nio/index.html)

More Related Content

What's hot

Types of connections in Power BI
Types of connections in Power BITypes of connections in Power BI
Types of connections in Power BI
Swapnil Jadhav
 
How Adobe Does 2 Million Records Per Second Using Apache Spark!
How Adobe Does 2 Million Records Per Second Using Apache Spark!How Adobe Does 2 Million Records Per Second Using Apache Spark!
How Adobe Does 2 Million Records Per Second Using Apache Spark!
Databricks
 
Apache Arrow: Open Source Standard Becomes an Enterprise Necessity
Apache Arrow: Open Source Standard Becomes an Enterprise NecessityApache Arrow: Open Source Standard Becomes an Enterprise Necessity
Apache Arrow: Open Source Standard Becomes an Enterprise Necessity
Wes McKinney
 
BigQuery for Beginners
BigQuery for BeginnersBigQuery for Beginners
BigQuery for Beginners
Better&Stronger
 
Gartner 2021 Magic Quadrant for Cloud Database Management Systems.pdf
Gartner 2021 Magic Quadrant for Cloud Database Management Systems.pdfGartner 2021 Magic Quadrant for Cloud Database Management Systems.pdf
Gartner 2021 Magic Quadrant for Cloud Database Management Systems.pdf
momirlan
 
Introduction to Azure Data Factory
Introduction to Azure Data FactoryIntroduction to Azure Data Factory
Introduction to Azure Data Factory
Slava Kokaev
 
Part 4: Power Platform 概説 (製造リファレンス・アーキテクチャ勉強会)
Part 4: Power Platform 概説 (製造リファレンス・アーキテクチャ勉強会)Part 4: Power Platform 概説 (製造リファレンス・アーキテクチャ勉強会)
Part 4: Power Platform 概説 (製造リファレンス・アーキテクチャ勉強会)
Takeshi Fukuhara
 
Microsoft MVP/Regional Director x Microsoft Japan Digital Days #MSDD2021
Microsoft MVP/Regional Director x Microsoft Japan Digital Days #MSDD2021Microsoft MVP/Regional Director x Microsoft Japan Digital Days #MSDD2021
Microsoft MVP/Regional Director x Microsoft Japan Digital Days #MSDD2021
Rie Moriguchi
 
Managing Millions of Tests Using Databricks
Managing Millions of Tests Using DatabricksManaging Millions of Tests Using Databricks
Managing Millions of Tests Using Databricks
Databricks
 
Glue DataBrewでデータをクリーニング、加工してみよう
Glue DataBrewでデータをクリーニング、加工してみようGlue DataBrewでデータをクリーニング、加工してみよう
Glue DataBrewでデータをクリーニング、加工してみよう
takeshi suto
 
技術者として抑えておきたい Power BI アーキテクチャ
技術者として抑えておきたい Power BI アーキテクチャ技術者として抑えておきたい Power BI アーキテクチャ
技術者として抑えておきたい Power BI アーキテクチャ
Yugo Shimizu
 
Power BI Reporting & Project Online
Power BI Reporting & Project OnlinePower BI Reporting & Project Online
Power BI Reporting & Project Online
Hari Thapliyal
 
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
Hadoop / Spark Conference Japan
 
Power apps presentation
Power apps presentationPower apps presentation
Power apps presentation
InnoTech
 
Best Practice of Compression/Decompression Codes in Apache Spark with Sophia...
 Best Practice of Compression/Decompression Codes in Apache Spark with Sophia... Best Practice of Compression/Decompression Codes in Apache Spark with Sophia...
Best Practice of Compression/Decompression Codes in Apache Spark with Sophia...
Databricks
 
Demystifying data engineering
Demystifying data engineeringDemystifying data engineering
Demystifying data engineering
Thang Bui (Bob)
 
Nonrelational Databases
Nonrelational DatabasesNonrelational Databases
Nonrelational Databases
Udi Bauman
 
Microsoft power virtual agents
Microsoft power virtual agentsMicrosoft power virtual agents
Microsoft power virtual agents
Himanshi Singh Chandel
 
Big Data analytics
Big Data analyticsBig Data analytics
Big Data analytics
ArunKumar5524
 
[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...
[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...
[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...
Google Cloud Platform - Japan
 

What's hot (20)

Types of connections in Power BI
Types of connections in Power BITypes of connections in Power BI
Types of connections in Power BI
 
How Adobe Does 2 Million Records Per Second Using Apache Spark!
How Adobe Does 2 Million Records Per Second Using Apache Spark!How Adobe Does 2 Million Records Per Second Using Apache Spark!
How Adobe Does 2 Million Records Per Second Using Apache Spark!
 
Apache Arrow: Open Source Standard Becomes an Enterprise Necessity
Apache Arrow: Open Source Standard Becomes an Enterprise NecessityApache Arrow: Open Source Standard Becomes an Enterprise Necessity
Apache Arrow: Open Source Standard Becomes an Enterprise Necessity
 
BigQuery for Beginners
BigQuery for BeginnersBigQuery for Beginners
BigQuery for Beginners
 
Gartner 2021 Magic Quadrant for Cloud Database Management Systems.pdf
Gartner 2021 Magic Quadrant for Cloud Database Management Systems.pdfGartner 2021 Magic Quadrant for Cloud Database Management Systems.pdf
Gartner 2021 Magic Quadrant for Cloud Database Management Systems.pdf
 
Introduction to Azure Data Factory
Introduction to Azure Data FactoryIntroduction to Azure Data Factory
Introduction to Azure Data Factory
 
Part 4: Power Platform 概説 (製造リファレンス・アーキテクチャ勉強会)
Part 4: Power Platform 概説 (製造リファレンス・アーキテクチャ勉強会)Part 4: Power Platform 概説 (製造リファレンス・アーキテクチャ勉強会)
Part 4: Power Platform 概説 (製造リファレンス・アーキテクチャ勉強会)
 
Microsoft MVP/Regional Director x Microsoft Japan Digital Days #MSDD2021
Microsoft MVP/Regional Director x Microsoft Japan Digital Days #MSDD2021Microsoft MVP/Regional Director x Microsoft Japan Digital Days #MSDD2021
Microsoft MVP/Regional Director x Microsoft Japan Digital Days #MSDD2021
 
Managing Millions of Tests Using Databricks
Managing Millions of Tests Using DatabricksManaging Millions of Tests Using Databricks
Managing Millions of Tests Using Databricks
 
Glue DataBrewでデータをクリーニング、加工してみよう
Glue DataBrewでデータをクリーニング、加工してみようGlue DataBrewでデータをクリーニング、加工してみよう
Glue DataBrewでデータをクリーニング、加工してみよう
 
技術者として抑えておきたい Power BI アーキテクチャ
技術者として抑えておきたい Power BI アーキテクチャ技術者として抑えておきたい Power BI アーキテクチャ
技術者として抑えておきたい Power BI アーキテクチャ
 
Power BI Reporting & Project Online
Power BI Reporting & Project OnlinePower BI Reporting & Project Online
Power BI Reporting & Project Online
 
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
 
Power apps presentation
Power apps presentationPower apps presentation
Power apps presentation
 
Best Practice of Compression/Decompression Codes in Apache Spark with Sophia...
 Best Practice of Compression/Decompression Codes in Apache Spark with Sophia... Best Practice of Compression/Decompression Codes in Apache Spark with Sophia...
Best Practice of Compression/Decompression Codes in Apache Spark with Sophia...
 
Demystifying data engineering
Demystifying data engineeringDemystifying data engineering
Demystifying data engineering
 
Nonrelational Databases
Nonrelational DatabasesNonrelational Databases
Nonrelational Databases
 
Microsoft power virtual agents
Microsoft power virtual agentsMicrosoft power virtual agents
Microsoft power virtual agents
 
Big Data analytics
Big Data analyticsBig Data analytics
Big Data analytics
 
[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...
[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...
[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...
 

Similar to Asynchronous, Event-driven Network Application Development with Netty

Distributed real time stream processing- why and how
Distributed real time stream processing- why and howDistributed real time stream processing- why and how
Distributed real time stream processing- why and how
Petr Zapletal
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016
Frank Lyaruu
 
Couchbase@live person meetup july 22nd
Couchbase@live person meetup   july 22ndCouchbase@live person meetup   july 22nd
Couchbase@live person meetup july 22nd
Ido Shilon
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomy
Dongmin Yu
 
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
DataStax Academy
 
Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for Cassandra
Edward Capriolo
 
Tornado Web Server Internals
Tornado Web Server InternalsTornado Web Server Internals
Tornado Web Server Internals
Praveen Gollakota
 
Reactive database access with Slick3
Reactive database access with Slick3Reactive database access with Slick3
Reactive database access with Slick3
takezoe
 
Go and Uber’s time series database m3
Go and Uber’s time series database m3Go and Uber’s time series database m3
Go and Uber’s time series database m3
Rob Skillington
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
NAVER D2
 
A Deep Dive into Query Execution Engine of Spark SQL
A Deep Dive into Query Execution Engine of Spark SQLA Deep Dive into Query Execution Engine of Spark SQL
A Deep Dive into Query Execution Engine of Spark SQL
Databricks
 
Ten practical ways to improve front-end performance
Ten practical ways to improve front-end performanceTen practical ways to improve front-end performance
Ten practical ways to improve front-end performance
Andrew Rota
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the way
Oleg Podsechin
 
OrientDB - The 2nd generation of (multi-model) NoSQL
OrientDB - The 2nd generation of  (multi-model) NoSQLOrientDB - The 2nd generation of  (multi-model) NoSQL
OrientDB - The 2nd generation of (multi-model) NoSQL
Roberto Franchini
 
Asynchronous IO in Rust - Enrico Risa - Codemotion Rome 2017
Asynchronous IO in Rust - Enrico Risa - Codemotion Rome 2017Asynchronous IO in Rust - Enrico Risa - Codemotion Rome 2017
Asynchronous IO in Rust - Enrico Risa - Codemotion Rome 2017
Codemotion
 
Exploring Relay land
Exploring Relay landExploring Relay land
Exploring Relay land
Stefano Masini
 
Ledingkart Meetup #2: Scaling Search @Lendingkart
Ledingkart Meetup #2: Scaling Search @LendingkartLedingkart Meetup #2: Scaling Search @Lendingkart
Ledingkart Meetup #2: Scaling Search @Lendingkart
Mukesh Singh
 
Spring 4 Web App
Spring 4 Web AppSpring 4 Web App
Spring 4 Web App
Rossen Stoyanchev
 
Python, do you even async?
Python, do you even async?Python, do you even async?
Python, do you even async?
Saúl Ibarra Corretgé
 
cb streams - gavin pickin
cb streams - gavin pickincb streams - gavin pickin
cb streams - gavin pickin
Ortus Solutions, Corp
 

Similar to Asynchronous, Event-driven Network Application Development with Netty (20)

Distributed real time stream processing- why and how
Distributed real time stream processing- why and howDistributed real time stream processing- why and how
Distributed real time stream processing- why and how
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016
 
Couchbase@live person meetup july 22nd
Couchbase@live person meetup   july 22ndCouchbase@live person meetup   july 22nd
Couchbase@live person meetup july 22nd
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomy
 
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
 
Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for Cassandra
 
Tornado Web Server Internals
Tornado Web Server InternalsTornado Web Server Internals
Tornado Web Server Internals
 
Reactive database access with Slick3
Reactive database access with Slick3Reactive database access with Slick3
Reactive database access with Slick3
 
Go and Uber’s time series database m3
Go and Uber’s time series database m3Go and Uber’s time series database m3
Go and Uber’s time series database m3
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
A Deep Dive into Query Execution Engine of Spark SQL
A Deep Dive into Query Execution Engine of Spark SQLA Deep Dive into Query Execution Engine of Spark SQL
A Deep Dive into Query Execution Engine of Spark SQL
 
Ten practical ways to improve front-end performance
Ten practical ways to improve front-end performanceTen practical ways to improve front-end performance
Ten practical ways to improve front-end performance
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the way
 
OrientDB - The 2nd generation of (multi-model) NoSQL
OrientDB - The 2nd generation of  (multi-model) NoSQLOrientDB - The 2nd generation of  (multi-model) NoSQL
OrientDB - The 2nd generation of (multi-model) NoSQL
 
Asynchronous IO in Rust - Enrico Risa - Codemotion Rome 2017
Asynchronous IO in Rust - Enrico Risa - Codemotion Rome 2017Asynchronous IO in Rust - Enrico Risa - Codemotion Rome 2017
Asynchronous IO in Rust - Enrico Risa - Codemotion Rome 2017
 
Exploring Relay land
Exploring Relay landExploring Relay land
Exploring Relay land
 
Ledingkart Meetup #2: Scaling Search @Lendingkart
Ledingkart Meetup #2: Scaling Search @LendingkartLedingkart Meetup #2: Scaling Search @Lendingkart
Ledingkart Meetup #2: Scaling Search @Lendingkart
 
Spring 4 Web App
Spring 4 Web AppSpring 4 Web App
Spring 4 Web App
 
Python, do you even async?
Python, do you even async?Python, do you even async?
Python, do you even async?
 
cb streams - gavin pickin
cb streams - gavin pickincb streams - gavin pickin
cb streams - gavin pickin
 

Recently uploaded

Software development... for all? (keynote at ICSOFT'2024)
Software development... for all? (keynote at ICSOFT'2024)Software development... for all? (keynote at ICSOFT'2024)
Software development... for all? (keynote at ICSOFT'2024)
miso_uam
 
GT degree offer diploma Transcript
GT degree offer diploma TranscriptGT degree offer diploma Transcript
GT degree offer diploma Transcript
attueb
 
Artificial intelligence in customer services or chatbots
Artificial intelligence  in customer services or chatbotsArtificial intelligence  in customer services or chatbots
Artificial intelligence in customer services or chatbots
kayash1656
 
當測試開始左移
當測試開始左移當測試開始左移
當測試開始左移
Jersey (CHE-PING) Su
 
Independent Girls call Service Pune 000XX00000 Provide Best And Top Girl Serv...
Independent Girls call Service Pune 000XX00000 Provide Best And Top Girl Serv...Independent Girls call Service Pune 000XX00000 Provide Best And Top Girl Serv...
Independent Girls call Service Pune 000XX00000 Provide Best And Top Girl Serv...
bhumivarma35300
 
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
revolutionary575
 
Wired_2.0_Create_AmsterdamJUG_09072024.pptx
Wired_2.0_Create_AmsterdamJUG_09072024.pptxWired_2.0_Create_AmsterdamJUG_09072024.pptx
Wired_2.0_Create_AmsterdamJUG_09072024.pptx
SimonedeGijt
 
VVIP Girls Call Mumbai 9910780858 Provide Best And Top Girl Service And No1 i...
VVIP Girls Call Mumbai 9910780858 Provide Best And Top Girl Service And No1 i...VVIP Girls Call Mumbai 9910780858 Provide Best And Top Girl Service And No1 i...
VVIP Girls Call Mumbai 9910780858 Provide Best And Top Girl Service And No1 i...
jealousviolet
 
Vip Girls Call ServiCe Hyderabad 0000000000 Pooja Best High Class Hyderabad A...
Vip Girls Call ServiCe Hyderabad 0000000000 Pooja Best High Class Hyderabad A...Vip Girls Call ServiCe Hyderabad 0000000000 Pooja Best High Class Hyderabad A...
Vip Girls Call ServiCe Hyderabad 0000000000 Pooja Best High Class Hyderabad A...
ashiklo9823
 
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docxComprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Aardwolf Security
 
Prada Group Reports Strong Growth in First Quarter …
Prada Group Reports Strong Growth in First Quarter …Prada Group Reports Strong Growth in First Quarter …
Prada Group Reports Strong Growth in First Quarter …
908dutch
 
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
OnePlan Solutions
 
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
kiara pandey
 
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in CityGirls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
neshakor5152
 
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
aslasdfmkhan4750
 
How To Fill Timesheet in TaskSprint: Quick Guide 2024
How To Fill Timesheet in TaskSprint: Quick Guide 2024How To Fill Timesheet in TaskSprint: Quick Guide 2024
How To Fill Timesheet in TaskSprint: Quick Guide 2024
TaskSprint | Employee Efficiency Software
 
Odoo E-commerce website development guides
Odoo E-commerce website development guidesOdoo E-commerce website development guides
Odoo E-commerce website development guides
jhkdigitalmarketing
 
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
45unexpected
 
The Ultimate Guide to Phone Spy Apps: Everything You Need to Know
The Ultimate Guide to Phone Spy Apps: Everything You Need to KnowThe Ultimate Guide to Phone Spy Apps: Everything You Need to Know
The Ultimate Guide to Phone Spy Apps: Everything You Need to Know
onemonitarsoftware
 
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
dream girl
 

Recently uploaded (20)

Software development... for all? (keynote at ICSOFT'2024)
Software development... for all? (keynote at ICSOFT'2024)Software development... for all? (keynote at ICSOFT'2024)
Software development... for all? (keynote at ICSOFT'2024)
 
GT degree offer diploma Transcript
GT degree offer diploma TranscriptGT degree offer diploma Transcript
GT degree offer diploma Transcript
 
Artificial intelligence in customer services or chatbots
Artificial intelligence  in customer services or chatbotsArtificial intelligence  in customer services or chatbots
Artificial intelligence in customer services or chatbots
 
當測試開始左移
當測試開始左移當測試開始左移
當測試開始左移
 
Independent Girls call Service Pune 000XX00000 Provide Best And Top Girl Serv...
Independent Girls call Service Pune 000XX00000 Provide Best And Top Girl Serv...Independent Girls call Service Pune 000XX00000 Provide Best And Top Girl Serv...
Independent Girls call Service Pune 000XX00000 Provide Best And Top Girl Serv...
 
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
 
Wired_2.0_Create_AmsterdamJUG_09072024.pptx
Wired_2.0_Create_AmsterdamJUG_09072024.pptxWired_2.0_Create_AmsterdamJUG_09072024.pptx
Wired_2.0_Create_AmsterdamJUG_09072024.pptx
 
VVIP Girls Call Mumbai 9910780858 Provide Best And Top Girl Service And No1 i...
VVIP Girls Call Mumbai 9910780858 Provide Best And Top Girl Service And No1 i...VVIP Girls Call Mumbai 9910780858 Provide Best And Top Girl Service And No1 i...
VVIP Girls Call Mumbai 9910780858 Provide Best And Top Girl Service And No1 i...
 
Vip Girls Call ServiCe Hyderabad 0000000000 Pooja Best High Class Hyderabad A...
Vip Girls Call ServiCe Hyderabad 0000000000 Pooja Best High Class Hyderabad A...Vip Girls Call ServiCe Hyderabad 0000000000 Pooja Best High Class Hyderabad A...
Vip Girls Call ServiCe Hyderabad 0000000000 Pooja Best High Class Hyderabad A...
 
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docxComprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
 
Prada Group Reports Strong Growth in First Quarter …
Prada Group Reports Strong Growth in First Quarter …Prada Group Reports Strong Growth in First Quarter …
Prada Group Reports Strong Growth in First Quarter …
 
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
 
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
 
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in CityGirls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
 
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
 
How To Fill Timesheet in TaskSprint: Quick Guide 2024
How To Fill Timesheet in TaskSprint: Quick Guide 2024How To Fill Timesheet in TaskSprint: Quick Guide 2024
How To Fill Timesheet in TaskSprint: Quick Guide 2024
 
Odoo E-commerce website development guides
Odoo E-commerce website development guidesOdoo E-commerce website development guides
Odoo E-commerce website development guides
 
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
 
The Ultimate Guide to Phone Spy Apps: Everything You Need to Know
The Ultimate Guide to Phone Spy Apps: Everything You Need to KnowThe Ultimate Guide to Phone Spy Apps: Everything You Need to Know
The Ultimate Guide to Phone Spy Apps: Everything You Need to Know
 
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
 

Asynchronous, Event-driven Network Application Development with Netty

  • 1. Asynchronous, Event-driven Network Application Development with Netty Rapid development of maintainable high performance protocol servers & clients Ankara JUG, June 2015 Ersin Er - @ersiner
  • 2. About the speaker, Ersin Er Summary of what’s on LinkedIn ● Computer Sci. Student @ Hacettepe Univ. - BSc (’03), MSc (’06), PhD (~) ● Teaching Assistant [and System Admin.] @ Hacettepe Univ. (’03-’11) ● Committer and PMC Member @ Apache Software Foundation (’05-’10) ● Software Architect @ Peak Games (’11-’13) ● Co-founder and Solutions Architect @ Metasolid (’14-’15) ● Hands-on Solutions and Software Architect. ● Distributed Systems, Concurrency and Performance Programming enthusiast. ● Does tech biz, manages projects, deals with people. ● Used to be a perfectionist. Does not produce garbage.
  • 3. How to name your presentation
  • 4. Today’s Agenda ● Blocking vs Non-Blocking I/O ● NIO and Netty Abstractions ● What sets Netty apart ● Netty Reusables ● Netty & HTTP ● Servlet 3.0 and 3.1 (for our beloved JavaEE friends ) ● Netty Ecosystem Do not expect a 1-1 matched flow with these titles. I prefer discussions to static information dumping.
  • 5. Let’s review Blocking Socket I/O in Java by examples in order to steer our discussions on Non-Blocking I/O, Java NIO and Netty.
  • 6. Blocking I/O Socket Server Example Single Client, Single Request public static void serve1() throws IOException { ServerSocket serverSocket = new ServerSocket(10000); Socket clientSocket = serverSocket.accept(); InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream()); BufferedReader in = new BufferedReader(isr); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String request, response; if ((request = in.readLine()) != null) { response = request + " processed at " + new Date(); out.println(response); } in.close(); out.close(); } Protocol Implementation
  • 7. Blocking I/O Socket Server Example Single Client, Multi Request public static void serve2() throws IOException { ServerSocket serverSocket = new ServerSocket(10000); Socket clientSocket = serverSocket.accept(); InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream()); BufferedReader in = new BufferedReader(isr); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String request, response; while ((request = in.readLine()) != null) { response = request + " processed at " + new Date(); out.println(response); } in.close(); out.close(); } Wow! That was easy!
  • 8. Blocking I/O Socket Server Example Single Client, Multi Request, Client Exit Control public static void serve3() throws IOException { ServerSocket serverSocket = new ServerSocket(10000); Socket clientSocket = serverSocket.accept(); InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream()); BufferedReader in = new BufferedReader(isr); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String request, response; while ((request = in.readLine()) != null) { if ("Exit".equals(request)) { break; } response = request + " processed at " + new Date(); out.println(response); } in.close(); out.close(); } More Protocol
  • 9. Blocking I/O Socket Server Example Multi Client, Multi Request, Client Exit Control public static void serve4() throws IOException { ServerSocket serverSocket = new ServerSocket(10000); while (true) { Socket clientSocket = serverSocket.accept(); InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream()); BufferedReader in = new BufferedReader(isr); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String request, response; while ((request = in.readLine()) != null) { if ("Exit".equals(request)) { break; } response = request + " processed at " + new Date(); out.println(response); } in.close(); out.close(); } } A new generation ofInternet servicesupporting multipleusers?..
  • 10. Blocking I/O Socket Server Example Concurrent Clients, Multi Request, Client Exit Control public static void serve5() throws IOException { ServerSocket serverSocket = new ServerSocket(10000); while (true) { final Socket clientSocket = serverSocket.accept(); new Thread() { public void run() { try { InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream()); BufferedReader in = new BufferedReader(isr); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String request, response; while ((request = in.readLine()) != null) { if ("Exit".equals(request)) { break; } response = request + " processed at " + new Date(); out.println(response); } in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } } !!! These are far from being production code. In fact, they are terrible ones. Uncontrolled Power!
  • 11. Multi-Threaded Blocking I/O Exhausting Resources What to do? public static void serve5() throws IOException { ServerSocket serverSocket = new ServerSocket(10000); while (true) { final Socket clientSocket = serverSocket.accept(); new Thread() { public void run() { try { InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream()); BufferedReader in = new BufferedReader(isr); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String request, response; while ((request = in.readLine()) != null) { if ("Exit".equals(request)) { break; } response = request + " processed at " + new Date(); out.println(response); } in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } } !!! These are far from being production code. In fact, they are terrible ones. Uncontrolled Power! What to do? ● Pooling? ● Executors? ● Queuing?
  • 12. Multi-Threaded Blocking I/O Exhausting Resources What to do? - Critical Discussion public static void serve5() throws IOException { ServerSocket serverSocket = new ServerSocket(10000); while (true) { final Socket clientSocket = serverSocket.accept(); new Thread() { public void run() { try { InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream()); BufferedReader in = new BufferedReader(isr); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String request, response; while ((request = in.readLine()) != null) { if ("Exit".equals(request)) { break; } response = request + " processed at " + new Date(); out.println(response); } in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } } !!! These are far from being production code. In fact, they are terrible ones. Uncontrolled Power! What to do? ● Pooling? ● Executors? ● Queuing? The discussion here iscritical for switching(our minds) to Non-Blocking I/O, Java NIOand Netty
  • 14. Non-Blocking I/O ● Sockets in Non-Blocking Mode ● I/O Multiplexing ○ epoll (Linux) ○ kqueue (FreeBSD) ○ IOCP (Windows, Solaris) ● Single Thread for many sockets (or file descriptors) ● Key to high performance servers
  • 15. Non-Blocking or Asynchronous? (Blocking or Synchronous?) Simplified definitions that can work for us today: ● Non-Blocking: No waiting for the operation to complete ● Asynchronous: Notification upon completion of non-blocking operation
  • 16. Java NIO ● NIO = Non-Blocking I/O? ● It’s Java New I/O ● It’s no longer new (came with Java 1.4) ○ Java 7 comes with V2 ● Not only for Socket I/O ● First Class Citizens ○ Channels ○ Buffers ○ Selectors
  • 17. NIO - Channels and Buffers ● Channels ○ FileChannel ○ DatagramChannel ○ SocketChannel ○ ServerSocketChannel ● Buffers ○ ByteBuffer ○ CharBuffer ○ DoubleBuffer ○ FloatBuffer ○ IntBuffer ○ LongBuffer ○ ShortBuffer ● Data are read from Channels into Buffers ● Data are written from Buffers into Channels
  • 18. NIO - Buffers are serious business Buffer capacity, position and limit in write and read mode. Buffer.flip() makes the mode change. We also have: ● Heap Buffers ○ Array Based ○ ByteBuffer.allocate() ● Direct Buffers ○ Off-Heap ○ ByteBuffer.allocateDirect()
  • 19. NIO - Selectors & I/O Multiplexing
  • 21. From NIO to Netty Using NIO directly is like using Naked Threads. Netty replaces NIO APIs with superiors and provides incredible capabilities.
  • 22. Netty Core Components and Utilities ● Channels and Transports ● ByteBuf and Un/Pooled Allocation Management ● ChannelHandlers and ChannelPipeline ● The Codec Framework and Reusable Codecs ● Bootstraps and ChannelInitializers ● Futures and EventLoops
  • 23. Channels and Transports Package View ● io.netty.channel.embedded ● io.netty.channel.epoll ● io.netty.channel.local ● io.netty.channel.nio ● io.netty.channel.oio ● io.netty.channel.rxtx ● io.netty.channel.sctp ● io.netty.channel.sctp.nio ● io.netty.channel.sctp.oio ● io.netty.channel.socket ● io.netty.channel.socket.nio ● io.netty.channel.socket.oio ● io.netty.channel.udt ● io.netty.channel.udt.nio ● io.netty.channel.unix ● You can both read from write into Channels (they are duplex as opposed to streams) ● All I/O operations on channels are asynchronous and return listenable futures ● Channels are implemented for various Transports types: ○ Unified API for NIO and OID (and others) ○ Epoll transport for extreme performance ○ Local transport for in VM communication ○ Embedded transport for Unit Testing
  • 24. ByteBuf and Un/Pooled Allocation Management ● ByteBuf is improved version of ByteBuffer ● ByteBuf has both write and read index, does not need flip() ● CompositeByteBuf enables Zero-Copy ● ByteBufs can be pooled for reducing garbage collector pressure https://blog.twitter.com/2013/netty-4-at-twitter-reduced-gc-overhead
  • 25. ChannelHandlers and ChannelPipeline Channel Inbound Handler Channel Inbound Handler Channel Outbound Handler Channel Outbound Handler Head Tail Socket Channel Pipeline ChannelPipeline has been designed with Intercepting Filter pattern and resembles Servlet Filters
  • 26. Codec Framework ● Simplified and focused API on top of ChannelHandlers ● Decoders are ChannelInboundHandlers ● Encoders are ChannelOutboundHandlers ● Codecs are both CIH and COH
  • 27. Reusable Codecs ● io.netty.handler.codec.base64 ● io.netty.handler.codec.bytes ● io.netty.handler.codec.compression ● io.netty.handler.codec.haproxy ● io.netty.handler.codec.http ● io.netty.handler.codec.http.cookie ● io.netty.handler.codec.http.cors ● io.netty.handler.codec.http.multipart ● io.netty.handler.codec.http.websocketx ● io.netty.handler.codec.marshalling ● io.netty.handler.codec.protobuf ● io.netty.handler.codec.rtsp ● io.netty.handler.codec.sctp ● io.netty.handler.codec.serialization ● io.netty.handler.codec.socks ● io.netty.handler.codec.spdy ● io.netty.handler.codec.string ● io.netty.handler.logging ● io.netty.handler.ssl ● io.netty.handler.stream ● io.netty.handler.timeout ● io.netty.handler.traffic ● DelimiterBasedFrameDecoder ● LengthFieldBasedFrameDecoder ● FixedLengthFrameDecoder ● LineBasedFrameDecoder Some primitive ones All of these represent patterns of protocol development
  • 28. Bootstraps and ChannelInitializers Bootstraps help bootstrap channels (server or client side) ● Set EventLoopGroups ● Set ChannelHandlers ● Bind to Network Interfaces ChannelInitializer is a special ChannelHandler ● Handles channelRegistered event and applies its pipeline config to the channel ● (Suggested: See its source code)
  • 29. Futures and EventLoops ● All I/O operations on Channels return listenable futures ● Each Channel is assigned to a single EventLoop and stays so during its lifetime ● EventLoops handle all I/O operations of their Channels ● EventLoopGroups are like Thread Pools and number of EventLoops they manage depends on number of CPU cores (and possible other factors) ● Listeners registered to Futures are handled by appropriate EventLoop selected by Netty
  • 31. Servlet ● Servlet 3.0 - Async Processing of Response ● Servlet 3.1 - Non-Blocking Processing of Request (Content) Did you expect more? Come on, this is Netty :-)
  • 32. Netty Versions ● 3.x Old, Stable ● 4.0.x Current, Stable ○ Huge improvements over 3.x ○ https://github.com/netty/netty/wiki/New-and-noteworthy-in-4.0 ● 4.1 Beta (Close to be Stable) ○ Mostly backward compatible with 4.0 ○ Android support and lots of new codecs ○ https://github.com/netty/netty/wiki/New-and-noteworthy-in-4.1 ● 5.0 Alpha - Backward Incompatible Improvements ○ https://github.com/netty/netty/wiki/New-and-noteworthy-in-5.0
  • 33. Ecosystem - Related Projects (The ones I’ve been interested in and mostly using Netty at its heart) ● Vert.x - A toolkit for building reactive applications on the JVM ● Ratpack - Simple, lean & powerful HTTP apps ● async-http-client - Asynchronous Http and WebSocket Client library for Java ● RxNetty - Reactive Extension (Rx) Adaptor for Netty ● nettosphere - A Java WebSocket/HTTP server based on the Atmosphere and Netty Framework ● grpc-java - The Java gRPC implementation (by Google) ● Play Framework - The High Velocity Web Framework For Java and Scala ● More at http://netty.io/wiki/related-projects.html and http://netty. io/wiki/adopters.html
  • 34. Ecosystem - Resources ● Netty Documentation & Examples ○ http://netty.io/wiki/index.html ● StackOverflow ○ http://stackoverflow.com/questions/tagged/netty ● Netty in Action ○ http://www.manning.com/maurer/
  • 35. Thanks ● You, attenders! ● Ankara JUG organizers, for having me here ● Jakob Jenkov, for allowing me use his diagrams for explaining NIO Concepts (http://tutorials.jenkov. com/java-nio/index.html)