問題タブ [idempotent]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
441 参照

emacs - .emacs ファイルを冪等にする方法は?

.emacsファイルを何度リロードしても、

M-x load-file RET ~/.emacs RET

1回目と同じ結果を出したい。.emacsファイルをべきにしたい。

動機

私は、領域 ( C-c C-r)、defun ( C-M-x)、または最後の Sexp ( ) を外科的に評価できることを知っていC-x C-eます。小さな変更を加えるときは、このようなより洗練されたアプローチを取ることがよくあります。ただし、.emacsファイルを再処理する場合、ファイル全体をリロードして変更の結果を最終的に確認したい場合があり.emacsます。毎回 emacs を再起動すると、特に大規模な.emacsハウスキーピングを行うときに、すぐに古くなります。

具体的な手順

.emacsファイルを更新して非べき等操作をべき等操作に置き換えるには、具体的にどのような手順を実行する必要がありますか?

例えば、

  1. 「-hook」を検索し、フックへの直接の追加を への呼び出しに置き換えますadd-hook。これにより、既に存在する場合、フックに関数が再追加されません。
  2. フラグのトグルを直接設定またはクリアに置き換えます。注意してください?? 特に。
  3. ...

包括的なチェック アンド コレクト リストが理想的ですが、重要な個々のチェックがあればそれも役に立ちます。

0 投票する
2 に答える
95 参照

google-app-engine - 最終的に一貫性のあるクエリが与えられた場合、AppEngine でクライアントが再試行可能なべき等のエントリを作成するなど

データ ストア エントリの作成時にクライアントの再試行を処理するための戦略を考え出す必要があります。

  • クライアントは、データベースに新しいエントリを作成する要求を送信します
  • サーバーはエントリの作成を実行し、成功応答を準備します
  • リクエストが処理されなかったとクライアントに信じ込ませる何らかのエラーが発生します (パケット損失など)。
  • クライアントは、データベースに新しいエントリを作成するために同じ要求を再度送信します
  • サーバーは再試行を検出し、別のデータストア エントリを作成せずに元の応答を再作成して送信します
  • クライアントが返信を受け取る
  • 誰もが満足し、データベースには 1 つのエントリしか作成されませんでした

制限が 1 つあります。サーバーはステートレスです。クライアントにセッション情報はありません。

私の現在の考えは次のとおりです。

  • すべての create-request に、保証されたグローバルに一意の ID をタグ付けします (質問にはあまり関係ありませんが、作成方法は次のとおりです)。
    • データ ストア (および memcache) を使用して、サーバー インスタンスが読み込まれると、単調に増加する一意の ID をすべてのサーバー インスタンスに割り当てます (これをSIと呼びましょう) 。
    • クライアントが開始ページを要求すると、要求を処理したインスタンスは、単調に増加する一意のページ ロード ID ( PL ) を生成し、 SI.PLをページ コンテンツと共にクライアントに送信します。
    • create-request ごとに、クライアントは単調に増加する一意の request-id ( RI ) を生成し、create-request とともにSI.PL.RIを送信します。
  • create-request ごとに、サーバーは最初に create-tag を認識しているかどうかを確認します。
  • そうでない場合は、新しいエントリを作成し、何らかの形で create-tag を一緒に保存します。
  • タグがわかっている場合は、それを使用して最初に作成されたエントリを見つけ、対応する応答を再作成します。

現在考えている実装オプションとその問題点は次のとおりです。

  1. create-tag をエントリ内のインデックス付きプロパティとして保存します。
    • サーバーがリクエストを受け取ると、クエリを使用して既存のエントリを見つける必要があります
    • 問題: AppEngine のクエリは結果整合性しかないため、エントリを見逃す可能性があります
  2. create-tag をエントリのキーとして使用します。
    • 数値がラップされない場合は一意であることが保証されているため、問題ありません (long の場合はそうではありません)。
    • マイナーな不便: 将来の使用でエントリのキーの長さが増加します (不要なオーバーヘッド)。
    • 重大な問題: これにより、データストアに連続したエントリ キーが生成されます。これは、格納されたデータにホット スポットが作成され、パフォーマンスに大きな影響を与える可能性があるため、絶対に回避する必要があります。

オプション 2 について私が考えている解決策の 1 つは、ホットスポットを排除する代わりに、連番を取得し、それらを一意で決定論的だがランダムに見えるシーケンスに再マッピングする何らかの式を使用することです。そのような式がどのように見えるかについてのアイデアはありますか?

それとも、全体的により良いアプローチがありますか?

0 投票する
2 に答える
1210 参照

java - junitでメソッドのべき等性をテストするにはどうすればよいですか?

メソッドの冪等性をテストする必要があります。

次のメソッドを持つクラス Person があるとします。

削除の前に何か問題が発生した場合、次にメソッド doSomething を呼び出したときに、最初に正しく実行されるべきだったときに望んでいたのと同じ結果が作成されることをテストする必要があります。これは、たとえば、そのメソッドを呼び出すスクリプトを実行したが、スクリプトを停止するなどして失敗した場合に発生する可能性があります。次回スクリプトを実行すると、失敗することなく同じ結果が得られるはずです。

単体テストでこれを行うことはできますか?

前もって感謝します

0 投票する
1 に答える
12503 参照

task - ansible は、タスクの run_once 構成を無視します

Ansible を使用していますが、タスクを 1 回だけ実行したいと考えています。タスクを一度だけ構成して実行する方法に関するドキュメントに従います

しかし、Ansible を実行すると、常にこのタスクが実行されます。タスクを 1 回だけ実行するにはどうすればよいですか。

0 投票する
2 に答える
64 参照

ruby-on-rails - GET と PUT のどちらを使用するか、PUT URI を入力するとどうなるか?

(これは Rails に固有のものではありませんが、Rails 構成を使用して質問します)。

TL;DR

ユーザーが URI をアドレス バーに入力すると、実際には GET ではなく PUT 操作になるのでしょうか?

詳細

最近読み取った値のコピーを (効率のために) データベースに保持する Web 対応の Gauge があるとしますが、ユーザーはキャッシュされた値を更新する更新を要求できます。したがって、ルートは次のようになります。

ゲージのキャッシュ状態を表示することにしました。これGETは、GET を何回実行しても結果が変わらないためです。http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.htmlの用語では、GET 操作はべき等です。したがってGET /gauge/33、ゲージ #33 のキャッシュされた値をフェッチします。

私がRFC2616を理解している限り、状態は呼び出しごとに変化する可能性がPUTあるため、aを使用してローカル状態を更新する必要があります。これはべき等ではありません。別の言い方をすると、データベースに副作用が生じます。PUT /gauge/33/update

今: 私が RCF2616 を誤解している場合は、ここで止めてください。

質問

私の質問は非常に単純です。ユーザー/gauge/33/updateがブラウザのアドレス バーに入力するとどうなるでしょうか? サーバーには として表示されますがGET /gauge/33/update、それに一致するルートはありません。

同じ URI パターンに対して GET と PUT の両方を含むルートを設定するのは一般的な方法ですか? つまり、ルーティング テーブルを次のように設定できます。

このアプローチに関する私の懸念は、ユーザーがGET /gauge/33/update連続して 2 回 (またはそれ以上) 呼び出した場合、サーバーは、GET がべき等操作を通知するため、実際には更新を実行する必要がないと判断する可能性があることです。

私はただ衒学的ですか?または、RFC2616 を誤解していますか?

0 投票する
2 に答える
770 参照

api - クライアント トークンを使用してべき等性をチェックする前に、べき等 POST API 呼び出しで API 要求のペイロードをチェックする必要がありますか?

私は冪等な REST ベースの POST API 呼び出しを構築しています。ネットワーク障害やタイムアウト時にクライアントが重複したリソースを作成しないように、べき等動作を実装したいと考えています。クライアントは、すべての API 呼び出しの要求ヘッダーで ClientToken を渡します。私の POST リクエストには標準のペイロードがあり、その周りに検証ロジックがあります。再試行中に API から期待される理想的な冪等性の動作は何ですか? ClientToken だけに依存してリクエスト ペイロードを無視する必要がありますか、それとも、ClientToken を使用してべき等チェックを呼び出す前に、リクエスト ペイロードで検証ロジックを実行する必要がありますか?