Mam webapi, który jest przeznaczony do przetwarzania raportów w sposób kolejki. Kroki aplikacja odbywa się w następujący sposób:Jak w kolejce zadań tła w ASP.NET Web API
- odbierać treści
- mapie zawartości na obiekt i umieścić go w kolejce
- Ankietę dla oczekiwaniu pozycji w kolejce
- elementy procesu w kolejce jednego naraz
Myślałam używać Entity Framework do tworzenia bazy danych oczekujących elementów, takich jak:
public class EFBatchItem
{
[Key]
public string BatchId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateCompleted { get; set; }
public string BatchItem { get; set; }
public BatchStatus Status { get; set; }
}
Moje pytanie - czy istnieje skuteczniejszy sposób korzystania z NServiceBus, BlockingCollection lub ConcurrentQeueue, niż ciągłe odpytywanie bazy danych i wyciąganie oczekujących elementów jeden po drugim? Nie korzystałem wcześniej z kolejek.
Jedną z myśli jest utworzenie kolejki zadań, a na osobnym wątku przetwarzanie wszystkich oczekujących zadań. Nieco podobne do Most efficient way to process a queue with threads, ale chcę mieć pewność, że wybieram najbardziej efektywną trasę.
EDYTOWANIE: Duże pytanie, które mam tutaj, to najlepszy sposób, aby wyświetlić postępy dla użytkownika. Po przesłaniu treści użytkownik zostaje przeniesiony na nową stronę i może wyświetlić status za pomocą identyfikatora partii. Czy MSMQ jest niezbędny, czy NServiceBus, aby powiadomić użytkownika? Wydaje się to być odmianą paradygmatu REQUEST/Acknowledge/Push?
moje rozwiązanie byłoby 'lock' oświadczenie wokół części kodu, w którym piszesz do bazy danych. – efkah
Dzięki za napiwek - nie myślał o tym, i prawdopodobnie spowodowałoby wiele problemów później :) Wszelkie myśli na temat metody kolejkowania? Czy powinienem próbować BlockingCollection, czy po prostu ciągłe odpytywanie bazy danych? Zaktualizował pytanie szybką edycją. – appsecguy