eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › wielodostęp
Ilość wypowiedzi w tym wątku: 6

  • 1. Data: 2010-04-10 10:11:24
    Temat: wielodostęp
    Od: Misiek NA <p...@g...com>

    Mam aplikację która rejestruje zdarzenia. Tabela w której są
    przechowywane informacje posiada trzy kolumny:
    data (format YYYY-MM-DD), typ zdarzenia oraz liczba wystąpień.
    Zdarzenia zgłaszane są przez zewnętrzne procesy.
    Dwa procesy mogą zgłosić ten sam typ zdarzenia.
    Obecnie jest to robione tak, że aplikacja robi select sprawdzając czy
    dane zdarzenie wystąpiło bieżącego dnia. Jeśli wystąpiło, zwiększa
    liczbę wystąpień, jeśli nie, dodaje nowy rekord do tabeli.

    Wydaje mi się, że to rozwiązanie posiada pewną wadę.
    Według mnie, w sytuacji gdy pewien typ zdarzenia nie został jeszcze
    zarejestrowany bieżącego dnia a dwa procesy zgłoszą to zdarzenie
    jednocześnie w tabeli pojawią się dwa wpisy dla jednego typu
    zdarzenia.

    Jak zabezpieczyć się przed tą sytuacją?
    Aplikacja napisana jest w PHP. Baza danych to postgresql.


    Pozdrawiam


  • 2. Data: 2010-04-10 10:48:43
    Temat: Re: wielodostęp
    Od: Wojciech Muła <w...@p...null.onet.pl.invalid>

    Misiek NA <p...@g...com> wrote:

    > Mam aplikację która rejestruje zdarzenia. Tabela w której są
    > przechowywane informacje posiada trzy kolumny:
    > data (format YYYY-MM-DD), typ zdarzenia oraz liczba wystąpień.
    > Zdarzenia zgłaszane są przez zewnętrzne procesy.
    > Dwa procesy mogą zgłosić ten sam typ zdarzenia.
    > Obecnie jest to robione tak, że aplikacja robi select sprawdzając czy
    > dane zdarzenie wystąpiło bieżącego dnia. Jeśli wystąpiło, zwiększa
    > liczbę wystąpień, jeśli nie, dodaje nowy rekord do tabeli.
    >
    > Wydaje mi się, że to rozwiązanie posiada pewną wadę.
    > Według mnie, w sytuacji gdy pewien typ zdarzenia nie został jeszcze
    > zarejestrowany bieżącego dnia a dwa procesy zgłoszą to zdarzenie
    > jednocześnie w tabeli pojawią się dwa wpisy dla jednego typu
    > zdarzenia.
    >
    > Jak zabezpieczyć się przed tą sytuacją?
    > Aplikacja napisana jest w PHP. Baza danych to postgresql.

    Najprościej opakować dostęp do tabeli transkacją. Albo dodawaj
    do tabelki tylko datę i typ, a jakimś widokiem obliczaj ilości.
    W sumie wszystko zależy od tego, jak często są zgłaszane zdarzenia
    i jak często potrzebujesz te informacje odczytać.

    w.


  • 3. Data: 2010-04-10 20:49:12
    Temat: Re: wielodostęp
    Od: Maciej Sobczak <s...@g...com>

    On 10 Kwi, 12:11, Misiek NA <p...@g...com> wrote:

    > Wydaje mi się, że to rozwiązanie posiada pewną wadę.
    > Według mnie, w sytuacji gdy pewien typ zdarzenia nie został jeszcze
    > zarejestrowany bieżącego dnia a dwa procesy zgłoszą to zdarzenie
    > jednocześnie w tabeli pojawią się dwa wpisy dla jednego typu
    > zdarzenia.
    >
    > Jak zabezpieczyć się przed tą sytuacją?

    A dlaczego chcesz się przed nią zabezpieczać?
    Może właśnie najprościej byłoby wrzucać do bazy wszystkie zdarzenia a
    fakt że jest ich w bazie N oznacza, że... że było ich N?
    Przy takim rozwiązaniu samo wrzucanie jest już proste i bezpiecznie,
    bo jest to jeden zwykły insert. Z punktu widzenia wielodostępu jest to
    najlepsze co można zrobić.

    Pytanie podstawowe: ile może być zdarzeń tego samego typu w ciągu
    dnia?
    Pytanie pomocnicze: jaki *problem* chcesz rozwiązać "kompresując" je z
    użyciem licznika?

    --
    Maciej Sobczak * http://www.inspirel.com

    YAMI4 - Messaging Solution for Distributed Systems
    http://www.inspirel.com/yami4


  • 4. Data: 2010-04-10 23:00:12
    Temat: Re: wielodostęp
    Od: Misiek NA <p...@g...com>

    On 10 Kwi, 22:49, Maciej Sobczak <s...@g...com> wrote:
    > > Jak zabezpieczyć się przed tą sytuacją?
    >
    > A dlaczego chcesz się przed nią zabezpieczać?
    > Może właśnie najprościej byłoby wrzucać do bazy wszystkie zdarzenia a
    > fakt że jest ich w bazie N oznacza, że... że było ich N?
    > Przy takim rozwiązaniu samo wrzucanie jest już proste i bezpiecznie,
    > bo jest to jeden zwykły insert. Z punktu widzenia wielodostępu jest to
    > najlepsze co można zrobić.
    >
    > Pytanie podstawowe: ile może być zdarzeń tego samego typu w ciągu
    > dnia?
    > Pytanie pomocnicze: jaki *problem* chcesz rozwiązać "kompresując" je z
    > użyciem licznika?
    >

    Problem polega na tym, że ta aplikacją jest już częścią pewnego
    systemu. Zmiana tej części systemu wymusiłaby zmianę pozostałych
    części.
    Niestety obawiam się, że to mogłaby się skończyć co najmniej źle:/
    Gdybym miał pisać tą aplikację samodzielnie od podstaw, to zrobiłbym
    tak jak zaproponowałeś.

    Zdarzeń takich może być około 10k - 50k na dzień, przy czym mogą
    pojawiać się one w partiach po 1k - 5k z częstotliwością do 3 na
    sekundę.


  • 5. Data: 2010-04-11 00:08:04
    Temat: Re: wielodostęp
    Od: Michoo <m...@v...pl>

    Misiek NA pisze:
    > Mam aplikację która rejestruje zdarzenia. Tabela w której są
    > przechowywane informacje posiada trzy kolumny:
    > data (format YYYY-MM-DD), typ zdarzenia oraz liczba wystąpień.
    > Zdarzenia zgłaszane są przez zewnętrzne procesy.
    > Dwa procesy mogą zgłosić ten sam typ zdarzenia.
    > Obecnie jest to robione tak, że aplikacja robi select sprawdzając czy
    > dane zdarzenie wystąpiło bieżącego dnia. Jeśli wystąpiło, zwiększa
    > liczbę wystąpień, jeśli nie, dodaje nowy rekord do tabeli.
    >
    > Wydaje mi się, że to rozwiązanie posiada pewną wadę.
    > Według mnie, w sytuacji gdy pewien typ zdarzenia nie został jeszcze
    > zarejestrowany bieżącego dnia a dwa procesy zgłoszą to zdarzenie
    > jednocześnie w tabeli pojawią się dwa wpisy dla jednego typu
    > zdarzenia.
    >
    > Jak zabezpieczyć się przed tą sytuacją?
    Jak nie chcesz kombinować z transakcjami (co zazwyczaj jest poprawnym
    rozwiązaniem) to:
    klucz podstawowy/uniq na parze (data,typ)
    sprawdzasz czy wpis istnieje
    A) tak - robisz update, który zapewni blokadę na poziomie wiersza
    B) nie - wstawiasz:
    B)a) udało się - było to pierwsze wstawienie
    B)b) nie udało się z powodu naruszenia ograniczeń uniq - rekord już
    istnieje - idź do A)

    Ewentualnie, jeżeli zbiór typów zdarzeń jest dość skończony to
    generujesz wpisy z wartością 0 na najbliższy miesiąc a potem tylko z
    update lecisz.

    --
    Pozdrawiam
    Michoo


  • 6. Data: 2010-04-11 20:01:46
    Temat: Re: wielodostęp
    Od: Maciej Sobczak <s...@g...com>

    On 11 Kwi, 01:00, Misiek NA <p...@g...com> wrote:

    > Problem polega na tym, że ta aplikacją jest już częścią pewnego
    > systemu. Zmiana tej części systemu wymusiłaby zmianę pozostałych
    > części.

    Odpowiednio ułożone widoki mogą tu pomóc, jeśli te inne kawałki
    systemu tylko czytają tą część bazy.

    Możesz podzielić bazę na część bieżącą i archiwalną. Bieżąca to np.
    dzisiejszy dzień i tam robisz szybkie wpisy przez zwykły insert, być
    może wielokrotnie zduplikowane. Archiwalna to przeliczone już (tzn.
    policzone) okresowo wpisy z tabeli bieżącej. Na to wszystko widok o
    odpowiedniej nazwie, gdzie jest unia części archiwalnej i bieżącej
    (też przezliczonej).

    W ten sposób możesz mieć pewną przestrzeń roboczą w bazie na szybkie i
    niekonfliktowe wstawianie nowych danych - a dla pozostałej części
    systemu widok pokazujący wpisy z liczbą wystąpień.

    > Zdarzeń takich może być około 10k - 50k na dzień, przy czym mogą
    > pojawiać się one w partiach po 1k - 5k z częstotliwością do 3 na
    > sekundę.

    A muszą być w bazie natychmiast? Czy jest możliwe, aby system je
    zliczał przed wpisaniem do bazy? Sztuczne opóźnienie może być dowolne,
    od kilku sekund do całego dnia.
    W ten sposób można zmniejszyć częstotliwość odwołań do bazy - a przez
    to też ryzyko konfliktów w wielodostępie. Oczywiście nadal trzeba te
    potencjalne konflikty obsłużyć, ale ich realny wpływ na działanie
    systemu będzie mniejszy albo żaden.

    --
    Maciej Sobczak * http://www.inspirel.com

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: