多くのアプリ リクエストによってサードパーティ API からデータが取得される Yesod アプリを開発しています。フェッチされたデータは、後続のリクエストでのみ使用されます。つまり、API コールアウトをトリガーするリクエストは、コールアウトが終了するのを待たずに終了できます。
特定のデータxyz
を 2 回取得して保存しないことが重要ですが、アプリの性質上、複数のクライアントがxyz
同時に関心を持つことがよくあります。xyz
各アプリ スレッドがデータベースにクエリを実行して、既にフェッチされているかどうかを確認すると、小規模な規模でも同時実行性に関連する問題が発生し始めます。同時実行性に関連する整合性の問題を処理するために大量のコードを作成したとしても (楽しくないし、すべてのケースを網羅したかどうかを確認するのは難しいでしょう)、高価なデータベース クエリをこのように悪用するのは悪い習慣です。
1 つ以上の「バックグラウンド ワーカー」タイプのプロセスがサブスクライブする AMQP キューに、すべてのアプリ スレッドがリクエストを発行する (「xyz データがフェッチされていることを確認してください」) ようにすることは、私には良い代替手段と思われます。
このスレッドで Greg Weber は、両方のパッケージが依存関係として「my Persistent layer」を持つデュアル パッケージ レイアウトを提案しています。hs-source-dir
彼は、「永続層」コードの 2 つのコピーを維持することを避けるために、シンボリック リンクまたは s を使用できると述べています。
大まかに言えば、Greg が説明していることは私には完全に理にかなっていますが、私は Haskell に比較的慣れていないため、詳細を理解するのに時間がかかるのではないかと心配しています。誰かが私のためにそれをより詳細に説明できますか?
- パッケージ ディレクトリはどのように配置する必要がありますか? (具体的にどのファイルが持続層を構成していますか?)
- .cabal ファイルはどのようになりますか?
- それらがそのようにレイアウトされたら、(スキャフォールディングされたサイト) ソース ファイルが永続モデルをインポートする方法を変更する必要がありますか?
もう 1 つの部分は次のとおりです。BackgroundJobs プロセスをどのように記述することをお勧めしますか? 私は、Yesod の足場を除いて、製品版の Haskell コードを書いたことはありません。私はそれを大まかなアウトラインで取得します-main
メッセージキューにサブスクライブし、各メッセージでコールアウト/処理/保存を行う .コールアウトが終了するのを待っている間にプロセスがブロックされないようにするには?
どうもありがとう。