6
votes

PHP traitant de la concurrence

Je suis une application PHP de niveau d'entreprise. C'est un jeu de navigateur avec des milliers d'utilisateurs en ligne sur une infrastructure que mon patron refuse de mettre à niveau et que les machines fonctionnent sur 2-3 Charge système (Yep Linux) à tout moment. Quoi qu'il en soit, ce n'est pas le vrai problème. Le problème réel est que certains utilisateurs attendent que le serveur soit chargé (heure prime) et apportent leurs clickers de souris et cliquent sur le même bouton Soumettre comme 10 à 20 fois, envoyant 10-20 demandes en même temps pendant que le serveur est toujours. Produire la demande initiale, donc pas mis à jour le cache et la base de données.

Actuellement, j'ai une variable de sortie sur chaque demande, qui est valide pendant 2 minutes et j'ai une serrure "mutex" qui est fondamentalement un drapeau à l'intérieur de Memcache qui, si trouvé bloque davantage l'exécution du script, mais le clicker de la souris fait si De nombreuses demandes en même temps qu'ils courent presque simultanément, ce qui est un gros problème pour moi.

Comment allez-vous, la majorité des gens de Stackoverflow traitant de ce problème. Je pensais à signaler le cookie / session mais je pense que je vais entrer dans le même problème si le serveur est surchargé. L'optimisation est impossible, la source a 7 ans et est tout à fait optimisée, sans interfaces sur la plupart des pages (désactivation du cache) et ne posant que la base de données sur certaines saisies de l'utilisateur, comme celle que j'essaie de prévenir.

Oui, c'est le code de procédure sans objets réels. Les machines fonctionnent PHP 5 mais le code lui-même est plus d'une PHP 4. Je sais que c'est que c'est de vieilles et de choses, mais nous ne pouvons pas épargner la ressource de réécriture de ce gâchis, car la plupart des développeurs originaux ont laissé comment des produits sont entrecoupés Et oui, je corrige fondamentalement des trous anciens. Mais autant que je sache, c'est une question générale sur les sites Web de PHP chargés.

P.s: désactiver le bouton avec JavaScript sur Soumettre n'est pas une option. Les vrais tricheurs sont des utilisateurs avancés. L'un d'entre eux avait écrit un bot clicker et l'a emballé comme une extension Google Chrome. Ne demandez pas comment j'ai traité cela.


10 commentaires

Comment avez-vous réglé ça..? :)


J'utilise des webockets. Le modèle de processus par demande est un ajustement très pauvre pour ce genre de chose.


Oui, la candidature est ancienne et elle n'a pas ce but d'historique de sites Web MVC / Bigpipe / Json / HTML5 que les sites Web modernes utilisent. Il a beaucoup trop de "hotfixes" pour simplement mettre cette interface sur


Petite Capchacha (SP?) En cas de clic, vous arrêterez tous mais les plus avancés. Nous avons eu le même problème dans un jeu sur le Web que j'ai travaillé sur deux centaines d'utilisateurs k à une fois, etc. Nous avons fini par avoir des prisonniers afin que toutes les demandes soient passées à travers mais après la première action commune (envoyant la même flotte multiple. fois) ont été bloqués et abandonnés. Il génère toujours la demande initiale, mais ils sont insignifiants tant que leur traitement ne se produirait pas que l'événement Soumettre est mineur en génération de charge. Si vous prenez des luttes avec la charge HTTP, regardez Apache sur Cherokee / Nginx / Lightpd


Pouvez-vous faire une cache factice avant que toute demande puisse être faite?


Je dis à nouveau - le problème est votre pile technologique. SAPIS TRADITIONNEL SAPIS + Apache + AJAX n'a ​​pas été une bonne solution pour les applications axées sur les événements avec une hausse simultanée depuis ... Eh bien ... jamais.


@rdlowrey C'est en fait peu de fermes PHP (CGI) couvrant plusieurs serveurs + nginx qui fait également un équilibrage de charge


@Nicolasmanzini Le problème que j'ai avec le cache factice est la façon dont MemCache fonctionne. Si j'oublie de le nettoyer, il restera en mémoire, probablement pour toujours ou bien jusqu'à ce que je rlansez le serveur. Il n'invalide pas les clés avant de demander une clé expirée


Qui ne sert que d'illustrer l'erreur. Du nombre que vous avez fourni, il n'y a aucune raison pour que cela ne puisse pas être fait avec une boîte. Ce que vous faites, c'est comme attacher une traîneau à 50 chiens au lieu de conduire la voiture assise dans votre garage.


@rdlowrey Je suis complètement d'accord, mais l'échelle horizontale est populaire auprès des fournisseurs de nuages. Désolé, je veux dire les utilisateurs, évidemment.


4 Réponses :


1
votes

Je chercherais une solution en dehors de votre code.

Je ne sais pas quel serveur vous utilisez mais Apache a des modules comme mod_evasive par exemple.

Vous pouvez également limiter les connexions par seconde d'une adresse IP dans votre pare-feu


0 commentaires

0
votes

Limiter les connexions IP ne fera que faire en colère vos joueurs. J'ai réparé et réécrit beaucoup de choses dans des clones de jeux OpenSource célèbres avec un code de style ancien: Eh bien, je dois dire que la triche peut toujours éviter d'exécuter les bonnes requêtes et la logique. Par exemple, regardez ici http://www.xgproyect.net/2-9-x-fixes/9407-2-9-9-cheat-buildings-page.html

Quoi qu'il en soit, à propos de la performance, gardez à l'esprit que le code à l'intérieur des sessions bloquera tous les autres threads jusqu'à ce qu'il soit actuel. Soyez donc prudent pour intégrer tout votre code à l'intérieur des sessions.So, les sessions ne doivent jamais contenir de données lourdes.

À propos des scripts: Dans mes jeux, j'ai un module PHP qui réécrit automatiquement les liaisons ajoutant un ID aléatoire enregistré dans la base de données, une sorte de CSRFProtection. L'utilisateur humain cliquera sur le lien modifié, de sorte qu'ils ne verront pas les modifications, mais les scripts essaieront de demander à l'ancien lien et après avoir essayé d'essayer! D'autres scripts utilisent le DOM, il est donc facile de les éviter d'insérer une division inutile autour de la page.

Edit: Vous pouvez augmenter votre application avec https://github.com/facebook/hiphop- php / wiki


0 commentaires


0
votes

Je ne sais pas s'il y a une implémentation déjà là-bas, mais je cherche à écrire un serveur de cache qui a la responsabilité de nous renverser sur le cache Miss. Cette approche pourrait bien fonctionner dans ce scénario.

Fondamentalement, vous avez besoin d'un mécanisme pour marquer une fente de cache comme en attente sur une manche; Une lecture d'une valeur en attente devrait amener le client à dormir une petite mais aléatoire de temps et de réessayer; La population de données en attente dans un modèle traditionnel serait effectuée par le client rencontrant une Miss au lieu de pender.

Dans ce contexte, le script est le client, pas le navigateur.


0 commentaires