2016-07-01 3 views
0

私は一緒に結婚する必要がある2つの異なるデータソースを持っています。データセットAには、1対多数の関係でデータセットBのbar_key属性にマップできるfoo_key属性があります。Memcachedレースの条件を扱う

[{ foo_key: 12345, other: 'blahblah' }, ...]

データセットB:

データセット

データは、Aは、SQSキューから来ているとデータセットBとの任意の関係は、として利用できるようになります設定

[{ bar_key: 12345, other: '' }, { bar_key: 12345, other: '' }, { bar_key: 12345, other: '' }, ...]

私はAを投票します。

データセットBは、私がmemcachedにダンプしようとしている別のSQSキューから来ています

元々私はmemcachedキーをデータセットBのオブジェクトからbar_keyに設定することを計画していましたが、それを実行すればそれが実現することに気づきました同じbar_key値がたくさんある可能性があるため、値を上書きすることは可能です。それから私はよくbar_keyというキーを作成することができ、値はSQSメッセージの配列であると考えていました。しかし、私は複数のホストがSQSキューをポーリングしているので、キーがmemcachedにあるかどうかをチェックして確認し、チェックし、新しいメッセージを追加してから、別のホストが同じ操作をプリフォームしようとするため、最初のホストが値を追加しようとすると上書きされます。

私はmemcachedキーロックを見回しましたが、私はそれを完全に理解しているかどうかはわかりません。私がキーと値のペアをmemcachedから取得すると、bar_key_dummyという新しいキーに一時的なダミーロックが作成され、x秒で有効期限が切れます。bar_key_dummyロックがアクティブなキーをフェッチしようとすると、 SQSメッセージを削除せずにキューに戻して、x秒後に再試行しますか?

ここに私が頭の中で何をしているのかについての擬似コードがあります。これは意味をなさないでしょうか?

store = MemCache.new(host) 

sqs_messages.poll do |message| 
    dummy_key = "#{message.bar_key}_dummy" 
    sqs.dont_delete_message && next unless store.get(dummy_key).nil? 
    # set dummy_key in memcache with a value of 1 for 3 seconds 
    store.set(dummy_key, 1, 3) 
    temp_data = store.get(message.bar_key) || [] 
    temp_data << message 
    store.set(message.bar_key, temp_data, 300) 
    # delete dummy key when done in case shorter than x seconds 
    store.delete(dummy_key) 
end 

ありがとうございました!

答えて

0

Memcachedには特別な操作があります - cas比較とスワップ。

コマンドgetsは、固有のCAS値と共にItemを返します。 データセットを検索することができ、元の一意のCAS値を取るcasコマンドで更新を発行する必要があります。

CASが2つのコマンドの間で変更された場合、更新操作はEXISTSエラーで失敗します。

関連する問題