2010-10-19 4 views
2

Nous avons une application avec un schéma d'interrogation long sur HTTP (bien que cette question puisse s'appliquer à tout protocole TCP). Notre délai d'attente est assez élevé, 30 minutes environ. Ce que nous voyons parfois, c'est que les appareils mobiles sautent assez souvent d'IP à IP, à chaque minute, ce qui provoque l'accumulation de douzaines de sockets à vie longue sur le serveur. Je ne peux pas m'empêcher de penser que cela cause plus de charge que nécessaire.Connexions TCP persistantes, longs délais d'attente et appareils mobiles IP hopping

Donc, je suppose que certaines passerelles IP sont meilleures que d'autres lors de la fermeture des connexions lorsqu'un périphérique saute. Les stratégies que je peux penser à faire face à ce sujet sont:

  • Diminution du délai d'attente (l'augmentation de la vie de la batterie sur l'appareil)
  • Fermez la dernière connexion active lorsqu'un reconnexions utilisateur (nécessite cookies ou de suivi de l'ID utilisateur)

D'autres?

Répondre

0

Je voudrais fermer la dernière connexion active en utilisant un cookie ou une sorte d'ID dans votre serveur. Oui, c'est plus de travail, mais dès que l'utilisateur saute des adresses, vous pouvez trouver l'ancienne socket et nettoyer les ressources directement. Il devrait être assez facile de lier un nom d'utilisateur ou quelque chose comme ça. L'autre problème que vous pouvez rencontrer, même si l'équipement de l'utilisateur ne saute pas d'adresses, certains réseaux mobiles et peut-être votre propre réseau peut avoir un pare-feu statefull qui nettoiera les sockets inutilisés, ce qui causera des problèmes de connectivité une nouvelle connexion nécessitera à nouveau le syn/syn-ack. Juste quelque chose à garder à l'esprit si vous remarquez des problèmes de connectivité. Si vous décidez de jouer avec keep alives, s'il vous plaît ne soyez pas trop agressif, les applications bavardes sont le fléau des réseaux mobiles, et ceux qui martèlent le réseau quand il perd la connexion au serveur peuvent causer toutes sortes de problèmes pour le réseau (et vous si le transporteur attrape). Atleast a une sorte de mécanisme de backoffing pour réessayer la connectivité, et peut-être même essayer de découvrir pourquoi le périphérique change d'adresse IP chaque minute. Si cela fonctionne correctement, cela ne devrait pas se produire.

*** Je travaille pour un opérateur de téléphonie mobile au Canada, mais mes commentaires ne reflètent pas la position de mon employeur.

+0

Je suis un peu inquiet au sujet de keepalives puisque toute activité de données réveille la radio - c'est pourquoi je l'ai réglé à 30 minutes. Vous ne savez pas quoi faire à propos des délais d'attente de pare-feu non plus, ne le remarquerez pas sur le serveur aussi facilement :( – sehugg

+0

@sehugg Sur le réseau où vous êtes, l'appareil obtient-il une adresse IP publique? Si oui, une méthode que j'ai vu avec succès, lorsque l'appareil reçoit une adresse IP, il s'enregistre auprès du serveur, puis il écoute uniquement les connexions entrantes, et le serveur se connecte à l'appareil lorsque quelqu'un a quelque chose pour cela. L'autre moyen consiste à envoyer un SMS à l'appareil, et votre appareil intercepte le SMS pour réveiller l'application afin de faire quelque chose –

+0

Je n'ai pas eu de chance avec la connexion à l'appareil - essayé ceci une fois avec UDP.Maintenant, je comprends la valeur des services comme Apple APNS et C2DM de Google :) – sehugg

0

Si vous le pouvez, activez TCP keepalive sur les sockets et attribuez-leur une minuterie assez faible (toutes les 1-5 minutes, par exemple). Tant que vous lisez depuis le socket, vous détectez plus rapidement un pair inaccessible - et avec moins d'utilisation des ressources sur le téléphone que de réduire votre délai d'attente de 30 minutes.

+0

Le KeepAlive ne réduira-t-il pas la consommation de la batterie sur l'appareil comme si nous envoyions des données via le socket? – sehugg

+0

Oui, mais pas autant que la manipulation dans l'application. – nos

Questions connexes