La vidéo de cette conférence est visible ici : http://youtu.be/T7r7UlSoe7k
La croissance continue du Web a accru la nécessité pour les applications Client/serveur de gérer la monté en charge et la performance. Heureusement, Java est livré avec les outils nécessaires pour créer des applications performantes, et scalables ! Les premières versions de Java incluent le support des communications réseau avec la jdk 1.4 qui a introduit l'API NIO. La nouvelle version, NIO 2, introduite dans Java 7, a été conçue pour permettre l'écriture asynchrone en réseau, Aujourd'hui, encore peu de gens s'intéressent au développement d'applications réseaux, car l'API Jdk reste complexe.
Netty est une bibliothèque Java pour l'écriture d'applications et de services réseau hautement concurrent et scalable. Netty est une API complétement asynchrone : l'Api vous propose une nouvelle façon de développer vos applications réseau en assurant un découplage entre votre logique métier et les traitements réseau grâce à son modèle basé sur une architecture "event-driven".
Dans cette conférence, vous comprendrez l'architecture de Netty, et comment des entreprises comme Twitter, Facebook, RedHat et autres l'utilisent pour répondre à leurs problématiques de communication réseau.
- le niveau : développeurs Java débutants et expérimentés
- la durée : 2h
8. Un peu d’histoire
- Blocking IO depuis la première version Java
- Arrivé de Nio à partir de jdk 1.4
- Nio 2 depuis jdk 1.7
2014-09-10 Nio In Action Avec Netty 8
9. Blocking IO
- Un Thread par connexion
- Appel bloquant
- Api bas niveau
( nb de thread Max)
()
(complexité)
2014-09-10 Nio In Action Avec Netty 9
10. Blocking IO
ServerSocket socket = new ServerSocket(port);
while (true) {
final Socket clientSocket = socket.accept();
new Thread(new Runnable() {
public void run() {
// TODO
}
}).start();
}
2014-09-10 Nio In Action Avec Netty 10
11. New (Non Blocking) IO
- Utilisation « Propre » des resources.
- Un Thread exécute une ou plusieurs Tâches
- Les événements IO sont gérés par le « selector »
2014-09-10 Nio In Action Avec Netty 11
12. New (Non Blocking) IO
Channel
• Similaire au Stream
• Lecture & écriture dans le même Channel (Possible en
Asynchrone)
• Lecture | écriture depuis | dans un Buffer
2014-09-10 Nio In Action Avec Netty 12
22. New (Non Blocking) IO
Selector
• Gère le changement d’état d’une ou plusieurs Connexions (Channel)
• Un Selector Un Thread
• Un Channel S’enregistre dans un Selector (avec un « interest set »)
• OP_READ , OP_WRITE, OP_ACCEPT, OP_CONNECT
channel.register(selector, OP_WRITE | OP_READ);
2014-09-10 Nio In Action Avec Netty 22
23. Modèle NiO
Thread
Selector
Channel Channel Channel
Buffer
2014-09-10 Nio In Action Avec Netty 23
24. Exemple
ServerSocketChannel serverChannel = ServerSocketChannel.open();
ServerSocket ss = serverChannel.socket();
ss.bind(new InetSocketAddress(port));
selector = Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set readyKeys = selector.selectedKeys();
Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
}
}
25. Nouveautés Nio
Zero Copy
• Lecture Contenu Statique, puis écriture dans la socket
while(inputStream.read(bytes) > 0) {
socket.getOutputStream().write(bytes);
}
2014-09-10 Nio In Action Avec Netty 25
26. Nouveautés Nio
Avant NIO
Application
Lecture
Copie
Copie
File Copie
Read buffer Socket Buffer
Context
D’application
Context
Du Kernel
Network
2014-09-10 Nio In Action Avec Netty 26
27. Zero Copy
Application
Copie
transferTo(position, count, target)
File Read buffer
Context
D’application
Context
Du Kernel
Socket buffer
Network
Copie
2014-09-10 Nio In Action Avec Netty 27
28. Nouveautés Nio
Direct Buffer
• Implémentation ByteBuffer
• Mémoire allouée hors Heap Java (Hors mémoire JVM)
ByteBuffer buffer = ByteBuffer.allocateDirect(capacity);
• Pas de GC (plutôt sun.misc.Cleaner)
2014-09-10 Nio In Action Avec Netty 28
30. Nio … Pas si simple
o Nio est une Api Complexe
o Single Threaded (Selector)
o L’implémentation du select() dépend du SE
o le « Epoll() bug »
o Complexité d’utilisation du Buffer
2014-09-10 Nio In Action Avec Netty 30
31. Netty … à la rescousse
2014-09-10 Nio In Action Avec Netty 31
32. Netty
⦿ Crée par Trustin Lee (RedHat, Twitter à partir de 2011)
⦿ Twitter & RedHat sont les grands contr
⦿ Netty se base sur un Model Asynchrone & EventDriven
2014-09-10 Nio In Action Avec Netty 32
33. Asynchrone … Kesako
⦿ Les opérations I / O ne sont pas bloquantes
⦿ Notification à la fin de l’opération (Callback, Future)
⦿ ChannelFutureListener
⦿ isSuccess() & isError()
⦿add(ChannelFutureListener listener)
2014-09-10 Nio In Action Avec Netty 33
34. Asynchrone …Netty
Channel channel = ...;
ChannelFuture future = channel.connect(new InetSocketAddress(“192.168.0.1“, 25);
future.addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()) {
// TODO
} else {
Throwable cause = future.cause();
cause.printStacktrace();
}
}
});
2014-09-10 Nio In Action Avec Netty 34
35. Netty … Event Driven
⦿ Netty utilise des événements pour informer l'utilisateur sur des changements
d’état.
⦿ Connexion active
⦿ déconnexion
⦿ Écriture & lécture
⦿ Distinction entre les événements entrants et sortants
2014-09-10 Nio In Action Avec Netty 35
36. Transports
OIO
NIO
&( SAOsy_nTcIhMroEOneU?T W) TF
Embedded
Local
Et plus à l’avenir ....
2014-09-10 Nio In Action Avec Netty 36
37. Protocol
TCP
UDP
SCTP
UDT
2014-09-10 Nio In Action Avec Netty 37
38. Buffer
⦿ Index lecture & index écriture
⦿ Composite Buffer
⦿ Pooling …!
⦿ Reference Counting
2014-09-10 Nio In Action Avec Netty 38
39. Buffer
⦿ Index lecture & index écriture
⦿ readerIndex & writerIndex
Discardable Bytes Readable Bytes Writable Bytes
0 <= readerIndex <= writerIndex <= capacity
⦿ Un Buffer Netty est extensible
⦿ Initialapacity & MaxCapacity
2014-09-10 Nio In Action Avec Netty 39
40. Buffer
ByteBuf buffer = ...;
while (buffer.readable()) {
System.out.println(buffer.readByte());
}
Buffer.discardReadBytes();
ByteBuf buffer = ...;
while (buffer.writableBytes() >= 4) {
buffer.writeInt(random.nextInt());
}
2014-09-10 Nio In Action Avec Netty 40
41. Buffer
Allocation
⦿ ByteBufAllocator
⦿ Pooled & Unpooled
⦿ buffer(int)
⦿ buffer(int, int)
⦿ directBuffer()
⦿ directBuffer(int)
⦿ directBuffer(int, int)
2014-09-10 Nio In Action Avec Netty
41
42. Buffer
Pooled Buffer
⦿ Depuis Netty 4
⦿ Moins d’opérations GC à cause d’allocation | désallocation des Buffers
⦿ Utilisation du « jemalloc »
⦿ Meilleur performance dans un environnement « multithreading »
2014-09-10 Nio In Action Avec Netty
42
43. Buffer
Reference Counting
⦿ ByteBuf implémente « ReferenceCounted »
⦿ Améliore la gestion d’allocation | désallocation pour le Buffer
ByteBuf buf = ctx.alloc().directBuffer();
assert buf.refCnt() == 1;
2014-09-10 Nio In Action Avec Netty
43
44. Buffer
Benchmark (netty 3 vs netty 4 avec PooledBuffer)
⦿ EchoServer
⦿ 16000 connexions concurrentes
⦿ Messages 256 bytes en boucle
2014-09-10 Nio In Action Avec Netty 44
46. Channel Handler
⦿ Les opérations IO sont gérés par le ChannelHandler
⦿ Découplage du Process Métier
⦿ Type-Safe
⦿ Inbound Handler
⦿ Données reçues
⦿ Outbound Handler
⦿ Données à envoyer
2014-09-10 Nio In Action Avec Netty 46
56. Codec
⦿ Encodage & décodage dans le même class
⦿ Methodes de l’Encoder & du Decoder
⦿ Decode(), decodeLast(), encode()
⦿ ByteToMessageCodec, MessageToMessageCodec,
CombinedChannelDuplexHandler
2014-09-10 Nio In Action Avec Netty 56
57. Decoder
@Override
public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)
throws Exception {
if (in.readableBytes() < 2) {
return;
}
ByteBuf buf = ctx.alloc().buffer();
while (in.readableBytes() >= 2) {
char c = in.readChar();
buf.writeChar(Character.toLowerCase(c));
}
out.add(buf);
}
2014-09-10 Nio In Action Avec Netty 57
58. Implémentations
ChannelHandler & Codec
HTTP
WebSockets
Serialization
JbossMarshaling
Protobuf
SSL
2014-09-10 Nio In Action Avec Netty 58
59. UTest
⦿ Possibilité de tester U les channelHandler avec le type de transport
« embedded »
⦿ EmbeddedChannel
⦿ Écrire des données entrantes ou sortantes
⦿ Vérifier le bon fonctionnement (Encodage / Decodage)
⦿ writeInbound
⦿ readInbound
⦿ writeOutbound
⦿ readOutbound
2014-09-10 Nio In Action Avec Netty 59
60. Netty … Bootstrap
⦿ configuration des appli Client /serveur Netty
⦿ ServerBootstrap Server
⦿ Bootstrap Client
2014-09-10 Nio In Action Avec Netty 60
62. Conclusion
⦿ Objectifs
⦿ Fonctionnement de base Netty
⦿ Avec Netty, le developpement des applications réseau est beacoup plus simple
⦿ Netty … À l’avenir
⦿ Support Java 8
⦿ Support Andoird
⦿ Plus de codecs & ChannelHandler
⦿ Contribuez … !
2014-09-10 Nio In Action Avec Netty 62