Wątek przeniesiony 2019-09-06 11:02 z przez cerrato.

Architektura, Scheduling 100k wierszy per minute

Odpowiedz Nowy wątek
2019-09-05 17:28
0

Witam, nie mam pomysłu na rozwiązanie takiego problemu:

Mamy np jakąś usługe (ogłoszenie) które zostało wystawione o godzinie 15.00. Użytkownik jest wstanie ustalić potem godzine o której będzie ogłoszenie odświeżone tzn. wystawil ogloszenie we wtorek godz 14 i w srode o godz 15 (bo tak ustalił) będzie zmieniana po prostu inna zmienna. Teraz pytanie czy lepiej brać jakiś okres czasu np od 14.30 do 15.00 sciagac te ogloszenia w ktorych godzina znajduje sie w tym zakrecie czy ustawić scheduler co minute. Gdzie w tym zakresie może ich być około 100k. A jak postąpić jeśli byłoby ich milion?

edytowany 1x, ostatnio: cerrato, 2019-09-06 08:22

Pozostało 580 znaków

2019-09-06 11:16

Na temat odpowiadaj w postach.

Zbior czytasz paczkami po k rekordow.
Jak przerobisz paczke i masz czas (wewnatrz tego okna 4m 30s) na przetworzenie kolejnej to bierzesz nastepna paczke.


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2019-09-06 11:16
1

@Xarenz:

użytkownik nie ma dostępu do ustalania czasu działania schedulera jedynie wybiera godzinie o ktorej ogloszenie ma zostac odswiezone to ja ustalam co ile ma działać żeby w tym czasie wykonać operacje na ogłoszeniu

Czyli jednak ma ten dostęp. W momencie, gdy użytkownik wybiera godzinę odświeżenia, to tworzysz zadanie i wrzucasz je do schedulera:

public class RefreshJob implements Job{
        public RefreshJob(){} // musi być w takiej formie niestety

       public void execute(JobExecutionContext context)
            throws JobExecutionException {

                // tak wyciągasz parametry
        JobDataMap data = context.getMergedJobDataMap();
        System.out.println("someProp = " + data.getString("someProp"));
    }

}

// gdzieś w kontrolerze albo serwisie obsługującym przyjmowanie danych od użytkownika

JobDetail job1 = newJob(RefreshJob.class)
    .withIdentity("refresh-job-UUID", "refresh-jobs")
    .usingJobData("someProp", "someValue") // tu dodajesz parametry, które wyciągasz z kontekstu
    .build();

Trigger trigger = newTrigger()
    .withIdentity("refresh-trigger-UUID", "refresh-triggers")
    .startNow()
    .withSchedule(dailyAtHourAndMinute(GODZINA_PODANA_PRZEZ_UŻYTKOWNIKA, MINUTA_PODANA_PRZEZ_UŻYTKOWNIKA)) // odpala się codziennie o podanej godzinie i minucie
    .build();

sched.scheduleJob(job, trigger); 

Gdzie sched jest skonfigurowanym schedulerem.

mhm, ok fajne a co jeśli kilku użytkowników poda tą samą godzine i minute? Chciałbym po tygodniu anulować ten trigger automatycznie, jest tak możliwość? :D - Xarenz 2019-09-06 11:21
@Xarenz: odpowiadaj w postach - Koziołek 2019-09-06 12:37

Pozostało 580 znaków

2019-09-06 12:39
1

mhm, ok fajne a co jeśli kilku użytkowników poda tą samą godzine i minute? Chciałbym po tygodniu anulować ten trigger automatycznie, jest tak możliwość?

Tak jest. Na górze, w moim pierwszym poście, masz link do dokumentacji. Unscheduling jest możliwy. Jeżeli kilku użytkowników poda tą samą godzinę, to scheduler to spokojnie ogarnie za pomocą własnej puli wątków.

Pozostało 580 znaków

2019-09-06 13:02
0

Quartz ogarnie milion zadań dziennie? Z tego, co wiem to Quartz nie działa w rozproszonym środowisku.

Pozostało 580 znaków

2019-09-06 13:07
1

@Charles_Ray ogarnie milion, tylko trzeba wiedzieć jak to zrobić. Domyślna konfiguracja wymaga wtedy drobnych poprawek. Co do środowiska rozproszonego, to trzeba, niestety, postawić bazę danych i skonfigurować odpowiednio serwery. Chodzi o synchronizację czasu na maszynach, co nie jest trywialne, ale wykonalne.

http://www.quartz-scheduler.o[...]igJDBCJobStoreClustering.html

Never run clustering on separate machines, unless their clocks are synchronized using some form of time-sync service (daemon) that runs very regularly (the clocks must be within a second of each other). See http://www.boulder.nist.gov/timefreq/service/its.htm if you are unfamiliar with how to do this.

Pozostało 580 znaków

2019-09-06 14:50
0

Skoro tu w grę wchodzi tylko godzina jaka ma się wyświetlić użytkownikowi to może takie rozwiązanie udało by się jakoś zaimplementować? (z góry mówię, że nie siędze w webówce więc się nie orientuję). Jeżeli użytkownik wejdzie przed godziną, którą wybrał sobie użytkownik za "godzinę odświeżania" to wyświetla mu datę z dnia poprzedniego, jeśli już po tej godzinie, to z dnia dzisiejszego.

Czyli coś w stylu:

void showContent()
{
  var now = getDate();
  var refreshDate = getRefreshDateFromDatabase();

  if ( now.getTime() < refreshDate.getTime() )
  {
     setDate(now.getDate() - 1, now.getMounth(), now.getYear(), now.getTime());
  }
  else
  { 
     setDate(now.getDate(), now.getMounth(), now.getYear(), now.getTime());
  }
}

To taki pseudo kod w krokach można to rozpisać:
1) pobierz aktualną datę
2) pobierz datę odświeżania
3) porównaj godzinę (teraz) oraz godzinę (odświeżania)
4) jeśli mniejsza to ustaw dzień na poprzedni, w przeciwnym wypadku na aktualny.

I w zasadzie nic nie trzeba odświeżać w bazie, bo po co...

ale tu nie chodzi tylko o wyświetlanie daty :D - Koziołek 2019-09-06 15:13
@Koziołek: a o co tu jeszcze chodzi? ;) Op chyba nie opisał po co mu to (chyba, że mi umknęło gdzieś w komentarzach). Na takiej tablicy ogłoszeń, można domniemywać, że chce "odświeżone" ogłoszenie pokazywać "wyżej", a do tego nie trzeba żadnych schedulerów imo, tylko wybrać aktywne ogłoszenia i posortować po "odświeżalnych" i "wyliczonej dacie dodania". No chyba, że faktycznie chodzi o coś innego, ale o co? :) - yarel 2019-09-06 15:37
@yarel: też jest taka szansa, ale tutaj jest dość duży chaos. - Koziołek 2019-09-06 15:38

Pozostało 580 znaków

2019-09-06 21:31
0

Stawiam ze te aukcje masz w jakiejs bazie SQL to moze nie kombinowac jak kon pod gore skoro z tego co piszesz potrzebujesz aktualizowac jedna zmienna i np co 1min robic update tych dat ktore w zakresie tej 1 min sie przedawnily zeby je podbilo?

Zapytanie mozesz odpalac quartzem, bazodanowo scheduler czy co tam wolisz

edytowany 1x, ostatnio: Ziemiak, 2019-09-06 21:31

Pozostało 580 znaków

2019-09-07 22:38
0

OP chce przetwarzać 100,000 rekordów biznesowych na minutę w bazie SQLowej. Nie wiadomo, jak to się tłumaczy na liczbę wierszy w tabelkach i indeksach. Cokolwiek się nie zaimplementuje, będzie trzeba tunować.
Tu nie ma prostych rozwiązań. Ja bym się skłaniał do „derived data”, tak jak to napisal @wyebani. Alternatywnie jakieś batchowanie - zakładam, że „odświeżenie” nie musi być wykonane dokładnie co do sekundy.

Quartz z milionem triggerów to jest ryzykowny pomysł. Quartz nie był zaprojektowany pod taki przypadek użycia. Domyślam się, że tabelki quartza wylądują w tej samej db, co przetwarzane dane. Wtedy każdy micro job dodatkowo będzie wymagał kilku zapytań quartzowych (z lockowaniem wierszy). To wybuchnie.

Można to usprawniać, ale gdy czytam, jak OP opisuje swój problem, to mam wątpliwości, czy powinien się zajmować takimi zagadnieniami.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0