2012-03-30 4 views
1

私は4つの "スレーブ"と共に "マスター"サーバを稼働させています。各リクエストに応じてレールからデータベースからユニークなアイテムを提供する方法

マスターは、レールアプリケーションサーバーを実行するhttpで、スレーブはスクリプトを実行するec2インスタンスです。

スレーブはマスターにhttp要求を送信します。この要求に対して、マスターはデータベース内の項目のjsonクエリで応答します。 要求が提供される前に、マスタは、項目が再び配信されないように、-sent-というフィールドを "TRUE"に設定することになっています。

ステップ:

  • リクエストを受信します。
  • データベースから項目を検索します。
  • フィールドに設定してください。
  • データベースアイテムのJSONを送信します。

問題

私はデータを提供していますが、時々同じことが、同時に2つのスレーブに提供されていることを、スクリプトのシェル出力に表示されます。ビューで


class Places < ActiveRecord::Base 

def sentout 
    self.update_attributes(:sent => "True") 
end 

def self.worker 
    @a = Places.select("id,address,city").where("sent is null").first 
    @a.sentout 
    return @a.to_json 
end 

end 

、これは何が起こるかです:

def index 
    @a = Places.worker 
    render :json => @a 
    end 

これによると、関係なく、私が処理するデータを求めてきたどのように多くの奴隷は、UNIQUEデータを乱発してはなりません(送信されたフィールドは ""です)、2つのスクリプトの出力に同じ項目があります。つまり、スレーブマシンが同じことを2回処理することがあります。

これは、この問題にアプローチする正しい方法ですか?私はこれに新しいです、そして最も論理的なアプローチを試みています。

私はこれを私自身で解決しようとするどんな助けもありがとう。

答えて

0

以下はtrueを返しますが、status属性は更新されません。

Place.update_attributes(:sent => 'True') 

ステータス属性を更新する場合は、それを個別に割り当てる必要があります。

Place.sent = 'True' 
save 
+0

あなたが提案した変更を行いました。私はまだ重複を見ている。 残りのコードは、私が期待しているように見えますか? – BriteLite

関連する問題