risposta

-3

Che tipo di coda dipende in gran parte dal successo di ciò che stai facendo. Non sono sicuro del motivo per cui si verificano problemi con la coda batchsize: Azure Storage Queue fornisce un messaggio dopo l'altro, come anche il bus di servizio.

Azure WebJobs si espanderà con il numero di siti Web su cui vengono ospitati, il che potrebbe causare problemi di concorrenza, ad esempio se si dispone di un processore di coda come un webjob in esecuzione in continuo, quindi se il sito Web viene ridimensionato a due istanze , avrai due Anche i WebJob stanno combattendo per la stessa coda.

Quindi, se si desidera utilizzare un singolo processore di coda, potrebbe essere una soluzione migliore per spostare il webjob in un servizio cloud, dove si ha il controllo del 100% sul numero di istanze, la separazione netta dai siti Web e il loro le istanze.

Dal momento che è necessario elaborare ogni messaggio in modo seriale, uno dopo l'altro, non avrebbe senso ridimensionare il numero di processori, perché avrebbero bisogno di attendere comunque che il successivo messaggio venga elaborato, quindi finché questo è un requisito, e tu potresti voler scalare il tuo sito web, suggerirei CloudService come un modo migliore per andare.

+1

FYI è possibile configurare WebJobs come Singleton. Quindi non c'è bisogno di passare a un Servizio Cloud se questa è l'unica cosa che si vuole realizzare – lopezbertoni

13

L'impostazione di BatchSize (JobHostConfiguration.Queues.BatchSize) non si applica all'elaborazione della coda di ServiceBus, solo alle code di Azure. Per configurare l'elaborazione della coda di ServiceBus, utilizzare ServiceBusConfiguration. La manopola che si desidera configurare è ServiceBusConfiguration.MessageOptions.MaxConcurrentCalls. Impostare questo per 1 per disattivare elaborazione simultanea su un unico (default è 16):

JobHostConfiguration config = new JobHostConfiguration(); 
ServiceBusConfiguration serviceBusConfig = new ServiceBusConfiguration(); 
serviceBusConfig.MessageOptions.MaxConcurrentCalls = 1; 
config.UseServiceBus(serviceBusConfig); 

JobHost host = new JobHost(config); 
host.RunAndBlock(); 

Ciò garantirà che solo un singolo messaggio viene elaborato alla volta su una singola istanza . Se la tua WebApp viene ridimensionata, ciascuna istanza ridotta verrà eseguita in questa modalità, il che significa che avrai un'elaborazione simultanea tra le istanze. Se non si desidera neanche quello, è possibile utilizzare SingletonAttribute per garantire che una sola istanza della funzione sia in esecuzione tra le istanze. Vedere lo Singleton wiki page per ulteriori informazioni.

+0

Grazie amico, proprio quello di cui avevo bisogno –

0

Se i messaggi hanno una dipendenza dall'ordine, è probabile che si disponga di una pipeline di operazioni. Ho uno scenario particolare in cui utilizzo Code di Azure anziché ServiceBus, ma credo che la seguente idea potrebbe applicare la stessa:

Ho un processo di automazione che: 1) crea un database, 2) crea un'applicazione web, 3) configurare l'app Web e 4) distribuire il codice. Per il mio caso, le cose devono essere fatte in questo ordine.

Per quel caso, ho creato una coda per ogni attività: create-database-queue, create-webapp-queue, configure-web-app e deploy-app-queue.

È molto più sicuro lavorare in questo modo perché si isolano le attività. Una volta terminato un processo in una coda, può essere trasferito alla coda successiva. Inoltre, potresti facilmente inserire un nuovo passaggio nel tuo processo. Ad esempio, posso facilmente inserire un nuovo passaggio 1.5) Restore database backup senza pensarci due volte.

Inoltre, si promuove il disaccoppiamento delle responsabilità con le singole code.

Problemi correlati