Java Non-Bloquant et Asynchrone IO avec NIO & NIO.2 (JSR203) - Réacteur/Proactor Implémentations
Donc ici, je suis en train de lire un de mes logiciels préférés des recueils de motifs (Pattern-Oriented Architecture - Modèles pour Simultanées et en Réseau les Objets), en particulier les sections sur Proactor/Réacteur asynchrone IO modèles. Je peux voir comment à l'aide de canaux sélectionnables je peux mettre en œuvre un Réacteur de style asynchrone IO mécanisme assez facile (et ont fait). Mais, je ne vois pas comment je pourrais mettre en œuvre une bonne Proactor mécanisme de blocage non écrit. Profitant d'OS géré non-blocage des fonctions d'écriture.
Fonctionnalités prises en charge par OS appels spécifiques comme GetQueuedCompletionStatus sous win32.
Je ne vois que Java 7 apporte quelques mises à jour de NIO avec asynchrone achèvement des gestionnaires (qui semble être dans la bonne direction). Cela étant dit... étant Donné le manque d'unifiée de la croix-plate-forme de soutien pour les OS géré des opérations asynchrones (plus précisément async écrire) je suis en supposant que c'est un quassy-mise en œuvre, qui est de ne pas utiliser de système d'exploitation natif de soutien.
Donc mes questions sont, est proactor en fonction IO manipulation possible en Java de telle manière qu'il est avantageux de les utiliser pour des scénarios spécifiques; et, si Java NIO prend en charge proactor en fonction IO manipulation (que ce soit dans la version 6 de Java ou Java 7) est OS géré asynchrone IO soutien (c'est à dire l'achèvement des rappels à partir de l'OS) - il utilisé? En outre, si la mise en œuvre est purement dans-VM sont les avantages de performance de si peu que l'utilisation proactive de la gestion des événements n'offre rien de plus qu'un autre (éventuellement plus simple) de la construction de réseau simultanées logiciel de traitement.
Pour quiconque s'intéresse activement à la gestion des événements voici un bon article qui décrit les avantages /inconvénients et une comparaison à la fois traditionnelle de thread par connexion et réactif IO modèles.
- Si vous voulez vraiment savoir ce que la mise en œuvre ressemble, alors vous pouvez télécharger le code source du JDK 7 et regardez vous-même: openjdk.java.net/projects/jdk7
- Bon point Jesper. Je vais faire l'effort de le faire bientôt!
Vous devez vous connecter pour publier un commentaire.
Il ya beaucoup de facteurs impliqués dans celui-ci. Je vais essayer de résumer mes conclusions du mieux que possible (au courant du fait qu'il y a désaccord concernant l'utilité de réacteur et proactor IO implémentations de gestion).
Java 1.4 introduit non-bloquant IO qui n'est PAS le même que asynchrone IO. Java SE 7 introduit asynchrone IO avec JSR203 faire de "vrai" proactor style IO gestion des mises en œuvre possibles.
Voir AsyncrhonousSocketChannel, AsynchronousServerSocketChannel
Lecture par le biais de la JSR 203 spécifications, l'achèvement des gestionnaires en utilisant de nouveaux canaux asynchrones sont certainement pris en charge et il est rapporté que natif des fonctionnalités du système d'exploitation sont utilisés, mais je n'ai pas vérifié dans quelle mesure encore. J'ai peut-suivi sur ce, après une analyse de Java 7 source (à moins que quelqu'un me bat pour elle).
Je n'ai pas été en mesure de trouver des comparaisons de performances concernant les nouvelles Asynchrone IO fonctionnalités de Java 7. Je suis sûr qu'ils seront disponibles dans un avenir proche.
Comme toujours, lorsqu'ils sont présentés avec plus d'une façon de s'attaquer à un problème, les questions de l'approche qui est mieux, c'est presque toujours répondu avec "dépend". Proactive de la gestion des événements (asynchrone à l'aide de l'achèvement des gestionnaires) est inclus avec Java 7 et ne peut simplement pas exister sans but. Pour certaines applications, il est logique d'utiliser de tels IO de la manipulation. Historiquement, un bon exemple étant donné où proactor a bonne applicabilité est un serveur HTTP, où de nombreux court demandes sont effectuées fréquemment. Pour une explication plus approfondie donner à cette lecture (uniquement pour mettre en évidence les avantages de proactor donc, essayez d'ignorer le fait que l'exemple de code est en C++).
De l'OMI, il semble évident que, dans de nombreuses circonstances réacteur/proactor compliquer ce qui serait autrement un design très simple à l'aide d'une approche plus traditionnelle et dans d'autres systèmes plus complexes qu'ils offrent un haut degré de simplification et de souplesse.
.
.
.
Sur une note de côté, je recommande fortement la lecture par le biais de la présentation qui suit à propos de NIO qui offre une comparaison des performances entre NIO et le "traditionnel" de la démarche. Mais je voudrais aussi la prudence est de mise concernant les résultats présentés le NIO mise en œuvre dans l'indice de référence a été sur la base du pré Java 1.4 NBIO NIO bibliothèque et non le NIO mise en œuvre expédiés en 1.4.
Je voudrais vérifier que vous vraiment besoin de s'inquiéter à propos du blocage de l'écrit.
Un lire des blocs où il n'existe pas de données à lire. Cela peut être la plupart du temps. Cependant, une écriture de blocs lorsque les tampons sont pleins, ce qui arrive très rarement et souvent indiciates une connexion lente ou de l'échec d'un consommateur.
Si vous voulez non-bloquant IO, de le faire pour le lit, et à cet effet, pour l'écrit ainsi.
Remarque: l'Utilisation de blocage IO avec NIO est généralement plus simple et peut effectuer sans blocage NIO, sauf si vous avez 1000s de connexions, vous êtes susceptible de trouver de la complexité ajoutée n'est pas la peine. (Et est peut-être pas la meilleure option)
Avec le respect que le livre est très en dehors de la date et de pertinence douteuse à n'importe quelle date. Il est venu de sortir du modèle de conception de la frénésie de la fin des années 1990, quand il y a un effort concerté afin de réduire l'ensemble de l'informatique pour les modèles de conception.
Mon point de vue est que NIO est déjà un cadre et un modèle de conception.
NIO déjà fournit une implémentation du modèle réactif (sélecteurs), et NIO2 ajoute une mise en œuvre de la dynamique motif (achèvement des gestionnaires).
Ne cherche pas à réinventer, il suffit de l'utiliser, parce que vous ne pouvez pas battre ses performances - qui est ce que quelqu'un essayant d'éviter le blocage de i/o est après, après tout -, avec une pure Java solution, que vous n'avez pas accès à la non-bloquant /fonctionnalités asynchrones de l'OS sous-jacent. Mais NIO et NIO2 faire usage de ceux-ci, ce qui les rend rapide.
Excellent general health; excellent fitness; non-smoker.
Si je n'avais pas vivre un couple de miles au nord de l'Asie, j'aimerais avoir une bière.