質問
特定のXML RPCに対して行うリクエストごとに、一意の増分の数値トランザクションIDを生成する必要があります。これらの番号はドメイン全体で一意である必要がありますが、複数のマシンで生成されます。
データベースでこの数値を追跡し、すべてのトランザクションで行ロックなどを処理する必要はありません。マイクロ秒のタイムスタンプを使用してこれをハッキングしようとしましたが、ほんの数スレッドで衝突が発生しました。アプリケーションは数百のスレッドをサポートする必要があります。
どんなアイデアでも歓迎されます。
編集:各トランザクションIDが前のリクエストのIDよりも大きくなければならない場合はどうなりますか?
解決
数百のスレッドからこれを使用し、複数のマシンで作業し、増分IDが必要な場合、最後に生成されたID番号を保存およびロックするための集中管理場所が必要になります。これは必ずしもデータベースにある必要はありませんが、最も一般的なオプションです。 IDを提供するだけの中央サーバーでも同じ機能を提供できますが、おそらくこれを配布する目的に反します。
インクリメンタルにする必要がある場合、どのような形式のタイムスタンプも一意であるとは限りません。
これらをインクリメンタルにする必要がない場合は、GUIDが機能します。各システムでタイムスタンプ+ハードウェアIDの何らかのタイプのマージを行うと、一意の識別子が得られる可能性がありますが、ID番号の部分は必ずしも一意ではありません。
ハードウェアIDと増分タイムスタンプのペアを使用できますか?これにより、特定の各マシンのIDがインクリメンタルになりますが、ドメイン全体で一意であるとは限りません。
----編集-----
タイムスタンプの形式を使用しても、2つの理由で機能するとは思わない。
まず、使用するタイマーの解像度に関係なく、異なるマシンの2つのスレッドがまったく同時にスケジュールを設定しないことを保証することはできません。十分に高い解像度では、可能性は低くなりますが、保証されません。
次に、この問題を解決するには、上記の衝突の問題を解決できたとしても、すべてのシステムにマイクロ秒の精度で正確に同じクロックを持たせる必要がありますが、これは実際的ではありません。
他のヒント
これは、特にパフォーマンスのボトルネックを作りたくない場合、非常に難しい問題です。 IDは「増分」と「数値」である必要があると言いますが、それは具体的なビジネス上の制約ですか、それとも他の目的のために存在する制約ですか?
これらが必要でない場合、UUIDを使用できます。UUIDは、ほとんどのプラットフォームにライブラリがあります。非常に短い時間で多くの(数百万!)IDを生成でき、衝突することなく非常に快適です。ウィキペディアの主張に関する関連記事:
つまり、生成後のみ 毎秒10億UUID 次の100年、 複製を1つだけ作成すると 約50%。
要件から「増分」を削除する場合、 GUID を使用できます。
何らかの一般的なデータなしで、複数のプロセスにインクリメンタルを実装する方法がわかりません。
Windowsプラットフォームをターゲットにしている場合、を試しましたかインターロックされたAPI ?
GoogleのGUIDジェネレーター、および本当に数値にする必要がある場合は、数値に変換します。ただし、インクリメンタルではありません。
または各スレッドを「予約」する千(または百万、十億)のトランザクションIDを1つずつ配布し、「予約」します。次の束がなくなると。まだインクリメンタルではありません。
各クライアントが独自の「次のID」を追跡できる場合は、Sentralサーバーと通信し、IDの範囲(おそらく一度に1000)を取得できます。クライアントがIDを使い果たすと、サーバーと再度通信する必要があります。
これにより、システムにIDの中央ソースが設定され、IDごとにデータベースと通信する必要がなくなります。