Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Reihenfolge und (Un)Abhängigkeit von Events

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Reihenfolge und (Un)Abhängigkeit von Events

    Hallo,

    ich habe auf einer Website Events die sekundengenau berechnet werden. Soweit kein Problem. Dies geschieht indem vor jedem Seitenaufruf in der Datenbank geschaut wird ob Events anstehen und diese dann ggf. rückwirkend berechnet werden. Dass Events nicht 2x berechnet werden stelle ich sicher, indem ich in der Zeile des Events einen Status update und nur wenn mir PHP gesagt hat dass der Status sich geändert hat die Berechnung / das Event ausführe.
    Jetzt das Problem: wie kann ich sicherstellen, bzw kann ich sicherstellen dass die Events halbwegs in der richtigen Reihenfolge ausgeführt werden. Weil ich frage mich was passieren würde wenn Event Nr 23 von Browser A angestossen wird und kurze zeit später von Browser B Event Nr 24 angestossen wird, welches vor NR 23 fertig wäre. Dann hätte ich das Problem, dass Event Nr 24 noch nichts von den Änderungen des Events 23 gehört hat und es so zu inkonsistenzen kommen könnte.

    Mir fällt dafür keine sinvolle Lösung ein, ausser Abhängigkeiten für Events zu definieren, was jedoch bei sehr vielen Events performancetechnisch vermutlich nicht tragbar wäre.

    Andere Ideen? Eine Frage an alle die sich durch den Text gequält haben
    "Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais


  • #2
    Knappe Antwort: gar nicht. Das funktioniert alleine deswegen nicht, weil sich die Events, selbst wenn sie korrekt ankommen untereinander überholen können. Was machen die denn inhaltlich, welche Abhängigkeiten bilden sie zueinander? kannst du dafür sorgen, dass eventv24 weiss dass es von 23 abhängt, dass aber meinetwegen Event 22 egal ist? Dann bräuchtest nur ein kennzeichen wann 23 fertig ist und das dann prüfen. Schön ist aber eher ein externer Event Server
    www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
    Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih

    Kommentar


    • #3
      Wie gesagt, es ginge die Abhängigkeiten vorher zu definieren, aber das könnten durchaus Ketten von hundert Events werden die Verknüpft werden. Damit halte ich das Performancetechnisch nicht tragbar, ich will nicht bei jedem Event noch X Queries brauchen um die Abhängigkeiten zu definieren.
      "Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais

      Kommentar


      • #4
        Entweder so oder ein externer Mechanismus, der als Event Server fungiert (meinetwegen per Cron). Mit all den Problemen dazu (Cron nur minütlich usw.) Das über die Aufrufe der Clients, die konkurrierend stattfinden können, die sich überholen können, abzubilden ist unmöglich, ums mal deutlich zu sagen. Du kannst lediglich das Event 24 blockieren bis 23 fertig ist. Das wars dann aber auch.
        www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
        Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih

        Kommentar


        • #5
          Ein externer Event-Server wäre natürlich die Lösung der Probleme. Das Problem des Eventservers ist aber schon im Namen drin: Ich hb keinen Server, da ich mir unsicher war ob ich ihn absichern könnte. Ich hab nur Webspace. Und nur mit Webspace etwas permanent laufendes zu produzieren ist schwierig.
          "Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais

          Kommentar


          • #6
            Nochmal: Es ist schlichtweg unmöglich. Sowas sollte man gar nicht erst probieren. Zumindest wenn die Möglichkeit, alle Folgeevents zu blockieren, nicht in Frage kommt. Du musst aus Parallel Zugriffen, die noch dazu zufällig passieren können, eine sequentielle Verarbeitung bauen. Und das geht nicht, wenn du weder die Abhängigkeiten definieren willst noch eine pauschale Blockade in Frage kommt.
            www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
            Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih

            Kommentar


            • #7
              möglicherweise mach ich es mir jetzt zu einfach - aber reicht es nicht zum Zeitpunkt X -> wo ein Request vom Browser kommt, alle Events abzufragen, ob sie vor Zeitpunkt X begonnen haben und NOCH NICHT beendet sind -> dass sind dann eben Event 23 und Event 24, unabhängig von einander, keine Abhängigkeiten außer die Anfangszeit ... mithin genau was du möchtest - damit musst du dir nicht mal "merken" , ob ein Event schon angezeigt wird ... nur deine Berechnungen musst du dann von der Event-Anzeige entkoppeln .. sonst würdest du die ja bei jedem Request innerhalb der Dauer eines Events machen und damit öfter ...
              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

              Kommentar


              • #8
                @eagle
                wenn ich deinen Post richtig verstehe gehst du davon aus, dass Event 23 und 24 unabhängig sind. Dem ist aber nicht so, Event 24 soll erst stattfinden wenn die Änderungen v Event 23 in der DB sind.

                Edit: Wie wahrscheinlich dürften solche überlappenden Ereignisse überhaupt sein? Wenn man von kurzen, millisekunden lang dauernden Berechnungen und von tausenden Events pro Tag ausgeht? Ich weiss dass man darauf nicht mit 0,042 % antworten kann, aber mich interessiert eher sowas wie passiert stündlich/täglich/wöchentlich/ du kannst froh sein wenn ud es einaml erlebst
                "Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais

                Kommentar


                • #9
                  Race Conditions sind nicht so selten wie du vlt. denkst. Und wenn sie einmal vorkommen sind deine Daten nicht mehr konsistent und dann hast du möglicherweise ein Problem. Und 0.042% (nur als Beispiel) ist wirklich nicht viel, da brauchst du nur 2500 Events am Tag und schon hast du inkonsistente Daten.

                  Kommentar


                  • #10
                    Zitat von Quu Beitrag anzeigen
                    Jetzt das Problem: wie kann ich sicherstellen, bzw kann ich sicherstellen dass die Events halbwegs in der richtigen Reihenfolge ausgeführt werden.
                    Diese Aussage widerspricht dem Eventgedanken (asynchron). Ein Ereignis tritt ein, wenn es eintritt, nur die Abarbeitung der Ereignisse kann man in eine Reihenfolge bringen.

                    Zitat von Quu Beitrag anzeigen
                    Weil ich frage mich was passieren würde wenn Event Nr 23 von Browser A angestossen wird und kurze zeit später von Browser B Event Nr 24 angestossen wird, welches vor NR 23 fertig wäre. Dann hätte ich das Problem, dass Event Nr 24 noch nichts von den Änderungen des Events 23 gehört hat und es so zu inkonsistenzen kommen könnte.
                    Die Inkonsistenz kommt erst, wenn du (dein Serverprogramm) falsch reagiert. Der beschriebene Fall ist erstmal nur ein Konflikt, der behandelt werden muss. Dein gewünschter "Eventserver" wäre der Schiedsrichter, der dann entscheiden muss, ob ein Konflikt vorliegt und wie er gelöst wird. Er kann sie nicht verhindern, er kann nur Sorge tragen, das eine Lösungsstrategie angewendet wird.

                    Vergleichbar:
                    http://de.wikipedia.org/wiki/Scheduler_%28Datenbank%29

                    Dem ist aber nicht so, Event 24 soll erst stattfinden wenn die Änderungen v Event 23 in der DB sind.
                    Und wenn Event 23 nie eintritt?
                    Nochmal: du kannst Events nicht auf diese Weise steuern, oder Erwartungen stellen ala "Event 24 soll erst stattfinden, wenn ...". Ereignisse passieren wann sie wollen (meist ausgelöst durch Benutzeraktionen).
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Wenn du mit Event24 auf Werte zugreifst, die von Event23 noch geändert werden, dann musst du mit Event23 den Zugriff sperren und Event24 muss solange warten. Allerdings brauchst du etwas um zu verhindern, dass deine Tabelle bzw. dein Datensatz ewig gesperrt bleibt wenn Event23 abstürtzt

                      Kommentar


                      • #12
                        Zitat von lstegelitz Beitrag anzeigen
                        oder Erwartungen stellen ala "Event 24 soll erst stattfinden, wenn ...".
                        doch - nennt sich "Event23IstBeendetEvent"

                        Ereignisse passieren wann sie wollen
                        nein - Events haben immer einen genau definierten Grund um zu feuern

                        meist ausgelöst durch Benutzeraktionen
                        damit haben wir schonmal einen Grund ... allerdings muss bei der Benutzeraktion überprüft werden ob der Benutzer diese Aktion hätte überhaupt machen können - wenn nicht, darf das Event nicht gefeuert werden ... wenn ja, dann haben wir den genau definierten Grund zum feuern

                        ansonsten ist der Konstrukt rein über PHP und Webbrowser für Events nicht wirklich Vertrauenserweckend ... dann eher einen eigenen Server und im Hintergrund die Events seperat abarbeiten (Java/PHP/Nativ/$WhatEver)

                        Kommentar


                        • #13
                          Schon klar, das Ereignisse nicht auf Bäumen wachsen. Mit "passieren wann sie wollen" wollte ich lediglich den GRUND verschleiern - der ist eigentlich erstmal unwichtig, das Ereignis an sich zählt. Wie in der Realität - das Ereignis "Erdbebeben" ist das, worum es geht... nicht der Grund (Erdplattenverschiebung)
                          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                          Kommentar


                          • #14
                            Zitat von lstegelitz Beitrag anzeigen
                            Und wenn Event 23 nie eintritt?
                            Nochmal: du kannst Events nicht auf diese Weise steuern, oder Erwartungen stellen ala "Event 24 soll erst stattfinden, wenn ...". Ereignisse passieren wann sie wollen (meist ausgelöst durch Benutzeraktionen).
                            Die Events die ich meine, stehen in der DB als Eintrag mit einer Zeit wann sie ausgeführt werden sollen, d.h. sie passieren nicht direkt wann sie wollen. Es wird halt bei jedem Seitenaufruf geschaut ob nochwas gemacht werden muss. Dann kann man schon sagen dess Event 24 erst nach Abarbeitung von Event 23 eintreten soll, vorausgesetzt die liegen zeitlich hintereinander, wovon ich ausgehe.

                            Ich dachte ich hätte das verständlich beschrieben

                            Edit: Also ist im Endeffekt das Ergebnis, dass die zeitlich korrekte Abarbeitung nicht sichergestellt werden kann.
                            "Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais

                            Kommentar


                            • #15
                              Die kann nur sichergestellt werden, wenn du alle Folgeevents hart blockierst, wenn event 23 abgearbeitet wird. Und erst ausführst, wenn 23 fertig ist... Wie schon ganz am Anfang von mir gesagt
                              www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
                              Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih

                              Kommentar

                              Lädt...
                              X