2017-02-10 2 views
0

RMI est une API de programmation réseau Java qui utilise le JRMP protocol. Si nous analysons les paquets avec Wireshark, cela montre que le protocole JRMP nécessite au moins 2 échanges de requêtes avant d'établir une communication entre un client et un serveur. Plus de détails: Le premier échange de requête est l'étape de négociation, le deuxième échange de requête est l'étape lookup(), puis les autres échanges de requêtes sont les appels de procédure distante (lorsque nous utilisons des méthodes de notre classe Remote). Le premier appel de procédure distante contient les noms d'attributs de la classe sérialisée, si la même méthode est appelée une seconde fois, il y aura quelques optimisations (un identifiant integer sera utilisé pour chaque nom d'attribut au lieu de String). Moins de détails: JRMP est complexe, car il nécessite plusieurs échanges de demandes client/serveur. Un protocole comme HTTP n'en nécessite qu'un. Considérons que nous travaillons sur le cloud, nous avons plusieurs nœuds avec des serveurs RMI, nous avons également un équilibreur de charge circulaire entre les clients RMI et notre cloud. Le client RMI envoie une requête de négociation et le premier nœud la reçoit, puis l'équilibreur de charge envoie la requête lookup() au deuxième nœud ... Est-il possible d'utiliser RMI dans un environnement distribué?Est-il possible d'utiliser RMI avec un équilibreur de charge circulaire dans un environnement distribué?

+2

Théoriquement, mais y a-t-il une bonne raison dans une telle situation de ne pas utiliser une interface HTTP ou de messagerie? – chrylis

+0

Salut, oui, il y a une bonne raison: Si nous voulons utiliser une implémentation SOA (Synchronous Service Oriented Architecture) basée sur un protocole binaire (et non un protocole en texte brut comme HTTP qui coûte plus de CPU pour des données complexes). – Gugelhupf

+0

Le temps CPU pour la sérialisation/désérialisation est trivialement bon marché ces jours-ci. La facilité du débogage seul vaut les frais généraux. – chrylis

Répondre

1

Le premier échange de demande est l'étape de négociation, le deuxième échange de demande est la lookup() étape

Corriger, mais cela ne doit se produire une fois dans la vie de l'application cliente, pas pour chaque distance appel de méthode.

client RMI envoie une demande de négociation et le premier noeud reçoit, l'équilibrage de charge envoyer la demande lookup() au second noeud ...

Pas possible. Les deux demandes voyagent sur la même connexion TCP, ergo vers le même hôte cible. Ensuite, les échanges de demandes sont les appels de procédure distante (lorsque nous utilisons des méthodes de notre classe qui s'étendent à Remote).

Pas nécessairement. Les demandes à l'objet cible pourraient passer par une connexion différente, ergo ils pourraient inclure une autre étape de négociation. Ils peuvent également accéder à un hôte différent du premier hôte cible, qu'il existe ou non un équilibreur de charge.

Est-il possible d'utiliser RMI dans un environnement distribué? Vous devez avoir votre Registre et tous les objets distants répliqués sur tous les hôtes à charge équilibrée, et si les objets distants ont des interdépendances de session, vous pourriez être dans une grande place.

Vous pourriez être mieux d'utiliser RMI/IIOP et un ORB d'équilibrage de charge.