7
votes

MySQL déclencheur / événements vs cronjob

J'ai un site de vente aux enchères qui permettent à mes utilisateurs de placer une quantité illimitée d'autobidations.

Pour surveiller ces autobidèles, quelque chose doit vérifier la base de données chaque seconde.

Ma question est de savoir s'il est préférable d'utiliser des événements de déclenchement MySQL ou de l'utilisateur un cronjob chaque minute qui exécute un script PHP en boucle de 60 secondes.

Si j'utilise les événements de déclenchement MySQL, des centaines d'événements seront des piles d'événements sur eachother et sont tirées à des moments différents. Est-ce seulement possible?? Et le serveur ne peut-il pas goner le gonage pour être énorme. J'ai entendu quelque part que la base de données sera verrouillée alors qu'il existe un événement prévu. J'utilise des tables innodb BTW.

J'espère que certains peuvent perdre une lumière sur cette toppic.

Cordialement!


3 commentaires

Quelle est votre défense d'un autobid, quand il y a deux autobidés en suspens, comment interagissent-ils? Qu'est-ce qui fait une fin de vente aux enchères? Peut-être un poste de cron devrait fonctionner à la fin de la vente aux enchères pour évaluer qui a gagné. Le site Web bloquera simplement les enchères sur la vente aux enchères finie. Le travail de cron sera envoyé par courrier électronique qui gagne.


Salut, laissez-moi vous expliquer le concept un peu plus loin. Une enchère commence à 0.00 EUR. Quand quelqu'un place un peu le prix monte avec 0,01 EUR. Les offres sont des endroits avec des crédits qu'ils achètent. Lorsqu'une vente aux enchères est sur le point de se terminer et que quelqu'un place une offre, l'enchère s'étend avec 60 secondes. Donc, quand les gens veulent partir, ils peuvent mettre une enchère automatique. Ces offres seront et doivent être placées au hasard avant la fin de la vente aux enchères, prolongeant le temps avec une autre minute, etc. Les enchérissances n'interagissent pas les unes avec les autres. Une autobidation est choisie au hasard, pas le dernier soumissionnaire.


+1 car j'ai la même question


4 Réponses :


2
votes

Vous feriez mieux d'exécuter un script séparé qui fonctionne éternellement et regarde votre base de données. De cette façon, vous n'avez pas besoin de cron. Ni une quantité massive de déclencheurs.

Mais vous voudrez peut-être reconsidérer toute votre question. Il n'est pas nécessaire de mettre à jour les offres chaque seconde. Vous n'avez besoin que de remplir le passé x minutes / heures lorsque quelqu'un pointe réellement son navigateur vers une enchère ou fait une offre manuelle. Si ce sont tous des autobidés, vous pouvez calculer facilement un recul avec facilité.


2 commentaires

Salut, merci pour la réaction. Cela pourrait être une solution au problème. Mais je veux pouvoir envoyer un email à l'utilisateur le deuxième après avoir gagné l'action. Et si vous voyez 3 personnes activer leurs enchères automatiques, et ils quittent le site Web, toutes les offres doivent être faites au hasard pendant le temps qu'il y a des offres à gauche. Lorsque les offres sont terminées, le courrier électronique doit être envoyé. Je veux vraiment que tout le processus fait sans que quelqu'un doive être sur le site Web.


Puis la première partie de ma réponse, i.s. un script distinct qui fonctionne éternellement (avec une boucle de temps (vraie) et un sommeil 1 sec.) serait la meilleure option



1
votes

Les poignées de la base de données des demandes programmées ne sont pas différentes de l'autre requête. Mais autant de demandes programmées contiennent des opérations de base de données et de la table de maintenance qui verrouissent la base de données, il n'est pas rare qu'il leur fasse.

Ayant dit que: Lorsque vos systèmes doivent réagir aux actions par un utilisateur, le moyen technique préférable de le faire consiste à utiliser des déclencheurs. En pratique, cela pourrait entraîner des problèmes de performance lorsque votre site a des charges élevées - bien que l'utilisation d'un événement planifiée puisse causer le même problème.

Mon avantage est de mettre votre logique dans les procédures stockées et d'appeler ces procédures stockées à partir des déclencheurs. Lorsque vous constatez que les déclencheurs ne continuent pas, vous pouvez toujours supprimer les déclencheurs et appeler les procédures stockées d'un travail cron.


2 commentaires

Bonjour, merci pour la réponse. J'ai une question de suivi à ce sujet. Cela pourrait sembler une question débutante, mais que sont les déclencheurs exactement, MySQL déclenche. Et quelles sont les procédures stockées. Je suppose que les procédures stockées sont les scripts PHP que j'ai écrites qui mettent à jour la DB. Si je fais un script PHP qui se bouclait pour toujours jusqu'à ce que Eterniry, cela consommera beaucoup de puissance de la CPU?


Les déclencheurs sont des morceaux de code SQL qui sont automatiquement exécutés lorsque des données dans une table change. Les procédures stockées sont des collections de commandes SQL groupées ensemble. Vérifiez simplement la documentation sur le site MySQL.



0
votes

Je voudrais probablement modéliser la solution à votre problème d'enchères automatique un peu différemment:

Que diriez-vous d'une approche basée sur des événements? Vous stockez les demandes de soumission automatique de vos utilisateurs et si quelqu'un enchère réellement sur un objet, vous traitez les enchères automatiques précédemment mis en file d'attente.

Ceci a les avantages suivants:

  • La charge de la base de données est distribuée de manière biologique
  • Vous ne faites que des recherches qui sont réellement nécessaires à l'époque.
  • C'est en temps réel et non basé sur des tiques
  • Il est plus facile de raisonner sur la logique commerciale / application, car il est local au lieu de global

3 commentaires

Bonjour, merci pour la réponse, mais je ne pense pas pouvoir utiliser ce modèle. Disons que 3 personnes ont permis à leurs autobidés et quittent le site Web. Maintenant, il n'y a personne sur le site Web ou occupé sur le site Web. Toutes les offres doivent être faites avant que la vente aux enchères ne puisse se terminer.


De ma compréhension, cela fonctionnerait toujours car si personne ne visite les sites Web, personne ne peut enchérir, de sorte que les enchères automatiques ne devraient pas être traitées, non? Bien sûr, si vous souhaitez envoyer des notifications (email, SMS, ...) Lorsqu'une enchère prend fin, vous devez observer le système. Bien que je suppose que cela serait assez bon d'utiliser un cron qui fonctionne une fois toutes les 5 minutes et vérifie toutes les enchères terminées. Cela fonctionnerait-il pour vous ou existe-t-il des exigences supplémentaires pour la manière dont les enchères sont censées fonctionner?


Les gens paient bien pour passer une offre, il est donc important que tous les autobidés soient placés.



0
votes

Vous pouvez utiliser le script Bash & Shell pour atteindre ce processus de processus d'enchères automatique. Reportez-vous à ce lien, vous obtiendrez une idée: Bash Script qui exécute fichier php toutes les 5 secondes


0 commentaires