Je concevons une interface de repose-file d'attente de tâches et je m'interroge sur une meilleure pratique. P>
Une action est d'accepter la tâche "Suivant" dans la file d'attente. P>
En acceptant le travail, seul le premier ouvrier obtiendra le travail. P>
Le travailleur ne connaîtra pas la tâche ou l'ID de tâche jusqu'à ce que l'acceptation du travail. P>
Maintenant, je pense que je ne peux pas utiliser un get car ce n'est pas idempotent. Si vous appelez NextTask deux fois, vous obtenez deux emplois différents. Donc, je suppose que cela devrait être un post. P>
post // repose / taskQueue? action = Acceptertask p>
ou suis-je en train de regarder le mauvais moyen? p>
3 Réponses :
POST est le verbe "APPEND", ainsi que le verbe "Traitement des données" par la spécification HTTP. Donc, conceptuellement, vous appuyez sur une tâche à une liste de tâches pour le traitement. La poste est juste juste.
Une autre raison d'obtenir n'a pas raison est que ce n'est pas censé apporter des modifications à la ressource. Mais la demande entrante est em> va faire des changements ... il ajoutera un élément. P> Je laisserais hors de "Action = Accepttask". En repos, le verbe HTTP spécifie votre intention et l'URI spécifie la cible. Donc ce que vous faites est d'ajouter une nouvelle tâche à la file d'attente ... Le paramètre "Action" n'ajoute rien. P> Généralement, si vous souhaitez fournir des informations supplémentaires à la demande, vous pouvez Ajoutez des paramètres pour fournir des modificateurs sur ce qu'il faut faire. Mais l'autre convention est de choisir plus ou moins de tricher et de mettre ensuite l'intention à la fin de l'URI et de le traiter comme une sous-ressource (c'est-à-dire au lieu d'un paramètre). par exemple: p> Cependant, vous ne devez jamais dupliquer les verbes HTTP ... c'est une mauvaise utilisation du protocole sous-jacent et un non-non au repos: P> ht_p://.../taskqueue/get
ht_p://.../taskqueue/update
ht_p://.../taskqueue/delete
...ack!
Fondamentalement:
C'est comme ça que je le ferais. p>
Enqueue une nouvelle tâche: p> Enqueue une nouvelle tâche avec un identifiant spécifique : p> récupérer la tâche la plus ancienne: p> si la file d'attente est vide: p> --> DELETE http://api.crazyjoes.com/v1/tasks/oldest/
<-- 200 OK
<-- {"id":123,"data":{"lulcat":true}}
Merci pour la réponse que cela a du sens. En fait, je pensais à ne pas supprimer immédiatement la tâche de la file d'attente, mais simplement de changer le statut de Nouveau à accepté, puis à compléter une fois que cela est fait. De cette façon, je peux suivre les tâches acceptées mais jamais terminées pour les remettre sur la file d'attente si nécessaire. Peut-être que je peux juste envoyer 409 conflits au lieu de 410 dans ce cas. Ou comme vous avez suggéré avoir une autre table pour les emplois acceptés / en attente / complétés et envoyez le 410.
HMM, cette conception ne semble pas que cela s'adresse à l'exigence de l'OP selon laquelle "en acceptant le travail que le premier ouvrier obtiendra le travail". Deux travailleurs pourraient saisir de manière indépendante la tâche la plus ancienne, puisque cette conception ne résouie pas la tâche ni la marque comme revendiquée lors de la récupération de la tâche la plus ancienne. Une suggestion: -> Post API.CRAZYJOES.com/v1/task_Distributeur <- 200 OK retourne et déteste (ou marque comme "réclamé") la tâche la plus ancienne.
Du: P>
alors édition Si cela échoue, c'est-à-dire renvoyer un non-20x, cela signifie que quelqu'un d'autre a sauté la file d'attente entre vos appels. p>
Si cela réussit, il retournera la tâche dans son corps et vous pouvez faire ce que vous voulez avec elle, sachant que vous l'avez éclairé avec succès. Ou car vous connaissez son identifiant, vous pouvez obtenir les informations de tâche à partir de Cela ne devrait pas réussir plus d'une fois. p>
et vous pouvez émettre / tâches code> et / tâches / {waskid} code> sont la collection habituelle de toutes les tâches et une tâche individuelle, respectivement. P>
/ TasksQueue code> est la tâche sur la file d'attente, tandis que / TasksQueue / Top code> est le haut de la file d'attente et ne prend en charge qu'un get. Supposons que toutes les tâches ont une carte d'identité unique. P>
get / TasksQueue / Top code> Pour obtenir l'ID de la tâche en haut de la file d'attente, et émettez un Supprimer / TasksQueue / {Taskid} Code> Tentative pour l'apparaître de la file d'attente. p>
/ tâches / {waskid} code>. p>
Supprimer / TasksQueue / {TaskId} Code> plusieurs fois avec le même effet global sur le système comme l'un d'entre eux, par conséquent Supprimer code> est actionné idimpotentement comme cela devrait. (Le fait que tout ou tout sauf le premier, supprimer code> renvoie un non-20x ne modifie pas ce fait.) P>
S'il est vraiment important que deux travailleurs différents n'auront pas la même tâche, c'est un bon sens. Cependant, il y a un risque que lorsque la suppression est effectuée (c'est-à-dire un article est sauté), il n'est pas réellement terminé pour une raison quelconque. Une variante serait d'envoyer l'article entier à obtenir, puis de confirmer sa fin avec une suppression. Cela risquerait toutefois que deux travailleurs obtiennent le même article puis du travail en double. Devinez que vous choisiriez en fonction de la mauvaise duplication du travail et de la gravité d'un objet perdu dans votre application. Sauf s'il y a un moyen de résoudre les deux cas?