Question

Je l'ai vu la question: communication entre deux applications de bureau Java séparées (réponse: JGroups) et je pense à la mise en œuvre quelque chose avec JavaGroups ou RMI droite, mais la vitesse est de l'essence. Je ne suis pas l'envoi de grandes quantités de données autour (contenu des messages MIDI, donc 3 octets chacun, pas plus que de dire deux messages tous les trois millisecondes) et ce sera tout sur la même machine. Est-il daft de penser que RMI / JGroups sur la même machine physique sera lente?

(Ma pensée est que je ne peux pas se permettre plus de 1ms de temps d'attente, puisque je l'ai déjà eu quelques-uns, mais je ne suis pas sûr de savoir comment mieux parler de la vitesse dans ce contexte.)

Je suppose que ma vraie question est: sont là des options pour la communication InterApp en Java qui passent par quelque chose plus rapide que TCP / IP Je veux dire des choses déjà mises en œuvre en Java, les possibilités ne JNI que je » d besoin de mettre en œuvre:)

Je sais, ne permet pas d'optimiser au début et tout cela, mais aussi mieux prévenir que guérir.

Était-ce utile?

La solution

  

sont là des options pour la communication InterApp en Java qui passent par quelque chose plus rapide que TCP / IP?

Pas beaucoup ... Autant que je sache.

Mais je pense que vous pensez à ce de la mauvaise façon. En supposant que vous déplacez des petits messages, le tueur de performance principal sera les frais généraux de faire un appel plutôt que la vitesse à laquelle les octets sont déplacés. Ces frais généraux comprennent des éléments tels que le temps nécessaire pour faire des appels système, pour passer des contextes de processus sur le côté client et serveur, pour traiter les en-têtes de paquets de messages dans le noyau et pour acheminer les paquets. Et toute interaction synchrone RPC comme consiste à faire un appel d'attente de la réponse; à savoir l'application -> serveur -> temps aller-retour.

La façon d'obtenir un plus grand débit est de se concentrer sur les points suivants:

  • réduire le nombre de RPCs requis par l'application; par exemple. en les combinant à être plus gros grains et

  • cherche des moyens pour transformer les interactions synchrones dans les interactions asynchrones; par exemple. en utilisant les messages en fonction plutôt que des technologies basées RPC.

Autres conseils

Si la vitesse est de l'essence, vous devriez faire l'appel dans le même fil. Vous ne serez pas aussi vite que cela en utilisant un réseau.

Cependant, la vitesse est pas tout à fait l'hypothèse que importante que vous pouvez effectuer Java appels RMI à environ 500 micro-secondes et en utilisant RPC un code personnalisé que vous pouvez faire des appels sur rebouclage à environ 24 micro-secondes. Même faire passer des données entre les filets dans la même machine virtuelle Java peut prendre 8 micro-secondes.

Vous devez décider combien de temps vous êtes prêt à laisser passer un appel réseau. Vous devez également décider si le temps de lancer l'appel est critique ou le temps de retourner un résultat. (Souvent, ce dernier a le double de la tête)

Note: Je parle de micro-secondes ici, pas milli-secondes. J'ignore toutes les options qui prennent plusieurs millisecondes pour vos besoins.

Cette de référence est d'environ deux ans vieux, mais il montre que la seule solution populaire Java Remoting plus rapide que RMI est 2 hessois (qui est toujours en beta je crois).

Toutefois, si vos messages ne sont en octets à un seul chiffre, en utilisant une solution d'accès distant semble exagéré, surtout si les processus sont sur la même machine. Je vous recommande de les regrouper en un seul processus, si possible. Vous pouvez aussi envisager de simplement utiliser ancienne plaine Java sockets .

  

Est-il débile de penser que RMI / JGroups sur la même machine physique sera lente?

Si votre machine est correcte probablement oui :) Si vous utilisez sur une machine avec des tonnes de processus alimentaires etc CPU alors les choses pourraient être différentes. Comme toujours la meilleure façon de savoir si vous ressentez la même chose que moi est de le tester.

Ce qui suit est le temps en millisecondes prises à l'aide NanoTime dans la même machine virtuelle Java pour envoyer la chaîne « 123 » en utilisant rmi et sur le serveur concat avec « abc » pour obtenir "123ABC" et le retourner.

JVM froide: environ 0,25 milliseconde de latence

0.250344
0.262695
0.241540
0.282461
0.301057
0.307938
0.282102

JVM chaud. Environ latence 0,07 milliseconde

0.87916
0.72474
0.73399
0.64692
0.62488
0.59958
0.59814
0.66389

Vous seriez donc bien dans 1 milliseconde si le serveur RMI et le client est en cours d'exécution au niveau local.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top