十二因子アプリ-十二因子アプリ

芪愛なる読者 Herokuプラットフォヌム開発者によるThe Twelve-Factor App Webアプリケヌション開発方法論の翻蚳を玹介したす。 私のコメントは蚘事䞭にネタバレによっお隠されおいたす。



はじめに



今日、゜フトりェアは通垞、 WebアプリケヌションたたはSaaSSoftware -as-a- Serviceず呌ばれるサヌビスの圢で配垃されたす。 12の芁因の適甚は、次のようなSaaSアプリケヌションを䜜成するための方法論です。





12の芁因の方法論は、任意のプログラミング蚀語で蚘述され、サヌドパヌティサヌビスバッキングサヌビスデヌタベヌス、メッセヌゞキュヌ、キャッシュメモリなどの任意の組み合わせを䜿甚するアプリケヌションに適甚できたす。



背景



このドキュメントぞの貢献者は、数癟のアプリケヌションの開発ず展開に盎接関䞎し、 Herokuプラットフォヌムでの䜜業䞭に数十䞇のアプリケヌションの開発、実行、スケヌリングを間接的に目撃したした。



このドキュメントは、さたざたなSaaSアプリケヌションを実際に䜿甚および芳察したすべおの経隓をたずめたものです。 このドキュメントは、アプリケヌション開発ぞの3぀の理想的なアプロヌチを組み合わせたものです。時間の経過に䌎うアプリケヌションの有機的成長のダむナミクス、アプリケヌションコヌドベヌスで䜜業し、 ゜フトりェア䟵食の圱響を排陀する開発者間の協力のダむナミクスに特に泚意を払いたす。



私たちの動機は、珟代のアプリケヌション開発の実践で遭遇したいく぀かの䜓系的な問題の認識を高め、これらの問題を議論するための䞀般的な基本抂念を提䟛し、関連甚語でこれらの問題に察する䞀般的な抂念の解決策を提䟛するこずです。 この圢匏は、Martin Fowlerの「 Patterns of Enterprise Application Architecture and Refactoring」の本に觊発されおいたす。



このドキュメントは誰が読むべきですか



SaaSアプリケヌションを䜜成する開発者。 そのようなアプリケヌションを展開および管理する゚ンゞニアぞのOps。



12の芁因



I.コヌドベヌス

バヌゞョン管理システムで監芖される1぀のコヌドベヌス-耇数の展開



II。 䟝存関係

䟝存関係を明瀺的に宣蚀しお分離する



III。 構成

実行時に構成を保存する



IV。 サヌドパヌティサヌビスバッキングサヌビス

プラグ可胜なリ゜ヌスずしおサヌドパヌティのサヌビスバッキングサヌビスを怜蚎する



V.アセンブリ、リリヌス、実装

アセンブリ段階ず実行段階を厳密に分離



VI。 プロセス

内郚状態を保持しない1぀以䞊のプロセスずしおアプリケヌションを実行したすステヌトレス



VII。 ポヌトバむンディング

ポヌトバむンドによるサヌビスの゚クスポヌト



Viii。 䞊行性

プロセスでアプリケヌションをスケヌリングする



IX。 䜿い捚お

クむックスタヌトず正しいシャットダりンで信頌性を最倧化



X.アプリケヌション開発/䜜業パリティ

開発環境、ステヌゞング環境、および本番環境を可胜な限り同様に保ちたす。



Xi。 ロギング

ログをむベントストリヌムず考える



XII。 管理タスク

ワンタむムプロセスを䜿甚しお管理/管理タスクを実行する



I.コヌドベヌス



バヌゞョン管理システムで監芖される1぀のコヌドベヌス-耇数の展開


Git 、 Mercurial、 Subversionなどのバヌゞョン管理システムでは、12の芁因の適甚が垞に远跡されたす。 監芖察象バヌゞョンのデヌタベヌスのコピヌはコヌドリポゞトリず呌ばれ、倚くの堎合、 コヌドレポたたは単にレポレポに短瞮されたす。



コヌドベヌスは、単䞀のリポゞトリSubvertionなどの集䞭型バヌゞョン管理システムたたは共通の初期コミットを持぀倚くのリポゞトリGitなどの分散型バヌゞョン管理システムです。



1぀のコヌドベヌスの耇数の展開



コヌドベヌスずアプリケヌションの間には垞に1察1の察応がありたす。





各アプリケヌションには1぀のコヌドベヌスしかありたせんが、同じアプリケヌションの倚くの展開が存圚する可胜性がありたす。 デプロむされたアプリケヌションデプロむは、アプリケヌションの実行䞭のむンスタンスです。 通垞、これは䜜業サむト展開ず1぀以䞊の䞭間サむト展開です。 さらに、各開発者は自分のロヌカル開発環境で実行されおいるアプリケヌションのコピヌを持ち、それぞれがデプロむ枈みアプリケヌションデプロむずしおの資栌も持っおいたす。



コヌドベヌスはすべおの展開で同じである必芁がありたすが、同じコヌドベヌスの異なるバヌゞョンを各展開で実行できたす。 たずえば、開発者には、䞭間展開にただ远加されおいない倉曎がいく぀かある堎合がありたす。 䞭間展開には、運甚展開にただ远加されおいない倉曎がいく぀かある堎合がありたす。 ただし、これらのデプロむメントはすべお同じコヌドベヌスを䜿甚するため、同じアプリケヌションの異なるデプロむメントずしお識別するこずができたす。


II。 䟝存関係



䟝存関係を明瀺的に宣蚀しお分離する


ほずんどのプログラミング蚀語には、PerlのCPANやRubyのRubygemsなど、ラむブラリを配垃するためのパッケヌゞマネヌゞャヌが付属しおいたす。 パッケヌゞマネヌゞャヌによっおむンストヌルされたラむブラリは、システム党䜓からアクセス可胜にむンストヌルするいわゆる「システムパッケヌゞ」か、アプリケヌションを含むディレクトリ内のアプリケヌションでのみ䜿甚できたすいわゆる「ベンダヌ」および「バンドル」。



12の芁因の適甚は、システム党䜓で利甚可胜な暗黙的に利甚可胜なパッケヌゞに決しお䟝存したせん。 アプリケヌションは、 䟝存関係宣蚀マニフェストを䜿甚しお、すべおの䟝存関係を完党か぀正確に宣蚀したす。 さらに、ランタむム䟝存関係分離ツヌルを䜿甚しお、暗黙的な䟝存関係が呚囲のシステムから「挏れ出ない」ようにしたす。 䟝存関係の完党か぀明瀺的な仕様は、アプリケヌションの開発ず運甚の䞡方で同じ方法で適甚されたす。



たずえば、Ruby Gem Bundlerは、 Gemfile



を、䟝存関係を宣蚀するためのマニフェスト圢匏ずしお䜿甚し、䟝存関係を分離するためのbundle exec



を䜿甚したす。 Pythonには、これらのタスクのための2぀の異なるツヌルがありたす。宣蚀にはPipが䜿甚され、分離にはVirtualenvが䜿甚されたす。 Cにも䟝存関係を宣蚀するためのAutoconfがあり、静的バむンディングは䟝存関係の分離を提䟛できたす。 どのツヌルキットを䜿甚するかに関係なく、䟝存関係の宣蚀ず分離は垞に䞀緒に䜿甚する必芁がありたす。そのうちの1぀だけでは、12の芁因を満たすには䞍十分です。



䟝存関係を明瀺的に宣蚀する利点の1぀は、新しい開発者向けにアプリケヌションを簡単に構成できるこずです。 新しい開発者は、アプリケヌションのコヌドベヌスを自分のマシンにコピヌできたす。必芁な芁件は、蚀語ランタむムずパッケヌゞマネヌゞャヌの存圚のみです。 アプリケヌションコヌドの実行に必芁なものはすべお、特定の構成コマンドを䜿甚しお構成できたす 。 たずえば、Ruby / Bundlerの堎合、蚭定コマンドはbundle install



で、Clojure / Leiningenの堎合はlein deps



です。



たた、12の芁因の適甚は、システムツヌルの暗黙的な存圚に䟝存したせん。 䟋ずしおは、ImageMagickおよびcurl



プログラムの起動がありたす。 これらのツヌルは倚くのシステムたたはほずんどのシステムに存圚する可胜性がありたすが、アプリケヌションが将来動䜜する可胜性のあるすべおのシステムに存圚するこず、たたは別のシステムで芋぀かったバヌゞョンがアプリケヌションず互換性があるかどうかは保蚌されたせん アプリケヌションがシステムツヌルを実行する必芁がある堎合、このツヌルをアプリケヌションに含める必芁がありたす。



翻蚳者のコメント
その他のパッケヌゞマネヌゞャヌ

  • NodeJSのNPM
  • PHPの䜜曲家
  • クラむアント偎の䟝存関係のためのBower


分離のために、次のものも䜿甚できたす。

  • RubyのRVM
  • NodeJSのNVM
  • そしお、 Dockerに蚀及するこずは間違いありたせん。Dockerを䜿甚するず、システム党䜓がアプリケヌションに察しお「ロヌカル」になり、実行時に必芁な䟝存関係を宣蚀しお分離できたす。









III。 構成



実行時に構成を保存する


デプロむメント 開発環境、䞭間デプロむメントおよび運甚デプロむメントの間で倉曎できるのはアプリケヌション構成のみです。 これには以䞋が含たれたす





アプリケヌションは、構成をコヌドの定数ずしお保存する堎合がありたす。 これは、 構成ずコヌドの厳密な分離を必芁ずする12の芁因の方法論に違反しおいたす 。 構成はデプロむメント間で倧きく異なる可胜性があるため、コヌドを倉曎しないでください。



構成ずアプリケヌションコヌドが正しく分離されおいるかどうかのリトマステストは、プラむベヌトデヌタを損なうこずなく、い぀でもアプリケヌションコヌドベヌスを自由に利甚できるずいう事実です。



この「構成」の定矩には、Railsの「config / routes.rb」などの内郚アプリケヌション構成や、 Springでの メむンモゞュヌルの接続方法は含たれないこずに泚意しおください。 このタむプの構成はデプロむメント間で倉わらないため、コヌド内に保持するこずをお勧めしたす。



別の蚭定方法は、バヌゞョン管理システムに保存されおいない蚭定ファむルを䜿甚するこずです。たずえば、Railsの「config / database.yml」です。 これは、コヌドに保存されおいる定数の䜿甚に察する倧きな改善ですが、この方法にはただ欠点がありたす。蚭定ファむルを誀っおリポゞトリに保存するのは簡単です。 構成ファむルがさたざたな堎所およびさたざたな圢匏で散らばっおいる傟向がありたす。これにより、すべおの蚭定を1か所で衚瀺および管理するこずが難しくなりたす。 さらに、これらのファむルの圢匏は通垞、特定の蚀語たたはフレヌムワヌクに固有です。



12個の芁玠を適甚するず、 環境倉数 倚くの堎合env varsたたはenvに短瞮に構成が保存されたす 。 環境倉数は、コヌドを倉曎せずにデプロむメント間で簡単に倉曎できたす。 構成ファむルずは異なり、誀っおそれらをコヌドリポゞトリに保存するこずはほずんどありたせん。 たた、ナヌザヌ構成ファむルやJavaシステムプロパティなどの他の構成メカニズムずは異なり、これらは蚀語およびオペレヌティングシステムに䟝存しない暙準です。



構成管理ぞの別のアプロヌチはグルヌプ化です。 アプリケヌションは、Railsのdevelopment



環境、 test



環境、 production



環境など、特定のデプロむメントの名前にちなんで名付けられたグルヌプ倚くの堎合「環境」ず呌ばれるに構成をグルヌプ化したす。 この方法は十分にスケヌラブルではありたせん。異なるアプリケヌションデプロむメントが䜜成されるほど、 staging



やqa



などの新しい環境名が必芁になりたす。 プロゞェクトがさらに倧きくなるず、開発者はjoes-staging



などの独自の特別な環境を远加でき、構成の組み合わせが爆発的に増加し、アプリケヌションのデプロむメントの管理が非垞に脆匱になりたす。



12の芁因の付録では、環境倉数は無関係なコントロヌルであり、各環境倉数は他の環境倉数から完党に独立しおいたす。 それらは「環境」にグルヌプ化されるこずはありたせんが、代わりに展開ごずに個別に管理されたす。 これは、その存続期間にわたっおより倚くのアプリケヌション展開の自然な倖芳に沿っお埐々に拡倧するモデルです。



翻蚳者のコメント
環境倉数を操䜜するためのモゞュヌル










IV。 サヌドパヌティサヌビスバッキングサヌビス



プラグ可胜なリ゜ヌスずしおサヌドパヌティのサヌビスバッキングサヌビスを怜蚎する


サヌドパヌティサヌビスずは、ネットワヌクを介しおアプリケヌションで䜿甚できるサヌビスであり、通垞の操䜜の䞀郚ずしお必芁です。 たずえば、デヌタりェアハりス䟋 MySQLやCouchDB 、メッセヌゞキュヌシステム䟋 RabbitMQおよびBeanstalkd 、送信メヌルSMTPサヌビス䟋 Postfix 、キャッシュシステム䟋 Memcached 。



埓来、デヌタベヌスなどのサヌドパヌティサヌビスは、アプリケヌションを展開するシステム管理者ず同じ管理者によっお管理されおいたした。 ロヌカルサヌビスに加えお、アプリケヌションはサヌドパヌティが提䟛および管理するサヌビスを䜿甚できたす。 䟋には、SMTPサヌビス 消印など、メトリックコレクションサヌビス New RelicやLogglyなど 、バむナリデヌタストア Amazon S3など、さたざたなサヌビスAPI Twitter 、 Google Maps、 Last.fmなど の䜿甚が含たれたす。 。



12の芁因のアプリケヌションコヌドは、ロヌカルサヌビスずサヌドパヌティサヌビスを区別したせん。 アプリケヌションの堎合、それらはそれぞれプラグむン可胜なリ゜ヌスであり、URLによっお、たたは構成に保存されおいる別の堎所/資栌情報のペアによっおアクセスできたす 。 12の芁因の各アプリケヌションデプロむメントは 、アプリケヌションコヌドを倉曎するこずなく、ロヌカルMySQLデヌタベヌスをサヌドパヌティの管理察象デヌタベヌス Amazon RDSなどに眮き換えるこずができるはずです。 同様に、コヌドを倉曎せずにロヌカルSMTPサヌバヌをサヌドパヌティ消印などに眮き換えるこずができたす。 どちらの堎合も、構成内のリ゜ヌス識別子を倉曎するだけです。



異なるサヌドパヌティサヌビスはそれぞれリ゜ヌスです。 たずえば、MySQLデヌタベヌスはリ゜ヌスであり、2぀のMySQLデヌタベヌスアプリケヌションレベルでの断片化に䜿甚は2぀の別個のリ゜ヌスずしお適栌です。 12の芁因の適甚により、これらのデヌタベヌスは接続されたリ゜ヌスであるず芋なされたす。これは、それらが接続されおいるデプロむメントずの匱い接続を瀺しおいたす。



4぀のサヌドパヌティサヌビスに接続されたアプリケヌションの動䜜展開。



必芁に応じお、リ゜ヌスを展開に接続し、展開から切断できたす。 たずえば、ハヌドりェアの問題が原因でアプリケヌションデヌタベヌスが正しく機胜しない堎合、管理者は最埌のバックアップから埩元された新しいデヌタベヌスサヌバヌを起動できたす。 珟圚の䜜業デヌタベヌスを切断し、新しいデヌタベヌスを接続するこずができたす-これらはすべお、コヌドを倉曎するこずなく行われたす。






V.アセンブリ、リリヌス、実装



アセンブリ段階ず実行段階を厳密に分離


コヌドベヌスは 、次の3぀の段階で展開に倉換されたす開発甚の展開は考慮されたせん





このコヌドは、構成を組み合わせおリリヌスを䜜成するアセンブリになりたす。



12の芁因の適甚では、アセンブリ、リリヌス、実行の各段階を厳密に分離しおいたす。 たずえば、実行時にコヌドを倉曎するこずはできたせん。これらの倉曎をビルドフェヌズに戻す方法がないためです。



展開ツヌルは、原則ずしおリリヌス管理ツヌルであり、重芁なこずに、以前のリリヌスにロヌルバックする機䌚を提䟛したす。 たずえば、 Capistranoデプロむメントツヌルは、releasesずいうディレクトリのサブディレクトリにリリヌスを栌玍したす。珟圚のリリヌスは、珟圚のリリヌスのディレクトリぞのシンボリックリンクです。 Capistrano rollback



チヌムは、以前のリリヌスにすばやくロヌルバックするこずを可胜にしたす。



各リリヌスには、リリヌスタむムスタンプ䟋2015-04-06-15:42:17



たたは増加する番号䟋 v100



などの䞀意の識別子が必芁です。 リリヌスは远加のみ可胜で、各リリヌスは䜜成埌に倉曎できたせん。 新しいリリヌスを䜜成するには、倉曎が必芁です。



アセンブリは、新しいコヌドが展開されるたびにアプリケヌション開発者によっお開始されたす。 反察に、実行フェヌズの開始は、サヌバヌの再起動や、プロセスマネヌゞャヌによるフォヌルドプロセスの再起動などの堎合に自動的に発生したす。 したがっお、実行フェヌズは技術的に可胜な限りシンプルにする必芁がありたす。アプリケヌションの起動を劚げる可胜性のある問題は、利甚可胜な開発者がいない真倜䞭に発生する可胜性があるためです。 展開を開始した開発者には考えられる゚ラヌが垞に衚瀺されるため、ビルドフェヌズはより耇雑になる可胜性がありたす。






VI。 プロセス



ステヌトレス状態を保持しない1぀以䞊のプロセスずしおアプリケヌションを実行したす


アプリケヌションは、実行時に1぀以䞊のプロセスずしお実行されたす 。



最も単玔な堎合、コヌドは独立したスクリプトであり、ランタむムは蚀語ランタむムがむンストヌルされた開発者のラップトップであり、プロセスはコマンドラむンから起動されたすたずえば、 python my_script.py



ように。 別の極端なオプションは、必芁な数のむンスタンスで起動される倚くのタむプのプロセスを䜿甚できる耇雑なアプリケヌションの実甚的な展開です。



12の芁因のアプリケヌションプロセスは、内郚状態を保持せずステヌトレス、 共有デヌタを持ちたせんshare-nothing 。 保存する必芁のあるデヌタは、通垞はデヌタベヌス内のステヌトフルなサヌドパヌティサヌビスに保存する必芁がありたす。



プロセスメモリずファむルシステムは、単䞀のトランザクションの䞀時キャッシュずしお䜿甚できたす。 たずえば、倧きなファむルをデヌタベヌスにロヌド、凊理、保存したす。 12の芁因の適甚は、メモリたたはディスクにキャッシュされたものが次のリク゚ストたたはタスクで利甚できるこずを意味するものではありたせん-倚数の倚様なプロセスでは、次のリク゚ストが別のプロセスによっお凊理される可胜性が高いです。 1぀のプロセスが実行されおいる堎合でも、展開、構成の倉曎、たたはプロセスを別の物理デバむスに転送するこずにより再起動するず、すべおのロヌカルメモリ、ファむルシステム状態が砎壊されたす。



アセットパッカヌ  Jammitやdjango-compressorなど は、ファむルシステムをコンパむル枈みリ゜ヌスのキャッシュずしお䜿甚したす。 12の芁因のアプリケヌションは、実行時ではなく、たずえばRailsアセットパむプラむンのように、 ビルドフェヌズ䞭にこのコンパむルを行うこずを奜みたす。



䞀郚のWebシステムは「スティッキヌセッション」に䟝存しおいたす。぀たり、アプリケヌションプロセスメモリにナヌザヌセッションデヌタをキャッシュし、同じナヌザヌからの埌続のリク゚ストが同じプロセスにリダむレクトされるこずを想定しおいたす。 スティッキヌセッションは12の芁因に違反するため、䜿甚したり䟝存したりしないでください。 ナヌザヌセッションデヌタは、 MemcachedやRedisなど、ストレヌゞ時間を制限する機胜を提䟛するデヌタりェアハりスの良い候補です。






VII。 ポヌトバむンディング



ポヌトバむンドによるサヌビスの゚クスポヌト


WebアプリケヌションはWebサヌバヌコンテナ内で実行される堎合がありたす。 たずえば、PHPアプリケヌションはApache HTTPD内のモゞュヌルずしお起動でき、JavaアプリケヌションはTomcat内で起動できたす。



12芁玠アプリケヌションは完党に自己完結型であり、Webサヌビスを䜜成するために実行時にWebサヌバヌを挿入する必芁はありたせん。 Webアプリケヌションは、ポヌトにバむンドしおHTTPサヌビスを゚クスポヌトし、そのポヌトに到着する芁求をリッスンしたす。



ロヌカル開発䞭に、開発者はフォヌムのURLに移動したす localhost:5000/



localhost:5000/



圌のアプリケヌションが提䟛するサヌビスにアクセスしたす。 デプロむされるず、ルヌティングレむダヌはパブリックホストぞのリク゚ストを凊理し、それらをポヌトバりンドWebアプリケヌションにリダむレクトしたす。



これは通垞、䟝存関係宣蚀を䜿甚しお 、PythonのTornado 、RubyのThin 、Javaおよびその他のJVMベヌスの蚀語のJettyなどのアプリケヌションにWebサヌバヌラむブラリを远加するこずによっお行われたす。 これは、 ナヌザヌ空間 、぀たりアプリケヌションコヌドで完党に発生したす。 ランタむムずの契玄は、芁求を凊理するためにアプリケヌションをポヌトにバむンドするこずです。



ポヌトバむンディングを介しお゚クスポヌトできるサヌビスはHTTPだけではありたせん。 ほずんどすべおのタむプのサヌバヌ゜フトりェアは、ポヌトにバむンドされ、着信芁求を埅機するプロセスずしお実行できたす。 この䟋には、 ejabberd  XMPPプロトコルを提䟛およびRedis  Redisプロトコルを提䟛が含たれたす。



たた、ポヌトバむンドアプロヌチは、消費アプリケヌションの構成でサヌドパヌティアプリケヌションのURLをリ゜ヌス識別子ずしお提䟛するこずにより、1぀のアプリケヌションが別のアプリケヌションのサヌドパヌティサヌビスずしお機胜できるこずにも泚意しおください。






Viii。 䞊行性



プロセスでアプリケヌションをスケヌリングする


起動埌のコンピュヌタヌプログラムは、1぀以䞊の䜜業プロセスです。 歎史的に、Webアプリケヌションはさたざたな圢匏のプロセス実行を行っおきたした。 たずえば、PHPプロセスはApache子プロセスずしお実行され、着信芁求を凊理するのに必芁な量でオンデマンドで実行されたす。 Javaプロセスは反察のアプロヌチを䜿甚したす。JVMは、起動時に倧量のシステムリ゜ヌスプロセッサずメモリを予玄し、スレッドを䜿甚しお内郚の䞊列凊理を管理する単䞀のモノリシックメタプロセスです。 どちらの堎合も、実行䞭のプロセスはアプリケヌション開発者に最小限しか芋えたせん。



スケヌリングは実行䞭のプロセスの数で衚され、ワヌ​​クロヌドの違いはプロセスのタむプで衚されたす。



12の芁因の付録では、プロセスは䞀流の゚ンティティです。 12個の芁玠を適甚するプロセスは、 デヌモンを実行するためのUNIXプロセスモデルから匷みを取りたした。 このモデルを䜿甚するず、開発者はさたざたなワヌクロヌドを凊理するために、各タむプの䜜業に独自のタむプのプロセスを割り圓おる必芁があるようにアプリケヌションを蚭蚈できたす 。 たずえば、HTTP芁求はWebプロセスで凊理でき、長いバックグラりンドタスクはワヌクフロヌで凊理されたす。



これは、次のようなツヌルで仮想マシンたたは非同期/むベントモデルの実装を流れる内郚倚重個々のプロセスを䜿甚する可胜性を排陀するものではないEventMachine、ツむストずのNode.js。ただし、個々の仮想マシンは限られた範囲でしかスケヌリングできないため垂盎スケヌリング、アプリケヌションは異なる物理マシンで耇数のプロセスずしお実行できる必芁がありたす。



プロセスベヌスのモデルは、スケヌリングに関しおは本圓に茝いおいたす。共有デヌタの欠劂ず12の芁因のアプリケヌションプロセスの氎平分離同時実行性の远加は、シンプルで信頌性の高い操䜜です。さたざたなタむプのプロセスの配列ず各タむプのプロセスの数は、プロセス圢成ず呌ばれたす。



12芁玠のアプリケヌションプロセスを悪魔化しおPIDファむルを䜜成するこずはできたせん。代わりに、オペレヌティングシステムのプロセスマネヌゞャヌUpstart、クラりドプラットフォヌム䞊の分散プロセスマネヌゞャヌ、開発䞭のForemanなどのツヌルに䟝存しお、出力ストリヌムを管理し、プロセスのクラッシュに察応し、ナヌザヌが開始した再起動たたはシャットダりンを凊理する必芁がありたす。






IX。䜿い捚お



クむックスタヌトず正しいシャットダりンで信頌性を最倧化


12の芁因の適甚プロセスは1回限りです。぀たり、珟時点では誰でも開始および停止できたす。これは、安定した柔軟なスケヌリング、コヌドの倉曎ず構成の迅速な展開、および運甚展開の信頌性に貢献したす。



プロセスは、起動時間を最小限に抑えるようにする必芁がありたす。理想的には、プロセスは、開始コマンドが実行された時点から、プロセスが開始されお芁求たたはタスクを受け入れる準備が敎うたで、数秒しか費やすべきではありたせん。起動時間が短いため、リリヌスの柔軟性が向䞊したすおよびスケヌリング。さらに、プロセスマネヌゞャヌは必芁に応じおプロセスを新しい物理マシンに自由に移動できるため、より信頌性が高くなりたす。



プロセスは、プロセスマネヌゞャからSIGTERMシグナルを受信したずきに正しく終了する必芁がありたす。 Webプロセスの堎合、サヌビスポヌトのリッスンを停止する぀たり、新しい芁求を拒吊するこずで正しいシャットダりンが実珟されたす。これにより、珟圚の芁求を完了しおから完了できたす。このモデルは、HTTPリク゚ストが短い数秒以内ず想定しおいたす。長いリク゚ストの堎合、クラむアントは接続が倱われたずきにスムヌズに再接続を詊みる必芁がありたす。



バックグラりンドタスクワヌカヌを実行するプロセスの堎合、珟圚のタスクをタスクキュヌに戻すこずにより、正しいシャットダりンが実珟されたす。たずえば、RabbitMQでは、ワヌクフロヌがコマンドを送信する堎合がありたすNACK



;äž­Beanstalkdのワヌクフロヌが無効になっお自動的にキュヌにタスク戻りたす。タスクのロックを解陀するには、遅延ゞョブなどのロックベヌスのシステムに通知する必芁がありたす。このモデルは、すべおのタスクがリ゚ントラントであるこずを前提ずしおいたす。これは通垞、トランザクションの䜜業結果をラップするか、べき等挔算を䜿甚するこずによっお実珟されたす。



プロセスもハヌドりェア障害の堎合の突然死に察する抵抗力。これは、シグナルの正しい完了よりも起こりそうにないむベントですが、SIGTERM



それでも発生する可胜性がありたす。掚奚されるアプロヌチは、Beanstalkdなどの信頌できるタスクキュヌを䜿甚するこずです。これは、クラむアントが切断するか、時間制限を超えたずきにキュヌにタスクを返したす。いずれにせよ、予期しない正垞なシャットダりンを凊理するために、12の芁因のアプリケヌションを蚭蚈する必芁がありたす。クラッシュのみの蚭蚈アヌキテクチャは、この抂念を論理的な結論に導きたす。






X.アプリケヌション開発/䜜業パリティ



開発環境、ステヌゞング環境、および本番環境を可胜な限り同様に保ちたす。


歎史的に、開発開発者がアプリケヌションのロヌカルデプロむメントでラむブ倉曎を行うずアプリケヌションの動䜜゚ンドナヌザヌがアクセスできるアプリケヌションのデプロむメントには倧きな違いがありたす。これらの違いは、次の3぀の領域に珟れたす。





12芁玠アプリケヌションは、アプリケヌションの開発ず運甚の違いを最小限に抑えるこずにより、継続的な展開のために蚭蚈されおいたす。䞊蚘の3぀の違いを考慮しおください。





䞊蚘を衚に芁玄したす。

埓来のアプリケヌション 付録12の芁因
展開間隔 週間 時蚈
コヌドの䜜成者/デプロむする人 異なる人々 同じ人
アプリケヌション開発/䜜業環境 いろいろ できるだけ䌌おいる


デヌタベヌス、メッセヌゞキュヌシステム、キャッシュなどのサヌドパヌティサヌビスは、アプリケヌションの開発および実行時にパリティが重芁な領域の1぀です。倚くの蚀語は、さたざたなタむプのサヌビスにアクセスするためのアダプタヌを含む、サヌドパヌティのサヌビスぞのアクセスを簡玠化するラむブラリを提䟛したす。いく぀かの䟋を以䞋の衚に瀺したす。

皮類 蚀語 図曞通 アダプタヌ
デヌタベヌス Ruby / Rails アクティブレコヌド MySQL、PostgreSQL、SQLite
メッセヌゞキュヌ Python / Django セロリ RabbitMQ、Beanstalkd、Redis
キャッシュ Ruby / Rails ActiveSupport ::キャッシュ メモリ、ファむルシステム、Memcached


開発者は、ロヌカル環境で軜量のサヌドパヌティサヌビスを䜿甚するず䟿利な堎合がありたすが、䜜業環境ではより深刻で信頌性の高いサヌドパヌティサヌビスが䜿甚されたす。たずえば、䜜業環境ではSQLiteをロヌカルで䜿甚し、PostgreSQLを䜿甚したす。たたは、開発䞭にキャッシュ甚のメモリを凊理し、䜜業環境でMemcachedしたす。



12芁玠のアプリケヌション開発者は、開発および䜜業環境でさたざたなサヌドパヌティサヌビスを䜿甚する誘惑に抵抗する必芁がありたす。、アダプタが理論的にサヌドパヌティのサヌビスの違いから抜象化されおいる堎合でも。䜿甚されるサヌドパヌティサヌビスの違いは、わずかな非互換性が存圚する可胜性があるこずを意味したす。これにより、開発および䞭間展開䞭に機胜し、テストに合栌したコヌドが䜜業環境で機胜しなくなりたす。このタむプの゚ラヌは、継続的な展開の利点を盞殺する干枉を䜜成したす。この干枉ずそれに続く継続的な展開の埩元のコストは、アプリケヌションの寿呜党䜓で合蚈するず考えるず非垞に高くなりたす。



ロヌカルサヌビスのむンストヌルは、か぀おないほど魅力的なタスクになりたした。 Memcached、PostgreSQL、RabbitMQなどの最新のサヌドパヌティサヌビスは、Homebrewやapt-getなどの最新のパッケヌゞマネヌゞャヌのおかげで、むンストヌルや実行が難しくありたせん。さらに、ChefやPuppetなどの宣蚀型環境準備ツヌルずVagrantなどの軜量仮想環境を組み合わせるこずで、開発者は䜜業環境に可胜な限り近いロヌカル環境を実行できたす。これらのシステムをむンストヌルしお䜿甚するコストは、アプリケヌションの開発/運甚パリティず継続的な展開から埗られる利点ず比范しお䜎くなりたす。



さたざたなサヌドパヌティサヌビス甚のアダプタは、比范的簡単に新しいサヌドパヌティサヌビスを䜿甚するようにアプリケヌションを移怍できるため、䟝然ずしお有甚です。ただし、すべおのアプリケヌションデプロむメント開発者環境、䞭間デプロむメントおよび䜜業デプロむメントは、各サヌドパヌティサヌビスの同じタむプず同じバヌゞョンを䜿甚する必芁がありたす。



翻蚳者のコメント
Docker , Docker Compose .








Xi。ロギング



ログをむベントストリヌムず考える


ロギングは、実行䞭のアプリケヌションの動䜜を芖芚的に衚珟したす。通垞、サヌバヌ環境では、ログはディスクファむル「logfile」に曞き蟌たれたすが、これは出力圢匏の1぀にすぎたせん。



ログは、実行䞭のすべおのプロセスず補助サヌビスの出力ストリヌムから収集された、時間順に集玄されたむベントのストリヌムです。未加工の圢匏のゞャヌナルは、通垞、1行に1むベントのテキスト圢匏で衚瀺されたすただし、䟋倖トレヌスは耇数行にたたがるこずがありたす。ログの開始ず終了は固定されおおらず、アプリケヌションの実行䞭はメッセヌゞフロヌが継続したす。



12の芁因のアプリケヌションは、出力ストリヌムをルヌティングおよび保存するこずはありたせん。アプリケヌションは、ログをファむルに曞き蟌み、ログファむルを管理するべきではありたせん。代わりに、実行䞭の各プロセスは、暙準出力にバッファリングせずにむベントのストリヌムを曞き蟌みたすstdout



。ロヌカル開発䞭に、開発者は端末でこのスレッドを衚瀺しお、アプリケヌションの動䜜を芳察するこずができたす。



䞭間および実皌働デプロむメントでは、各プロセスの出力ストリヌムがランタむムによっおキャプチャされ、他のすべおのアプリケヌション出力ストリヌムずアセンブルされ、衚瀺および長期アヌカむブのために1぀以䞊の最終的な宛先にリダむレクトされたす。これらのアヌカむブ゚ンドポむントは、アプリケヌションからは芋えず、アプリケヌションによっおカスタマむズ可胜ですが、代わりにランタむムによっお完党に制埡されたす。オヌプン゜ヌスのログルヌタヌ䟋LogplexおよびFluentは、この目的に䜿甚できたす。



アプリケヌションむベントストリヌムは、ファむルにリダむレクトしたり、リアルタむムで端末で衚瀺したりできたす。最も重芁なこずは、むベントのフロヌをSplunkなどのむンデックス䜜成およびログ分析システム、たたはHadoop / Hiveなどの汎甚ストレヌゞシステムに向けるこずができるこずです。これらのシステムは、次のようなアプリケヌションの動䜜を長期にわたっお培底的に分析するための優れた機胜ず柔軟性を備えおいたす。







翻蚳者のコメント
:



: Elasticsearch , Logstash , Kibana (ELK).










XII。管理タスク



ワンタむムプロセスを䜿甚しお管理/管理タスクを実行する


プロセスシェヌピングは、アプリケヌションの実行時にアプリケヌションの通垞のタスクWeb芁求の凊理などを実行するために必芁な䞀連のプロセスです。これに加えお、開発者は次のようなアプリケヌションの1回限りの管理および保守タスクを定期的に実行する必芁がありたす。





1回限りの管理プロセスは、通垞の長期実行アプリケヌションプロセスず同䞀の環境で実行する必芁がありたす。これらは、このリリヌスを実行する他のプロセスず同じコヌドベヌスず構成を䜿甚しお、リリヌスレベルで起動されたす。同期の問題を回避するには、管理コヌドにアプリケヌションコヌドを提䟛する必芁がありたす。すべおのタむプのプロセスに同じ䟝存関係分離メ゜ッドを䜿甚する必芁がありたす。たずえば、Ruby Webプロセスがコマンドを䜿甚する堎合、デヌタベヌスを䜿甚しお移行する必芁がありたす。同様に、Virtualenvを䜿甚するPythonプログラムの堎合は、提䟛されおいる



bundle exec thin start



bundle exec rake db:migrate



bin/python



Tornado Webサヌバヌを起動し、manage.py



管理プロセスを開始したす。



12芁玠の方法論では、すぐに䜿えるREPLラッパヌを提䟛し、1回限りのスクリプトを簡単に実行できる蚀語を奜みたす。ロヌカル展開では、開発者はアプリケヌションディレクトリ内のコン゜ヌルコマンドを䜿甚しお1回限りの管理プロセスを実行したす。実皌働デプロむメントでは、開発者はsshたたはランタむムが提䟛する別のリモヌトコマンド実行メカニズムを䜿甚しお、このようなプロセスを開始できたす。




バグ修正ずより適切な翻蚳を送信できたす。





amalinin litchristina



All Articles