Witam.
Potrzebuje napisać usługę (usługa windows, service worker), która będzie przerabiać dane pomiędzy SQL Server, a API Allegro. W związku z tym, że ofert na Allegro jest bardzo dużo i tyczy się to kilku kont (8), to chciałbym temat ogarnąć w miarę asynchronicznie, aby jak najwięcej rzeczy przeliczyć w tym samym czasie.
Są momenty, w których jest tak dużo zmian, że timer się nakłada i nie kończy poprzedniego zadania (co 30 minut). Czas operacyjny jest czasem też wydłużany przez sekundowe oczekiwanie na odpowiedź z API Allegro, głównie przy metodzie PUT
.
Aktualizowane są stany magazynowe, ceny oraz aktywność ofert.
- Czy jedynym, mądrym, rozwiązaniem będzie podział każdej operacji na osobną usługę?
- Czy za pomocą
Quartz
jestem w stanie to rozbić przy jednej usłudze? Może inny "timer" jest w stanie?
Na samym początku było tak, że był jeden IJob
i w pętli leciałem po wszystkich kontach, mało to wydajne, bo... wiadomo. Teraz jest tak, że Quartz
uruchamia dla każdego konta osobny IJob
, więc troszkę wydajniej. Tym razem chciałbym pójść level wyżej i rozdzielić to na tyle wątków na ile jest to możliwe.
// pętla po kontach
foreach(AllegroAccount account in _allegroAccounts)
{
// pobranie ofert z danego konta
var offers = await _allegroService.GetOffers(account);
// podział ofert na zdania
var endedOffers = offers.Where(x => x.publication.status == "ENDED");
var activeOffers = offers.Where(x => x.publication.status == "ACTIVE");
var stockPriceOffers = offers.Except(endedOffers); // nie wiem czy dobrze wybrałem, chodzi o ogólny zamysł, żeby nie przerabiać nieaktywnych
JobDataMap endedJobData = new JobDataMap();
endedJobData.Put("jobData", endedOffers);
JobDataMap activeJobData = new JobDataMap();
activeJobData.Put("jobData", activeOffers);
JobDataMap stockPriceJobData = new JobDataMap();
stockPriceJobData.Put("jobData", stockPriceOffers);
// stworzenie zadań
IJobDetail job = JobBuilder.Create<EndOffersJob>().UsingJobData(endedJobData).Build();
IJobDetail job = JobBuilder.Create<ActiveOffersJob>().UsingJobData(activeJobData).Build();
IJobDetail job = JobBuilder.Create<StockPriceOffersJob>().UsingJobData(stockPriceJobData).Build();
}
Czy taki przykład załatwi mi sprawę asynchronicznie? Czy to można już nazwać multitaskingiem? Jak ogarnąć logi i wyjątki jeśli chciałbym wiedzieć co kiedy się zrobiło?