私は一緒に結婚する必要がある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
ありがとうございました!