Zakończenie Aukcji

0

Witam serdecznie,

Piszę aplikację intranetową w asp.net mvc (takie ubogie allegro), napisałem już prawie wszystko, ale z jednym nie mogę sobie poradzić.
Pytanie: w jaki sposób, zakończyć aukcję o danym czasie?
Przypuśćmy, że mam tabelę o nazwie aukcja z 4 kolumnami: Id,DataStart, DataKoniec, Zakonczona
Wymyśliłem sobie, że kiedy użytkownik się zaloguje, to pobiorę aktualną godzinę i porównam z godziną zakończenia aukcji zapisaną w bazie danych.
Następnie, zapiszę do bazy do kolumny Zakonczona wartosc 1
Kiedy następny użytkownik się zaloguje, to odczytywana będzie wartość Zokonczona i jeśli jest 1 to wyświetli się komunikat.
Natomiast teoretycznie, jeśli nikt się nie zaloguje jako pierwszy, to aukcja nigdy się nie zakończy, ponieważ nikt nie zaktualizuje wartości w bazie danych.
Nie za bardzo wiem jak ten temat ugryźć:-(
Bardzo proszę doświadczonych forumowiczów, o kierunek działania, lub jakąś wskazówkę.

Pozdrawiam serdecznie.

0

Jak user wchodzi na stronę to sprawdzasz o której aukcja się kończy, porównujesz z aktualną godziną i wiesz czy wyświetlić że zakończona lub ile czasu zostało.
Do tego niech job chodzi na przykład co minutę i zbiera wszystkie aukcje co się pokończyły. I tam może odfajkować że zakończona czy wysłać powiadomienie do zwycięzcy itp.

0

Jak wyżej. Status musisz określić na podstawie daty a nie dodatkowej kolumny z boolem.

0

Dziękuje za szybkie odpowiedzi.
Proszę mi jeszcze powiedzieć, czy takiego joba odpalić używając powiedzmy Quartz.NET, czy macie jakieś inne rozwiązanie z doświadczenia?

0
dam1an napisał(a):

Jak user wchodzi na stronę to sprawdzasz o której aukcja się kończy, porównujesz z aktualną godziną i wiesz czy wyświetlić że zakończona lub ile czasu zostało.
Do tego niech job chodzi na przykład co minutę i zbiera wszystkie aukcje co się pokończyły. I tam może odfajkować że zakończona czy wysłać powiadomienie do zwycięzcy itp.

yyy wat?

Przecież to job powinien zamykać aukcje. W Twoim rozwiązaniu aukcja może się nigdy nie zakończyć.

0

Nie rozumiem, jak job będzie chodził to czemu aukcja miałaby się nigdy nie zakończyć?

0
somekind napisał(a):

Przecież to job powinien zamykać aukcje.

Aukcje na allegro są zakańczane (muszą być) z dokładnością do setnych sekundy - nie może się zdarzyć że aukcja była do 1900 a o 1901 złożono ostatnią ofertę.
Myślisz że ustawienie joba który będzie odpytywał bazę choćby 2 razy na sekundę to dobry pomysł?

Moim zdaniem w ogóle nie ma potrzeby żeby aukcję w ogóle zakańczać - to tylko kwestia w wyświetlaniu - jeżeli czas końca jest w przeszłości to piszemy "zakończono"

Co do maili które przychodzą po zakończeniu aukcji to tutaj wystarczy job ustawiony choćby na odpalanie co 15 minut który zbierze po prostu aukcje od ostatniego odpalenia joba i wyśle odpowiednie maile. Maile z allegro też nie przychodzą od razu - czasami nawet po kilku godzinach, ale tu pewnie chodzi o duży ruch na tym serwisie

Nie ma potrzeby aktualizować w bazie danych żadnej flagi zakończenia aukcji kilka razy na sekundę

0
hmmmmmm napisał(a):

Aukcje na allegro są zakańczane (muszą być)

Moim zdaniem w ogóle nie ma potrzeby żeby aukcję w ogóle zakańczać

Nie nadążam za tak szybkimi zmianami zdania.

Myślisz że ustawienie joba który będzie odpytywał bazę choćby 2 razy na sekundę to dobry pomysł?

Nie wiem. Ale job może pytać bazę co pięć minut albo co godzinę.

Nie ma potrzeby aktualizować w bazie danych żadnej flagi zakończenia aukcji kilka razy na sekundę

Oczywiście, że nie. A ktoś takie coś sugerował?

To są trzy rzeczy:

  1. zakończenie aukcji;
  2. wyświetlenie jej stanu;
  3. wysłanie maili.

I to są rzeczy ZUPEŁNIE od siebie niezależne.

0
somekind napisał(a):

To są trzy rzeczy:

  1. zakończenie aukcji;
  2. wyświetlenie jej stanu;
  3. wysłanie maili.

I to są rzeczy ZUPEŁNIE od siebie niezależne.

Tylko po co w ogóle zakańczać aukcję? Wyświetlanie stanu i wysłanie maili w zupełności wystarczają
Od strony bazy i raportów aukcje trwają po prostu w jakimś przedziale od-do. Od strony użytkownika wygląda jakby były zakańczane z dokładnością zegarka atomowego

0
Krzywy Orzeł napisał(a):

Tylko po co w ogóle zakańczać aukcję? Wyświetlanie stanu i wysłanie maili w zupełności wystarczają

A co jeśli prezes zażyczy sobie raportu z liczbą zamkniętych aukcji? Dodasz w raporcie kolejną logikę decydującą o tym, czy aukcja jest zamknięta? A potem jeszcze jedną, bo okaże się, że jeszcze inny job będzie wystawiał faktury za aukcje, a potem kolejną bo coś?

Zakończenie aukcji to fakt biznesowy, a cała reszta to otoczka, która nie powinna o niczym decydować, ani nic od niej nie powinno zależeć. Nie wpycha się logiki biznesowej do prezentacji czy infrastruktury, bo to raczej się źle kończy, i nie wygląda zbyt profesjonalnie. A dwa miejsca decydujące o tym, czy aukcja jest zakończona czy nie, zawsze będą gorsze od jednego.

Ja bym poszedł w kierunku joba, który co 15 minut odczytuje aukcje kończące się w ciągu najbliższych 20 minut (czasy oczywiście przykładowe), trzyma je posortowane w jakiejś kolejce, i co sekundę (czy nawet częściej) zamyka odpowiednie (nie musi nawet tego zapisywać w bazie od razu). Prezentacja może czytać dane z tej kolejki, niekoniecznie z bazy. A robot wysyłający maile wystarczy, że będzie reagował na zdarzenie zakończenia aukcji, albo po prostu w niezależnym jobie będzie wybierał z bazy aukcje o statusie zakończonym.

0
somekind napisał(a):

Zakończenie aukcji to fakt biznesowy, a cała reszta to otoczka, która nie powinna o niczym decydować, ani nic od niej nie powinno zależeć. Nie wpycha się logiki biznesowej do prezentacji czy infrastruktury, bo to raczej się źle kończy, i nie wygląda zbyt profesjonalnie. A dwa miejsca decydujące o tym, czy aukcja jest zakończona czy nie, zawsze będą gorsze od jednego.

Ja bym poszedł w kierunku joba, który co 15 minut odczytuje aukcje kończące się w ciągu najbliższych 20 minut (czasy oczywiście przykładowe), trzyma je posortowane w jakiejś kolejce, i co sekundę (czy nawet częściej) zamyka odpowiednie (nie musi nawet tego zapisywać w bazie od razu). Prezentacja może czytać dane z tej kolejki, niekoniecznie z bazy. A robot wysyłający maile wystarczy, że będzie reagował na zdarzenie zakończenia aukcji, albo po prostu w niezależnym jobie będzie wybierał z bazy aukcje o statusie zakończonym.

Dla mnie to całkowity bezsens
To że zakończone aukcje to te które się skończyły to chyba logiczne (jest po czasie zakończenia) - dla mnie sprawdzanie w dwóch miejscach czy Zakonczone = 1 jest identyczne z Data_zakonczenia < teraz i nie wprowadza tu nigdzie logiki do dwóch miejsc

Za to Twoje podejście wprowadza kilka dodatkowych problemów o których mogę pomyśleć:

  1. W zależności od popularności serwisu będzie trzeba update'ować setki rekordów każdej sekundy - nie jest to może duży narzut pracy ale całkowicie zbędny; w połączeniu z triggerami które mogą się później pojawić na bazie (na przykład w ramach szybkiego rozwiązania czegoś) może zamulić bazę danych
  2. Jeżeli job będzie sprawdzał zamknięcie aukcji co 15 minut to w ciągu tych 15 minut wszystkie wygenerowane raporty będą przekłamane - nie będą brały pod uwagę wszystkich zakończonych już aukcji
  3. Przypuśćmy że mamy awarię w serwisie i chcemy przedłużyć aukcje kończące się w czasie gdy serwis był niedostępny (tak jak to robi allegro) - w tym przypadku oprócz przedłużenia czasu końca aukcji, musimy pamiętać o tym żeby aukcję "otworzyć" - czyli logikę otwierania / zamykania aukcji niepotrzebnie komplikujemy i logika dotycząca tego musi być w kilku różnych miejscach

Czas zakończenia jednoznacznie definiuje czy aukcja jest zakończona - kopiowanie tej informacji do innej kolumny to zwyczajna redundancja danych

Jeżeli tak komuś zależy to może sobie stworzyć widok na bazie który dołoży kolumnę zakończenia aukcji w zależności od daty zakończenia

0

A dwa miejsca decydujące o tym, czy aukcja jest zakończona czy nie, zawsze będą gorsze od jednego.

no ale przecież to Ty sugerujesz stworzenie dwóch miejsc decydujących o tym
Wystarczy data zakończenia, a Ty chcesz żeby to zależało jednocześnie od dwóch kolumn które bardzo łatwo mogą utracić ze sobą spójność

0
Krzywy Orzeł napisał(a):

Dla mnie to całkowity bezsens
To że zakończone aukcje to te które się skończyły to chyba logiczne (jest po czasie zakończenia) - dla mnie sprawdzanie w dwóch miejscach czy Zakonczone = 1 jest identyczne z Data_zakonczenia < teraz i nie wprowadza tu nigdzie logiki do dwóch miejsc

Czyli całkowitym bezsensem jest coś, co sobie dopowiedziałeś do mojego postu? Nigdzie nie pisałem o "zakończone = 1". Pisałem o aukcji z biznesowego punktu widzenia, nie szczegółów przechowywania danych w bazie.

Aukcja jest zależną od czasu maszyną stanów, która może mieć ich wiele - nie tylko trwająca i zakończona. Zakańczanie aukcji w zależności od jej rodzaju (i od tego, czy ktoś w niej brał udział) niesie ze sobą różne następstwa: wyznaczenie zwycięzcy, wysłanie informacji, wystawienie faktur, odblokowanie systemu komentarzy, itd.

  1. W zależności od popularności serwisu będzie trzeba update'ować setki rekordów każdej sekundy - nie jest to może duży narzut pracy ale całkowicie zbędny;

W zależności od popularności serwisu trzeba będzie robić wiele rzeczy każdej sekundy.

w połączeniu z triggerami które mogą się później pojawić na bazie (na przykład w ramach szybkiego rozwiązania czegoś) może zamulić bazę danych

A może jej też nie zamulić. A może też lepiej nie używać triggerów.

  1. Jeżeli job będzie sprawdzał zamknięcie aukcji co 15 minut to w ciągu tych 15 minut wszystkie wygenerowane raporty będą przekłamane - nie będą brały pod uwagę wszystkich zakończonych już aukcji

Nie pisałem nic o generowaniu raportów co 15 minut, pisałem o odczycie zestawu aukcji co 15 minut. Od tej pory wszystkie aukcje znajdujące się w pamięci mogą być z niezłą wydajnością ustawiane jako zakończane w czasie rzeczywistym. Na raporty online ma to efekt natychmiastowy, tak samo jak na system powiadomień, fakturujący, itd., itp.

  1. Przypuśćmy że mamy awarię w serwisie i chcemy przedłużyć aukcje kończące się w czasie gdy serwis był niedostępny (tak jak to robi allegro) - w tym przypadku oprócz przedłużenia czasu końca aukcji, musimy pamiętać o tym żeby aukcję "otworzyć" - czyli logikę otwierania / zamykania aukcji niepotrzebnie komplikujemy i logika dotycząca tego musi być w kilku różnych miejscach

Nie trzeba niczego otwierać, bo nic nie zostało zamknięte, a i logika jest w jednym miejscu - warstwie dostępu do danych o aukcjach.

Czas zakończenia jednoznacznie definiuje czy aukcja jest zakończona - kopiowanie tej informacji do innej kolumny to zwyczajna redundancja danych

Nie zapomnij tylko, że powodów zakończenia aukcji może być wiele.

Krzywy Orzeł napisał(a):

no ale przecież to Ty sugerujesz stworzenie dwóch miejsc decydujących o tym
Wystarczy data zakończenia, a Ty chcesz żeby to zależało jednocześnie od dwóch kolumn które bardzo łatwo mogą utracić ze sobą spójność

Kolumny w bazie to miejsca składowania danych, a nie miejsce decyzyjne. Za to oddzielne decydowanie o stanie aukcji w każdej aplikacji klienckiej korzystającej z systemu aukcyjnego JEST powielaniem logiki.
Utracenie spójności w takim przypadku jest możliwe chyba tylko u ludzi, którzy nie słyszeli o transakcjach.

Nie mówię, że moje rozwiązanie jest idealne. Odnosiłem się jedynie do pomysłu zakończenia aukcji przez wejście na stronę - co jest mieszaniem logiki prezentacji z biznesem i na pewno jest błędne.

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