0

ユニコーンを使用する Sinatra アプリを開発しています。各ワーカーは 1 つのスレッドであり、アプリケーション全体をロードし、データベースを共有するだけです。(間違っていたら訂正してください;))

最初のスレッドは整数を取得し、それを使用して何かを実行してからインクリメントします。2 番目のスレッドは最初のスレッドの整数を取得してはならず (スレッド セーフ)、インクリメントされた整数のみを取得する必要があります。

私はブロッキングでそれを行いましたが、より良いアプローチを見つけたいと思っています。調査中に、これはあまりスケーラブルではないため、問題を解決するための非常に悪い方法であるとよく読んだためです。

私のアプリケーション全体を見たい場合は、気軽にgithubでチェックしてください;)

4

1 に答える 1

2

短縮 URL の英数字 ID を生成しようとしているようです。これが事実なら、あなたが思っているよりもはるかに簡単です

通常の自動インクリメント id 整数フィールドがあるとします。新しいリクエストが来ると、データベースにレコードを作成し、その ID を取得し (これは繰り返されず、他のワーカーは取得しません)、英数字形式に変換して (別の列に) 保存します。

Ruby には、場合によっては変換メソッドも含まれています。

aid = 1746563

s = aid.to_s(36) # => "11fnn"
i = s.to_i(36) # => 1746563

これらの代わりにメソッドを使用できます。

アップデート

あなたは Posgresql を使用していると述べたので、これに最適なツールがあります: Sequences !

別のクライアントが同じ値を取得することを心配することなく、シーケンスを作成し、そこから自動インクリメント番号を取得できます。

于 2012-10-11T13:34:16.523 に答える