2017-03-21 4 views
0

J'ai un site Web MVC, une file d'attente de stockage et un WebJob. Les utilisateurs peuvent demander la génération d'un ensemble de rapports en cliquant sur un bouton de la page Web. Cela insère un message dans la file d'attente de stockage. Dans le passé, WebJob fonctionnait continuellement et traitait ces requêtes correctement. Mais la demande et la taille des rapports ont augmenté au point où WebJob ralentit l'application Web. Je voudrais encore placer le message de demande dans la file d'attente, mais retarder le traitement de toutes les demandes jusqu'au soir, quand l'application Web est la plupart du temps inactive. Cela me permettrait de continuer à utiliser le code WebJob et la fonctionnalité QueueTrigger sans avoir à gaspiller de ressources en passant à un rôle de travailleur dédié, etc. Les rapports n'ont pas besoin d'être générés immédiatement, donc un délai est acceptable.Azure WebJob - Limite du temps de traitement à des heures spécifiques

Je ne vois pas de façon intégrée de définir une fenêtre de temps lors du traitement. La seule chose que j'ai trouvée est une cmdlet powershell pour démarrer et arrêter WebJobs (Start-AzureWebsiteJob/Stop-AzureWebsiteJob). Donc je pensais que je pourrais créer un travail PowerShell programmé qui s'exécute à minuit, démarre le webjob, le laisse fonctionner, puis s'exécute de nouveau tôt le matin et l'arrête.

Est-ce que quelqu'un connaît une meilleure option que celle-ci? Quelque chose de plus "officiel" que peut-être je ne pouvais pas trouver?

Répondre

1

Une solution possible consisterait à masquer les messages dans la file d'attente pendant un certain temps lorsqu'ils sont insérés.

Si vous utilisez la méthode AddMessage, vous pouvez spécifier cette valeur de période dans le paramètre initialVisibilityDelay. Cela permettra de s'assurer que les messages ne sont pas immédiatement visibles dans la file d'attente pour être sélectionnés par WebJob et ne seront visibles que lorsque ce délai sera écoulé.

Une telle solution vous convient-elle?

+0

J'ai complètement oublié initialVisibilityDelay. Je devrais ajouter un nouveau wrapper AddMessage par rapport à ce que nous utilisons maintenant, mais je pense que cela fonctionnerait. Tant que la file d'attente n'est pas trop grande, elle ne sera pas traitée en une nuit ... car cette solution n'a pas d'option "shut off". Merci. –

1

Peut-être que je n'ai pas bien compris votre question, mais ne pourriez-vous pas utiliser WebJob "Déclenché" qui est déclenché par le programme CRON? Vous pouvez ensuite limiter à des heures spécifiques

0 * 20-22 * * * 

Cet exemple courra chaque minute 20 heures-22 heures

+0

Peut-être que j'ai besoin d'expérimenter. J'ai fait des travaux de Queue Trigger et de simples tâches déclenchées par cron, mais je n'ai jamais essayé de combiner les deux. Lorsque le traitement commence, je ne veux pas simplement essayer de traiter tous les messages de la file d'attente en une seule fois. Ces rapports deviennent volumineux et peuvent consommer une quantité décente de mémoire par travail. Je limite le nombre de travaux à 4 par boîte (en utilisant MaxDequeueCount) pour cette raison. En tant que travail déclenché, je ne suis pas sûr que cela fonctionnerait. S'il y avait 50 messages dans la file d'attente, je veux seulement traiter 4 à la fois. –