Question de conception: Comment concevez-vous un système d'événements récurrents?


44

Si vous deviez créer un système de planification d'événements prenant en charge les événements récurrents, comment le feriez-vous? Comment gérez-vous quand un événement récurrent est supprimé? Comment pourriez-vous voir quand les événements futurs se produiront? Par exemple, lors de la création d'un événement, vous pouvez sélectionner "Répéter quotidiennement" (ou hebdomadaire, annuel, etc.).

Un motif par réponse s'il vous plaît. Je suis habitué à Ruby/Rails, mais j'utilise tout ce que tu veux pour exprimer le design.

On m'a posé cette question lors d'une interview, et je n'ai pas pu trouver une très bonne réponse que j'ai appréciée.

Note: était already asked/answered here. Mais j'espérais obtenir des détails pratiques, comme détaillé ci-dessous:

  • S'il était nécessaire d'être en mesure de commenter ou autrement ajouter des données à une seule instance de l'événement récurrent , comment cela fonctionnerait-il?
  • Comment les changements et les suppressions d'événements fonctionneraient-ils?
  • Comment calculez-vous les événements futurs?
+1

J'adore cette question, mais je soupçonne qu'elle sera fermée. 28 oct.. 142014-10-28 20:23:43

  0

@ joe-van-dyk Hey, j'ai le même problème, pouvez-vous s'il vous plaît ajouter vos recommandations et un lien sur votre solution git dans la partie réponse !? Je crois que vous avez résolu ce problème. Je suis intéressant dans le modèle de données en général. Merci 16 mai. 172017-05-16 18:42:48

0

Lors de l'enregistrement de l'événement, je sauverais le calendrier dans un magasin (appelons-le « Horaires » et je aimerais Calculons lorsque l'événement était de tirer la prochaine fois et sauf que, ainsi, par exemple dans « Events ». ensuite, je regarde dans « Events » et savoir quand le prochain événement devait avoir lieu et aller dormir jusque-là.

lorsque l'application « réveille » il serait calculer quand l'événement doit avoir lieu à nouveau, enregistrez-le dans "Événements" à nouveau, puis effectuez l'événement

Répéter.

Si un événement est créé pendant le sommeil, le sommeil est interrompu et recalculé.

Si l'application démarre ou se remet d'un événement de veille ou similaire, cochez "Evénements" pour les événements passés et agissez en conséquence (en fonction de ce que vous voulez faire avec les événements manqués).

Une telle chose serait flexible et ne nécessiterait pas de cycles CPU inutiles.

  0

Pourriez-vous regarder dans le futur et voir quand les prochains événements seraient? 23 sept.. 082008-09-23 21:03:25


2

Je devais le faire auparavant lorsque je gérais la fin de la base de données du projet. J'ai demandé que chaque événement soit stocké en tant qu'événements distincts. Cela vous permet de supprimer une seule occurrence ou de déplacer une durée. Il est beaucoup plus facile de supprimer des multiples que d'essayer de modifier une seule occurrence et de la transformer en deux. Nous étions alors en mesure de faire une autre table qui avait simplement un ID de récurrence qui contenait l'information de la récurrence.


0

Du haut de ma tête (après la révision d'un couple de choses tout en tapant/pensée):

Déterminer le minimum récurrence résolution nécessaire; C'est à cette fréquence que l'application fonctionne. Peut-être que c'est tous les jours, peut-être toutes les cinq minutes.

Pour chaque événement périodique, stockez la durée d'exécution la plus récente, l'intervalle d'exécution et d'autres goodies comme l'heure d'expiration si cela est souhaitable.

Chaque fois que l'application s'exécute, elle vérifie tous les événements, en comparant (today/now + recurrenceResolution) à (latestRunTime + runInterval) et, s'ils coïncident, déclenche l'événement.


2

@Joe Van Dyk a demandé: "Pourriez-vous regarder dans le futur et voir quand les prochains événements seront?"

Si vous vouliez voir/affichage les prochains n occurences d'un événement qu'ils auraient soit a) être calculé à l'avance et stocké quelque part ou b) être calculé à la volée et affiché. Ce serait la même chose pour n'importe quel cadre de soirée. L'inconvénient de a) est que vous devez lui mettre une limite quelque part et après que vous devez utiliser b). Plus facile juste pour utiliser b) pour commencer.

Le système de planification n'a pas besoin de cette information, il a juste besoin de savoir quand l'événement prochain est.

  0

Ou mélanger les deux. Calculer sur demande (b), puis stocker les résultats pour référence ultérieure (a). 24 sept.. 082008-09-24 06:34:28


0

Lorsque j'ai écrit une application de calendrier pour moi-même mumble il y a des années, j'ai fondamentalement simplement volé le mécanisme de planification de cron et utilisé que pour les événements récurrents. Par exemple, quelque chose qui se passe le deuxième samedi de chaque mois sauf le mois de janvier inclurait l'instruction "repeat = * 2-12 8-14 6" (chaque année, les mois 2-12, la deuxième semaine se déroule du 8 au 14, et 6 pour samedi parce que j'ai utilisé la numérotation 0 pour les jours de la semaine). Bien que cela facilite la détermination de l'événement à une date donnée, il n'est pas capable de gérer la récurrence «tous les N jours» et est également moins intuitif pour les utilisateurs qui ne sont pas unix-savvy. Pour traiter des données uniques pour des instances d'événement individuelles et pour le retrait/le replanification, j'ai simplement suivi la manière dont les événements ont été calculés et stockés dans la base de données, où ils pouvaient ensuite être modifiés, déplacés ou supprimé sans affecter les informations d'événement récurrent d'origine. Lorsqu'un nouvel événement récurrent a été ajouté, toutes les instances ont été calculées immédiatement jusqu'à la date «dernier calculé».

Je ne prétends pas que c'est la meilleure façon de le faire, mais c'est un moyen, et qui fonctionne très bien dans les limites que j'ai mentionnées plus tôt.


0

Si vous avez un événement de réapparition simple, tel que quotidien, hebdomadaire ou quelques jours par semaine, quel est le problème avec l'utilisation de buildt dans scheduler/cron/at functionallity? Créer une application exécutable/console et configurer quand l'exécuter? Pas de calendrier compliqué, d'événement ou de gestion du temps.

:)

// W

+1

ne fonctionne pas pour une application Web 06 oct.. 082008-10-06 01:34:53


9

j'ai commencé en mettant en œuvre une expression temporelle comme outlined by Martin Fowler. Cela prend soin de déterminer quand un élément programmé devrait effectivement se produire. C'est une façon très élégante de le faire. Ce que j'ai fini avec était juste une accumulation sur ce qui est dans l'article.

Le problème suivant consistait à trouver comment stocker les expressions dans le monde. L'autre problème est lorsque vous lisez l'expression, comment ceux-ci s'intègrent dans une interface utilisateur pas si dynamique?On parlait de sérialiser les expressions dans un BLOB, mais il serait difficile de marcher dans l'arbre d'expression pour savoir ce qu'il voulait dire. La solution (dans mon cas) consiste à stocker les paramètres qui correspondent au nombre limité de cas pris en charge par l'interface utilisateur, et à partir de là, utiliser ces informations pour générer les expressions temporelles à la volée (sérialiser lors de la création pour l'optimisation). Ainsi, la classe Schedule finit par avoir plusieurs paramètres comme offset, date de début, date de fin, jour de la semaine, et ainsi de suite ... et à partir de cela vous pouvez générer les expressions temporelles pour faire le travail. En ce qui concerne les instances des tâches, il existe un «service» qui génère des tâches pour N jours. Comme il s'agit d'une intégration à un système existant et que toutes les instances sont nécessaires, cela a du sens. Cependant, une API comme celle-ci peut facilement être utilisée pour projeter les récurrences sans stocker toutes les instances.