1

写真の削除と並べ替えを行う 2 つのハンドラーの実行中の注文があり、最善の解決策についてアドバイスをお願いします。

UI でいくつかの写真が削除され、ユーザーは削除ボタンをクリックします。削除コマンドから実際に物理ファイルを削除するイベント ハンドラーまでのフロー全体が開始されます。

その後すぐに、ユーザーは残りの写真を並べ替えます。reorder コマンドからファイル システムの reordering イベント ハンドラまでの新しいフローが再び開始されます。

すでに並行性の問題があります。削除を行わないと、並べ替えを正しく適用できません。現在、この問題はある種のロックで処理されています。一時ファイルが作成され、削除フローの最後に削除されます。そのファイルが存在する間、他のスレッド (ユーザーのアクションに応じて並べ替えまたは削除) が待機します。

これは理想的な解決策ではなく、変更したいと考えています。注文の最後に JSON 呼び出しを介して UI が更新されるため、潜在的なソリューションも非常に高速である必要があります (もちろん、現在のソリューションは高速ではありません)。

後の実装では、イベントのキューを使用することを考えていますが、現時点ではかなり行き詰まっています。

どんなアイデアでも大歓迎です!ありがとう、もすっ!

編集: 私たちが抱えていたその他の結果整合性の問題は、クライアント側で Javascript データ マネージャーを使用することで解決されました。基本的に楽観主義者であり、ユーザーを騙しています! :)私はこれがここに行く方法でもあると信じ始めています。しかし、ファイル システムでデータがいつ変更されたかを知るにはどうすればよいでしょうか。

4

2 に答える 2

0

これについて、ひとつの考えがあります。正確には何を再注文していますか?ピクチャー?たとえば、日付に基づいています。なぜこれにコマンドがあるのですか?このコマンドの結果は、すべての人に表示されますか、それともこの特定のユーザーだけに表示されますか?

推測しかできませんが、ここでプレゼンテーションの質問があるようです。書き込み側で画像を特定の順序で保存する必要はありません。ファイル ストレージへの名前とリンクのリストだけです。すべきことは、ユーザー設定またはコレクション設定のどこかに小さなフィールドを保存することです: 日付の昇順または名前の降順。したがって、Reorder コマンドを実行すると、この小さなフィールドのみが変更されます。次に、ギャラリーをロードするときに、このフィールドを最初に読み取る必要があり、これに基づいて、1 つまたは別のビューをロードする必要があります。現在、ストアは安価であるため、必要なすべての並べ替えパラメーターについて、読み取り側でさまざまに並べ替えられたコレクションを格納できます。

まとめると、Delete コマンドは書き込み側のコレクションを変更することですが、Reoder コマンドはユーザーまたはコレクションの設定にすぎません。したがって、ここには並行性はありません。

アップデート

あなたのコメントと説明に基づいています。

  1. もちろん、ユーザーの操作を一度に 1 つだけ制限することはできますし、おそらくそうするべきです。削除と並べ替えの時間が合理的に短い場合。それは常に、達成するように求められるユーザー エクスペリエンスのタイプの問題です。注文システムの一般的な例を見てみましょう。注文後、ユーザーはすぐに UI で注文を確認でき、ステータスはInProcessのようになります。ほとんどの場合、ユーザーが順序を変更することはできません。つまり、[キャンセル] ボタンなどのユーザー コントロールを表示しないことを意味します (もちろん、これは単なる例です)。したがって、ここでこのアプローチを使用できます。
  2. 2 人のユーザーが同じ物理コレクションを変更できる場合、ここでは選択の余地がありません。共有データを操作しているため、ある種の同期が必要です。たとえば、saga を使用している場合、2 つの saga が存在する可能性があります: Collection reordering saga と Deletion saga - これらは連携できます。削除プロセスが最初に開始されました - コレクション集約は削除が進行中であるとマークされ、この並べ替えサガが開始された直後に並べ替えプロセスを開始しようとしますが、削除サガが進行中であるため、DeletedEvent を待ってからプロセスを続行する必要があります。並べ替え操作が最初に開始された場合も同様です。削除サガは何らかのイベントまで待機し、そのイベントが到着した後に続行する必要があります。

アップデート

わかりました、ファイル システム自体には触れないことに同意した場合は、画像コレクションを表す集合体に触れます。最も重要な同時実行の問題は、楽観的同時実行アプローチで解決できます。データ ストレージでは、通常、集計 ID と集計バージョンに基づく一意の制約が使用されます。

コマンド ハンドラーの一般的な手順は次のとおりです。

これは、コマンド ハンドラーがたどる一般的な一連の手順です。

  1. 独自のメリットでコマンドを検証します。
  2. 集計をロードします。
  3. アグリゲートの現在の状態でコマンドを検証します。
  4. 新しいイベントを作成し、そのイベントをメモリ内の集計に適用します。
  5. 集計の永続化を試みます。このステップで同時実行の競合が発生した場合は、あきらめるか、ステップ 2 からやり直してください。

これは、しばらく前に私を大いに助けてくれたリンクです: http://www.cqrs.nu/

于 2013-04-19T18:45:03.127 に答える