0

検索を実行するたびに.ymlファイルから読み取るRailsアプリがあります。(これは全文検索アプリです。).ymlファイルは、異なるバージョンの検索インデックスが異なるサーバーに存在するため、検索要求を行う必要があるURLをアプリに通知します。また、インデックスを切り替えることもあります。

アプリの管理セクションがあり、前述の.ymlファイルを書き直して、新しい検索URLを追加したり、不要なURLを削除したりできます。サーバー上のファイルを手動で編集することもできますが、サーバーにアクセスできない場合でも必要な変更を加えることができるように、サイト管理セクションでもファイルを編集できるようにしたいと思います。

アプリで実際に使用されているファイルを編集するためのベストプラクティスは何ですか?(これは、たとえば、デプロイ後に独自のヘルパーファイルの1つを書き換える機能を備えたアプリにも当てはまると思います。)

私のサイトに接続している別のユーザーが検索を実行したいときに、このファイルを書き換えている可能性があるのは問題ですか?書き込み操作の最中に検索を失敗させることはできますか?最初に新しい.ymlファイルを一時ファイルに書き込み、後で元の.ymlファイルを置き換える必要がありますか?書き込み操作がかなり速いことは知っていますが、他の人の考えを知りたかっただけです。

更新:皆さんからの返信ありがとうございます!リクエストごとにファイルを読み取るよりも、ある種のキャッシュを使用する方がよいと思いますが、特に再書き込みを検討していることを考えると、ファイルの書き換えを実際に行うための最良の方法を見つけるのに役立ちました。 -この特定のケースでは毎回それを読んでください。

4

3 に答える 3

2

このためにファイルを使用する必要がある場合、安全なプロセスは次のようになります。

  1. 新しいコンテンツをある種の一時ファイルに書き込みます。
  2. File.rename古いファイルを新しいファイルにアトミックに置き換えるために使用します。

別々のファイルを使用しないと、避けられない問題が発生したときに、半分書かれた壊れたファイルになってしまう可能性があります。クラスメソッドはシステムコールのFile.rename単なるラッパーであり、rename(2)アトミックであることが保証されています(つまり、完全に成功するか完全に失敗するかのいずれかであり、一貫性のない中間状態になることはありません)。

交換したい場合/some/path/f.ymlは、次のようにします。

begin
  # Write your new stuff to /some/path/f.yml.tmp here
  File.rename('/some/path/f.yml.tmp', '/some/path/f.yml')
rescue SystemCallError => e
  # Log an error, complain loudly, fall over and cry, ...
end

他の人が言っているように、ファイルは実際にはこれに対処するための最良の方法ではなく、複数のサーバーがある場合、サーバーが同期しなくなるとファイルの使用は失敗します。複数のサーバーがアクセスできるデータベースを使用する方がよいでしょう。そうすれば、次のことができます。

  1. 各Webサーバープロセスで値をキャッシュします。
  2. 10分ごと(または機能するもの)にブラインドで更新します。
  3. リモートサーバーへの接続に失敗した場合は、キャッシュされた値を更新します(更新/接続/失敗のループを回避するために、追加のエラーチェックを行います)。
于 2012-04-25T19:22:28.407 に答える
1

まず、すべてのリクエストでそのファイルを読み取ることはパフォーマンスのキラーだと言わせてください。しないでください!そのデータを本当に.ymlファイルに保持する必要がある場合は、データをキャッシュして、変更後にのみリロードする必要があります(ファイルのタイムスタンプに基づく)。

ただし、リクエストごとにタイムスタンプをチェックしないでください。これはほぼ同じくらい悪いことです。最後のチェックからn分経過している場合は、リクエストでチェックしてください。おそらくbefore_filterどこかで。また、スレッドモードで実行している場合(ほとんどの人はそうではありません)、Mutexなどを使用していることに注意してください。

于 2012-04-25T17:15:52.617 に答える
1

ファイルの上書きを介してこれを本当に実行したい場合は、ファイルシステムのロック機能を使用して、書き込み中に他のスレッドが構成ファイルにアクセスするのをブロックします。多分このようなものをチェックしてください。

ただし、アプリを再デプロイせずに変更する必要のある構成にファイルを使用しないことを強くお勧めします。まず、誰かが検索を行うたびにファイルを読み取る必要があります。次に、セキュリティ上の理由から、Webアプリケーションに独自のコードへの書き込みアクセスを許可することは一般的に悪い考えです。これらの検索インデックスURLをデータベースまたはmemcachedキーに保存します。

編集: @bioneuralnetが指摘しているように、リアルタイムの構成更新が必要か、それとも最終的な同期が必要かを判断することが重要です。

于 2012-04-25T17:10:58.377 に答える