タイプの非同期トランザクションのモデリング‐第1部

3958 ワード

シナリオ1


あなたがS 3に資産をキャッシュする関数を書いていると想像してください.この関数は、
  • 特定のキー/バケツに資産を書きます.
  • Postgresテーブルに資産の位置を格納します.
  • さあ、誤って書いてみてください.
    await writeLocationToPgres(assetId, bucket, key);
    await uploadToS3(bucket, key);
    
    物事がうまくいけば、問題はありませんが、S 3への書き込み中に何かがうまくいかない場合、あなたのアセットキャッシュはS 3と同期できなくなります.それは、ロジックがアップロードを再試行するために起動しないことを意味します.そして、それはウェブページとビデオレンダラのような川下のサービスが資産を表示しないことを意味します.
    バグのこの種のすべての時間が発生し、その理由は、ビデオがチャンクをlobbedし、プロファイルの写真が消えても、“私はそれをアップロードしてください.”

    シナリオ2


    あなたは価格比較ツールのために働いて、あなたは契約者に3つのベンダーから引用を提示する義務があります.書き込みます.
    quote1 = await getQuote1();
    quote2 = await getQuote2();
    async sendWinningQuote([quote1, quote2]);
    
    これはベンダーの3月3日までは、彼らはあなたのサイトからは、訴訟、怒っている消費者、サービスの信頼性の低下がないビジネスを得て実現するまで動作します.このようなことは常に起こる.

    非同期トランザクションは難しいです!


    どちらの場合でも、会社は非同期トランザクションによってビットを得ました.一つでは、開発者は間違った順序で何かを書いて、もう一方でS/彼は何かを残しました.
    Meeshkanでは、ほとんどの企業のように、私たちのチームは、パイプラインの非同期トランザクションのどのポイントで失敗したかを調査します.それは本当に難しいです、そして、複雑な非同期トランザクションの正しい実行、リアンチングと潜在的なロールバックを確実にするために、銀弾丸がありません.
    この一連の記事では、ボールドされた非同期トランザクションの数を減らすための戦略を示します.はじめに2つの例を再確認して、タイプチェッカー(この場合、purescript)で私のIDE(VSCODE)で両方のエラーを防止する方法を示します.

    シナリオ1再訪


    次のプログラムをチェックしてください.それはちょうど罰金をコンパイルします.

    しかし、私が注文を逆にするならば、我々は赤いSquigglyを得ます.

    加えて、エラーメッセージを正確に何が間違っていた教えてください.

    シナリオ2再訪


    私はすべての3つの引用符を受信した後、私は3つのベンダーから引用符を取得し、情報を表示するPurescriptで次のプログラムをチェックしてください.

    私は引用符の順序を変更すると、まだすべての3つが存在するように、それはまだ罰金をコンパイルします.

    しかし、私が外に出るならば、コンパイラは私に赤い鳴り響くことで知らせます.

    また、私は私が正確に何を出て知っていることができます.

    何が来るの


    このシリーズの次の記事(明日出てくる)では、このようなシステムを構築する方法を紹介します.
    最初の記事では、順序が重要でない関係の後に特定の前に強制している間、順序が問題でない(例えば、我々のベンダー引用例からのIE)問題がない実行の不確定な順序を考慮に入れるためにインデックスされたMonadsで「通路」をつくることができる方法を見ます.
    つ目の記事は、これらの関係がどのようにして型レベル遷移マシンに統合されるかを示します.
    第3の記事は、これらの関係がインデックス付きの無料モナドを構築するために使われるADTに構築されることができる方法を示します.