2009-10-08 7 views
1

Hey j'écris une application dans Twisted, et pour l'instant j'ai 4 serveurs liés deux ports différents tous communiquer avec le client via JSON. Est-il de toute façon lié ces 4 serveurs au même port et les interactions restent les mêmes?Manière standard d'utiliser un seul port pour plusieurs sockets?

Par exemple, disons que le client s'abonne à deux flux différents, transmis via une socket directe.

En ce moment, je fais comme

server1.read_string() 
server2.read_string() 

et il lit la chaîne JSON correcte des flux respectifs. Y at-il de toute façon à maintenir ce type de fonctionnalité, mais contactez mon serveur sur le même port?

Je ne veux pas jeter toutes les fonctionnalités du serveur dans un serveur massif et partitionner les données par des préfixes d'en-tête.

Je ne veux pas faire quelque chose comme

s = server.read_string() 
header = s.split(//some delimiter)[0] 
if (header == "SERVER1") 
{ 
    // Blahh 
} 

Répondre

3

Il semble que de nombreux clients interagissent avec vos serveurs via HTTP. La solution standard consiste à lancer un proxy inverse entre le client et vos serveurs. Ce proxy transmet ensuite les connexions au serveur approprié en fonction de l'URL. Le proxy inverse peut s'exécuter sur l'un de vos serveurs existants ou sur son propre serveur pour alléger la charge.

Si vos données peuvent être mises en cache, le proxy inverse peut également effectuer une mise en cache sur vos résultats.

Il existe de nombreux proxys inverses disponibles et vous souhaiterez en choisir un en fonction du type de charge de travail dont vous disposez. Avez-vous besoin d'être hautement configurable? Les données sont-elles publiques ou basées sur des connexions? Combien de temps chaque connexion dure-t-elle/combien de connexions voulez-vous garder ouvertes en même temps?

Squid, Varnish, HAProxy sont de bons proxys inverses et même Apache pourrait le faire pour vous.

Je prévois d'utiliser HAProxy pour Gridspy, my project car j'ai de nombreuses connexions en cours avec mes clients et je veux placer un serveur orbite dans le même chemin URL que mon serveur django. Voir This tutorial pour plus d'informations sur la façon de transférer de nombreuses connexions sur le port 80 d'un serveur à plusieurs. Ce tutoriel est axé sur Comet, mais votre problème est encore plus simple que cela.

Si vous envisagez une connexion tcp/ip en cours depuis le navigateur vers vos serveurs, pensez sérieusement à Orbited. Voir ce tutoriel sur graphs via orbited and morbidQ. Orbited va également mieux percer les pare-feu et les proxys que la plupart des solutions personnalisées, car cela ressemble à du trafic HTTP normal.

1

Afin d'avoir plusieurs serveurs en cours d'exécution sur la même machine tous liés au même port, ils ont besoin d'être lié à des adresses IP différentes. La seule façon de lier le même port sur la même adresse IP est d'activer l'option SO_REUSESOCKET du socket, mais alors plusieurs serveurs pourraient recevoir les données entrantes de l'autre, ce qui gâcherait vraiment vos communications.

Sinon, il est préférable d'avoir un seul serveur qui utilise des en-têtes pour identifier les flux particuliers. Pourquoi ne veux-tu pas faire ça?

+0

J'aurais aussi besoin des en-têtes côté client oui? Y at-il un meilleur moyen de transmettre des données d'en-tête que directement dans le corps du message comme je l'ai montré ci-dessus? – DevDevDev

+0

L'en-tête doit être dans les données du message lui-même. Lorsqu'un message est reçu à chaque extrémité, le destinataire peut identifier le flux auquel le message se rapporte. –