Frage

Ich brauche für jede Anforderung ich zu einem bestimmten XML-RPC mache einzigartig, inkrementell, numerische Transaktion-IDs zu generieren. Diese Zahlen müssen nur über meine Domain eindeutig sein, sondern auf mehreren Rechnern erzeugt werden.

Ich möchte wirklich nicht den Überblick über diese Nummer in einer Datenbank zu halten haben, und befassen sich mit Reihe usw. auf jeder einzelnen Transaktion sperren. Ich habe versucht, dies mit einem Mikrozeitstempel zu hacken, aber es gab Kollisionen mit nur wenigen Themen - meine Anwendung Hunderte von Threads zu unterstützen braucht

.

würde Irgendwelche Ideen geschätzt.

Edit: Was ist, wenn jede Transaktions-ID hat nur größer als die vorherige Anforderung der

War es hilfreich?

Lösung

Wenn Sie vorhaben, das von Hunderten von Threads zu verwenden, auf mehreren Rechnern arbeiten und benötigen eine inkrementelle ID, Sie gehen einige zentrale Platz brauchen zu speichern und zu sperren die letzte ID-Nummer generiert. Dies muss nicht unbedingt in einer Datenbank sein, aber das wäre die häufigste Option sein. Ein zentraler Server, der tat nichts anderes als IDs dienen könnte die gleiche Funktionalität bieten, aber das besiegt wahrscheinlich den Zweck diese zu verteilen.

Wenn sie inkrementelle sein muß, jede Form des Zeitstempels wird nicht eindeutig gewährleistet werden.

Wenn Sie diese nicht benötigen inkrementelle zu sein, wäre eine GUID arbeiten. Potenziell tut notwendigerweise würde irgendeine Art von merge des Zeitstempels + eine Hardware-ID auf jedem System könnte eindeutige Kennungen geben, aber der ID-Nummer Teil nicht eindeutig sein.

Könnten Sie verwenden ein Paar von Hardware-IDs + inkrementelle Zeitstempel? Dies würde jede spezifische Maschine IDs inkrementelle machen, aber nicht notwendigerweise über die gesamte Domäne eindeutig sein.

---- EDIT -----

Ich glaube nicht, jede Form von Zeitstempel verwendet wird für Sie arbeiten, aus 2 Gründen.

Zunächst werden Sie nie in der Lage sein, zu garantieren, dass zwei Threads auf verschiedene Maschinen versuchen nicht exakt zur gleichen Zeit zu planen, egal welche Auflösung von Timer Sie verwenden. Bei einer ausreichend hohen Auflösung, wäre es unwahrscheinlich, aber nicht garantiert.

Zweitens, diese Arbeit zu machen, auch wenn Sie das Kollision Problem oben lösen könnte, dann würden Sie jedes System bekommen müssen genau mit mikrosekundengenau den gleichen Takt zu haben, die nicht wirklich praktisch ist.

Andere Tipps

Dies ist ein sehr schwieriges Problem, vor allem, wenn Sie nicht wollen, eine Performance-Engpass erstellen. Sie sagen, dass die IDs ‚inkrementelle‘ und ‚numerisch‘ sein müssen - ist, dass ein konkretes Geschäft Zwang, oder eine, die für einen anderen Zweck existiert

?

Wenn diese nicht erforderlich sind, können Sie verwenden UUIDs, die die meisten gängigen Plattformen haben Bibliotheken. Sie ermöglichen es, in sehr kurzen Zeitspannen viele (Millionen!) Von IDs zu erzeugen und ohne Kollisionen ganz bequem sein. Der entsprechende Artikel auf Wikipedia behauptet:

  

Mit anderen Worten, nur nach dem Generieren   1 Milliarde UUIDs für die jede Sekunde   nächsten 100 Jahre, die Wahrscheinlichkeit,   nur ein Duplikat zu schaffen wäre   etwa 50%.

Wenn Sie 'inkrementelle' von Ihren Anforderungen entfernen, könnten Sie eine GUID .

Ich sehe nicht, wie Sie inkrementelle über mehrere Prozesse ohne irgendeine Art von gemeinsamen Daten umsetzen können.

Wenn Sie eine Windows-Plattform Ziel, haben Sie versucht, Verschlungene API ?

Google für GUID-Generatoren für welche Sprache Sie suchen, und dann umwandeln in eine Zahl, dass, wenn Sie es wirklich numerisch sein müssen. Es ist aber nicht inkrementell.

Oder haben jeden Thread „Reserve“ tausend (oder Millionen oder Milliarden) Transaktions-IDs und gibt sie ein zu einer Zeit heraus, und „Reserve“ das nächste Bündel, wenn es zu Ende geht. Immer noch nicht wirklich inkrementell.

ich mit der GUID Masse bin, aber wenn das nicht möglich ist, könnte man erwägen, mit db4o oder SQL Lite über einen schwergewichtigen Datenbank?

Wenn jeder Kunde den Überblick über seine eigene „nächste id“ halten kann, dann könnte man zu einem sentral Server sprechen und eine Reihe von ids bekommen, vielleicht ein 1000 zu einem Zeitpunkt. Sobald ein Client aus ids läuft, wird es wieder an den Server sprechen.

Dies würde das System eine zentrale Quelle von ids hat, und noch vermeiden für jede ID in die Datenbank sprechen zu müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top