6

再起動したり、状態を失ったりせずに自分自身を更新できる Web アプリを clojure で作成することを考えています。

Clojure アプリがいわゆるコードのホットスワップを実行できるという記事を見たことがあります。つまり、実行時に独自の関数を更新できます。これを Web サーバー上で安全に実行できますか?

4

2 に答える 2

6

コードのホットスワップを取得することは、可能であれば正しく行うのが難しいです。変更セットと実行中のアプリケーションにも依存します。

問題:

  • 古い変数は名前空間を散らかし、微妙な競合やバグを引き起こす可能性があります
  • 複数の変数の再定義はアトミックではありません

アプリケーションを再起動すると存在しない名前空間に古い変数が存在する可能性がありますが、一部の関数を再定義し、再起動せずにアプリを実行し続けると干渉します。

もう 1 つの問題はアトミック性です。複数の関数の再定義、つまり複数の変数の変更はアトミックではありません。他の名前空間のコードが依存する 1 つ以上の名前空間の関数を変更した場合、新しいコードで名前空間を再読み込みすることはアトミックではありません。

一般的に、あなたはどちらかの方が良いです

  1. アプリを再起動するまでプロキシにリクエストを保持させる
  2. 「古いバージョン」と並行して新しいアプリ インスタンスをスピンアップし、新しいバージョンがリクエストを処理する準備ができたら、プロキシを使用して新しいバージョンから切り替えます
于 2012-11-12T13:47:30.483 に答える
4

Erlang の OTP アプリケーションはこれをサポートしています。基本的に、アプリケーションの新しいバージョンを起動し、アプリケーションの新しいバージョンにリクエストを送信し始めます。リクエストの処理が完了するまで古いバージョンを維持し、その後シャットダウンします。

于 2012-11-12T15:08:05.010 に答える