fortlaufende Nummernbänder von einer Stelle aus vergeben

GustlPC

Lt. Junior Grade
Registriert
Nov. 2008
Beiträge
343
Hallo zusammen,

ich habe folgendes Problem:

Im Sekundentakt, bzw. ms Takt werden von verschiedenen Stellen über WebServices freie Seriennummern- oder MAC Adressen Bänder geordert. Der Webservice schaut in einer Tabelle, wo 3Mio. freie MAC Adressen drin stehen, reserviert die gewünschte Anzahl und gibt sie zurück.

Das funktioniert auch grundsätzlich, wenn nicht viele gleichzeitig reservieren wollen. Und genau da ist mein Problem.
Wenn viele Anfragen kommen, kann es sein, dass der Webservice (15 sekunden) in den Timeout geht. Der Timeout ist leider fix und den kann ich auch nicht ändern.

Ich brauche also genau eine Stelle, die freie MAC Adressen vielleicht schon vorhält und diese sehr schnell dann für reserviert und zurückgibt.

Mich würde interessieren wie ihr solch ein Problem lösen würdet?

Viele Grüße
 
GustlPC schrieb:
Mich würde interessieren wie ihr solch ein Problem lösen würdet?
Grundsätzlich: Mit einem Debugger.

In deinem Fall: Finde die Stelle im Code, die bei hoher Last den ganzen Verkehr aufhält und optimiere sie. Das geht (ganz billig, aber meist ausreichend) indem man in jeder relevanten Methode 2 Timestamps erstellt und sie sich auf der Konsole ausgeben lässt. Alternativ gibt's auch diverse Frameworks für solche Zwecke.

Möglicherweise gehen der Kiste auch die Threads aus bei den ganzen Anfragen. Wer weiß.
 
Zuletzt bearbeitet:
Wie lange dauert die Datenbankabfrage? bzw. die Abfragen.

Da du nicht mehr geschrieben hast, erscheint mir die Datenbank aktuell als Naheliegenstes Problem.
Entweder durch eine zu komplexe/grosse SQL abfrage, oder durch viele kleine SQL abfragen.
 
Klingt nach Deadlocks beim Versuch, die zu reservieren, sprich in die Datenbank zu schreiben.

  • Welches DBMS?
  • Stell sicher, daß die (gesamte) Reservierung in einer Transaktion ausgeführt wird.
  • Und dann schau nach, ob das DBMS noch hinterherkommt (Systemauslastung einerseits und DBMS-statistik andererseits).
 
Evtl. würde ich auch eine gewisse Menge an freien Macs im Block aus der Datenback holen und im Speicher halten und dann von dort vergeben. Wenn die aufgebraucht oder gerade nix zu tun ist zurückschreiben und neue holen.
Durchschnittliche Bandgröße x 100 oder so.

Du hast natürlich ein Problem, wenn der Service mal abschmieren sollte. Evtl. die abgeholten Datensätze schonmal flaggen oder so.

Das ist natürlich ins blaue geschossen. Erstmal analysisieren wo der Engpass liegt macht natürlich am meisten Sinn.
 
Ohne detaillierte Beschreibung wo die 15 Sekunden genau vertrödelt werden ist es schwer.
Die einzige Operation die hier länger dauern könnte ist die Tabellenabfrage. Ich gehe davon aus dass es sich um eine relationale DBMS handelt.
Damit geht das ganze in einer Transaktion. Sollte es so sein dass eine einzelne Abfrage so lange dauert ist die DB zu lahm. Dann DB optimieren.
Entweder dann exklusiv nur ein Thread darf welche holen oder machen im Service Flaggen und später als vergeben markieren
 
Zurück
Oben