0

モデルが正しく更新されていないようです。

  • ユニコーンレインボー!EventMachineで
  • mysql2 gem

production8人で1000rpmの環境で再現できます。my_modelRailsコンソールで(を呼び出して)更新するとreload!、すべて正常に動作します。現地では再現できません。

コントローラから:

# params[:my_model] = {:name => "new name"} 
def update
  @my_model = MyModel.first # {:name => "old name"}
  Rails.logger.info @my_model.name
  @my_model.update_attributes(params[:my_model])
  redirect_to :action => :index
end

ログ:

new name
old name
old name
old name
new name

何が間違っていますか?よろしくお願いします!

4

2 に答える 2

0

モデル内のデータが一部のワーカーによってキャッシュされているため、あるワーカーではデータが新しい名前見えますが、別のワーカーでは古い名前に見えますか?

作業ごとの ID を追加し、これらをログに出力すると役立つ場合があります。つまり、ワーカーの起動時に、他のワーカーとは異なる一意の ID を自分自身に割り当てる必要があります (ワーカーの PID が適切な候補です)。このようにして、1 人以上のワーカーに一貫して問題があるか、すべてのワーカーに問題があるか、または時々一部のワーカーだけに問題があるかを確認できます。これがキャッシュの問題であることが判明した場合は、そのオブジェクトのすべてのワーカーで catch が無効になるのを待つだけでよく、最終的にはすべてのワーカーの正しい更新された値が表示されます。

ローカルで再現できない場合は、ローカルで開発するときに 1 つの Web サーバー インスタンス (1 つのワーカー) しか使用していないためですか?

また、productionログを確認して、古い名前CACHEが表示されているインスタンスにその単語が表示されているかどうかを確認してください。

于 2012-12-06T18:26:51.083 に答える
0

根本的な原因は、ワーカー プロセスがアクションを実行しないため、サーバーの負荷が高い場合にアクション間で SQL キャッシュがクリアされないことです。
負荷のないサーバーでテストしましたが、問題は再現されません。ApplicationController からの以下のコードはこの問題を修正しましたが、この解決策は少し醜いです:

  before_filter do 
    MyModel.current.connection.clear_query_cache
  end
于 2012-12-07T12:37:31.167 に答える