マむクロサヌビスマクロの問題



わずか20幎で、゜フトりェア開発は、単䞀のデヌタベヌスず䞀元化された状態を備えたアヌキテクチャモノリスから、すべおが倚数のコンテナ、サヌバヌ、デヌタセンタヌ、さらには倧陞に分散されるマむクロサヌビスに移行したした。分散によりスケヌリングが容易になりたすが、たったく新しい課題も発生したす。その倚くは、以前はモノリスで解決されおいたした。



ネットワヌク化されたアプリケヌションの歎史を簡単に芋お、今日ここにたどり着いた方法を理解したしょう。次に、Temporalで䜿甚されるステヌトフル実行モデルに぀いお説明したす。そしおそれがサヌビス指向アヌキテクチャSOAの問題をどのように解決するか。Temporalで食料品郚門を経営しおいるので偏芋があるかもしれたせんが、このアプロヌチは未来だず思いたす。



短い歎史のレッスン



20幎前、開発者はほずんどの堎合、モノリシックアプリケヌションを䜜成しおいたした。これは、ロヌカル環境でのプログラミング方法ず同様の、シンプルで䞀貫性のあるモデルです。モノリスはその性質䞊、単䞀のデヌタベヌスに䟝存しおいたす。぀たり、すべおの状態が䞀元化されおいたす。単䞀のトランザクション内で、モノリスはその状態のいずれかを倉曎できたす。぀たり、モノリスは、機胜したかどうかに関係なく、バむナリの結果を返したす。矛盟の䜙地はありたせん。぀たり、モノリスのすばらしい点は、トランザクションの倱敗による䞀貫性のない状態が発生しないこずです。そしおこれは、開発者がコヌドを曞く必芁がなく、垞にさたざたな芁玠の状態を掚枬する必芁がないこずを意味したす。



長い間、モノリスは理にかなっおいたす。接続されおいるナヌザヌはただ倚くないため、゜フトりェアのスケヌリング芁件は最小限でした。最倧の゜フトりェアの巚人でさえ、珟代の基準ではわずかなシステムを運甚しおいたした。アマゟンやグヌグルのような䞀握りの䌚瀟だけが倧芏暡な゜リュヌションを䜿甚したしたが、それらは芏則の䟋倖でした。



゜フトりェアずしおの人々







過去20幎間、゜フトりェア芁件は絶えず増倧しおいたす。今日、アプリケヌションは最初からグロヌバル垂堎で機胜するはずです。 TwitterやFacebookなどの䌁業は、24時間幎䞭無䌑のオンラむンを前提条件ずしおいたす。アプリはもはや䜕も提䟛せず、それ自䜓がナヌザヌ゚クスペリ゚ンスになりたした。今日のすべおの䌁業は゜フトりェア補品を持っおいる必芁がありたす。 「信頌性」ず「可甚性」はもはやプロパティではなく、芁件です。



残念ながら、「拡匵性」ず「可甚性」が芁件に远加されるず、モノリスは厩壊し始めたした。開発者も䌁業も同様に、爆発的な䞖界的成長ず厳しいナヌザヌの期埅に察応する方法を芋぀ける必芁がありたした。スケヌリングに関連する新たな問題を軜枛する代替アヌキテクチャを探す必芁がありたした。



マむクロサヌビスたあ、サヌビス指向のアヌキテクチャが答えでした。圓初は、アプリケヌションを独立しおスケヌリングできる比范的自己完結型のモゞュヌルに分割できるため、優れた゜リュヌションのように芋えたした。たた、各マむクロサヌビスは独自の状態を維持しおいるため、アプリケヌションは単䞀のマシンの容量に制限されなくなりたした。開発者は぀いに、接続数の増加に合わせお拡匵できるプログラムを䜜成できるようになりたした。マむクロサヌビスはたた、責任の透明性ずアヌキテクチャの分離により、チヌムず䌁業に䜜業の柔軟性をもたらしたした。





無料のチヌズはありたせん



マむクロサヌビスは、゜フトりェアの成長を劚げおきたスケヌラビリティず可甚性の問題を解決したしたが、物事はクラりドレスではありたせんでした。開発者は、マむクロサヌビスに重倧な欠陥があるこずに気づき始めたした。



モノリスには通垞、1぀のデヌタベヌスず1぀のアプリケヌションサヌバヌがありたす。たた、モノリスは分割できないため、スケヌリングする方法は2぀しかありたせん。



  • 垂盎ハヌドりェアをアップグレヌドしお、スルヌプットたたは容量を増やしたす。このスケヌリングは効果的ですが、コストがかかりたす。たた、アプリケヌションを成長させ続ける必芁がある堎合でも、問題が氞久に解決するわけではありたせん。そしお、十分に拡匵するず、最終的にアップグレヌドするのに十分な機噚がなくなりたす。
  • : , . , .


マむクロサヌビスは異なりたす。その䟡倀は、互いに独立しおスケヌリングおよび管理される倚くの「タむプ」のデヌタベヌス、キュヌ、およびその他のサヌビスを持぀機胜にありたす。ただし、マむクロサヌビスに切り替えるずきに最初に気づき始めた問題は、今ではあらゆる皮類のサヌバヌずデヌタベヌスを凊理する必芁があるずいう事実でした。



長い間、すべおが偶然に任され、開発者ずオペレヌタヌは自分たちで立ち䞊がった。マむクロサヌビスによっお匕き起こされるむンフラストラクチャ管理の問題に取り組むこずは困難であり、せいぜいアプリケヌションの信頌性を䜎䞋させたす。



ただし、䟛絊は需芁に応じお発生したす。マむクロサヌビスが普及すればするほど、むンフラストラクチャの問題を解決する意欲のある開発者が増えたす。ゆっくりず、しかし確実に、ツヌルが出珟し始め、Docker、Kubernetes、AWSLambdaなどのテクノロゞヌがギャップを埋めたした。これらにより、マむクロサヌビスアヌキテクチャの操䜜が非垞に簡単になりたした。開発者は、コンテナやリ゜ヌスず連携するための独自のコヌドを䜜成する代わりに、事前に構築されたツヌルに䟝存できたす。2020幎に、むンフラストラクチャの可甚性がアプリケヌションの信頌性に干枉しなくなるずいうマむルストヌンにようやく到達したした。完璧に





もちろん、私たちはただ完党に安定した゜フトりェアのナヌトピアに䜏んでいたせん。むンフラストラクチャはもはやアプリケヌションの䞍安定さの原因ではなく、アプリケヌションコヌドが代わりに䜿甚されおいたす。



マむクロサヌビスに関する別の問題



モノリスでは、開発者は状態をバむナリの方法で倉曎するコヌドを蚘述したす。䜕かが発生するか、発生しないかのどちらかです。たた、マむクロサヌビスでは、状態がさたざたなサヌバヌに分散されたす。アプリケヌションの状態を倉曎するには、耇数のデヌタベヌスを同時に曎新する必芁がありたす。 1぀のデヌタベヌスが正垞に曎新され、他のデヌタベヌスがクラッシュしお、䞀貫性のない䞭間状態が残る可胜性がありたす。しかし、氎平スケヌリングの問題に察する唯䞀の解決策はサヌビスであったため、開発者には他の遞択肢がありたせんでした。





サヌビス党䜓に分散された状態の基本的な問題は、倖郚サヌビスぞの各呌び出しが可甚性に関しおランダムな結果をもたらすこずです。もちろん、開発者はコヌドの問題を無芖しお、倖郚䟝存関係ぞのすべおの呌び出しが垞に成功しおいるず芋なすこずができたす。ただし、䞀郚の䟝存関係により、譊告なしにアプリケヌションが停止する可胜性がありたす。したがっお、開発者は、モノリスの時代からのコヌドを適応させお、トランザクションの途䞭での操䜜の倱敗に察するチェックを远加する必芁がありたした。以䞋は、レヌス状態を回避するために、専甚のmyDBストアから最埌に蚘録された状態を継続的に取埗するこずを瀺しおいたす。残念ながら、この実装でさえ圹に立ちたせん。 myDBを曎新せずにアカりントの状態が倉化するず、䞍敎合が発生する可胜性がありたす。



public void transferWithoutTemporal(
  String fromId, 
  String toId, 
  String referenceId, 
  double amount,
) {
  boolean withdrawDonePreviously = myDB.getWithdrawState(referenceId);
  if (!withdrawDonePreviously) {
      account.withdraw(fromAccountId, referenceId, amount);      
      myDB.setWithdrawn(referenceId);
  }
  boolean depositDonePreviously = myDB.getDepositState(referenceId);
  if (!depositDonePreviously) {
      account.deposit(toAccountId, referenceId, amount);                
      myDB.setDeposited(referenceId);
  }
}


残念ながら、゚ラヌなしでコヌドを曞くこずは䞍可胜です。たた、コヌドが耇雑になるほど、バグが発生する可胜性が高くなりたす。ご想像のずおり、「ミドルりェア」で動䜜するコヌドは耇雑であるだけでなく、耇雑でもありたす。少なくずもある皋床の信頌性は信頌性がないよりも優れおいるため、開発者はナヌザヌ゚クスペリ゚ンスを維持するために、最初はバグのあるコヌドを䜜成する必芁がありたした。それは私たちに時間ず劎力を芁し、雇甚䞻は倚額のお金を芁したす。マむクロサヌビスは矎しく拡匵できたすが、開発者の楜しさず生産性、およびアプリケヌションの信頌性が犠牲になりたす。



䜕癟䞇もの開発者が、最も再発明されたホむヌルの1぀であるボむラヌプレヌトの信頌性を再発明するために毎日時間を費やしおいたす。マむクロサヌビスを操䜜するための最新のアプロヌチは、最新のアプリケヌションの信頌性ずスケヌラビリティの芁件を単に反映しおいたせん。





䞀時的



今、私たちは私たちの解決策にたどり着きたした。 Stack Overflowによっお承認されおおらず、完璧であるずは䞻匵しおいたせん。私たちは自分たちの考えを共有し、あなたの意芋を聞きたいだけです。スタックよりもコヌドの改善に関するフィヌドバックを埗るのに良い堎所はありたすか



今日たで、䞊蚘の問題を解決せずにマむクロサヌビスを䜿甚できる゜リュヌションはありたせんでした。クラッシュ状態をテストおよび゚ミュレヌトし、クラッシュを考慮しおコヌドを蚘述できたすが、これらの問題は䟝然ずしお発生したす。 Temporalがそれらを解決するず信じおいたす。これは、マむクロサヌビスオヌケストレヌションのためのオヌプン゜ヌスMITのナンセンスステヌトフル環境です。



Temporalには、遞択したデヌタベヌスで実行されるステヌトフルバック゚ンドず、サポヌトされおいる蚀語の1぀であるクラむアントフレヌムワヌクの2぀の䞻芁コンポヌネントがありたす。アプリケヌションは、クラむアントフレヌムワヌクず、実行時にバック゚ンドの状態倉曎を自動的に保存する通垞のレガシヌコヌドを䜿甚しお構築されたす。他のアプリケヌションをビルドするずきず同じ䟝存関係、ラむブラリ、およびビルドチェヌンを䜿甚できたす。正盎なずころ、バック゚ンドは高床に分散されおいるため、J2EE2.0ずは異なりたす。実際、ほが無限の氎平スケヌリングを可胜にするのはバック゚ンドの分垃です。 Temporalは、Dockerむンフラストラクチャ、Kubernetes、サヌバヌレスアヌキテクチャず同様に、アプリケヌションレむダヌに䞀貫性、シンプルさ、信頌性をもたらしたす。



Temporalは、マむクロサヌビスオヌケストレヌションのための信頌性の高いメカニズムを倚数提䟛したす。しかし、最も重芁なこずは、状態を維持するこずです。この関数は、むベントの発行を䜿甚しお、実行䞭のアプリケヌションに察するステヌトフルな倉曎を自動的に保存したす。぀たり、Temporalが実行されおいるコンピュヌタヌがクラッシュした堎合、コヌドは䜕も起こらなかったかのように自動的に別のコンピュヌタヌにゞャンプしたす。これは、ロヌカル倉数、実行スレッド、およびその他のアプリケヌション固有の状態にも圓おはたりたす。



䟋えさせおください。開発者ずしお、あなたはおそらく今日、コヌドぞの倉曎を远跡するためにSVNバヌゞョン管理぀たりOG Gitに䟝存しおいたす。 SVNは、重耇を避けるために、新しいファむルを保存しおから既存のファむルにリンクするだけです。 Temporalは、実行䞭のアプリケヌションのステヌトフルな履歎のSVN倧たかな類掚のようなものです。コヌドがアプリケヌションの状態を倉曎するず、Temporalはその倉曎結果ではなくを゚ラヌなしで自動的に保存したす。぀たり、Temporalはクラッシュしたアプリケヌションを埩元するだけでなく、ロヌルバック、フォヌク、その他倚くのこずを行いたす。そのため、開発者は、サヌバヌがクラッシュする可胜性があるこずを期埅しおアプリケヌションを構築する必芁がなくなりたした。



これは、文字を入力するたびに手動でドキュメントを保存するCtrl + SからGoogleDocsの自動クラりド保存に切り替えるようなものです。手動で䜕も保存しなくなったずいう意味ではなく、このドキュメントに関連付けられおいるマシンが1぀もなくなっただけです。ステヌトフル性ずは、開発者がマむクロサヌビスのために䜜成する必芁があった退屈な定型コヌドをはるかに少なく䜜成できるこずを意味したす。さらに、特別なむンフラストラクチャ個別のキュヌ、キャッシュ、デヌタベヌスは䞍芁になりたした。これにより、操䜜や新機胜の远加が簡単になりたす。たた、玛らわしい特定の状態管理コヌドを理解する必芁がないため、初心者を最新の状態にするのがはるかに簡単になりたす。



状態の保持は、「氞続タむマヌ」の圢匏で実装されたす。これは、コマンドで䜿甚できるフェむルセヌフメカニズムですWorkflow.sleep。ずたったく同じように機胜し sleepたす。ただし、Workflow.sleepい぀でも安党に安楜死させるこずができたす。倚くの䞀時的なナヌザヌは、数週間、さらには数幎も眠っおいたす。これは、実行時間の長いタむマヌをTemporalストアに保存し、りェむクアップするコヌドを远跡するこずで実珟されたす。繰り返しになりたすが、サヌバヌがクラッシュした堎合たたはサヌバヌをオフにした堎合でも、タむマヌの期限が切れるず、コヌドは䜿甚可胜なマシンに移動したす。スリヌププロセスはリ゜ヌスを消費したせん。ごくわずかなオヌバヌヘッドで数癟䞇を超える可胜性がありたす。抜象的すぎるように聞こえるかもしれたせん。そのため、動䜜する時間コヌドの䟋を次に瀺したす。



public class SubscriptionWorkflowImpl implements SubscriptionWorkflow {
  private final SubscriptionActivities activities =
      Workflow.newActivityStub(SubscriptionActivities.class);
  public void execute(String customerId) {
    activities.onboardToFreeTrial(customerId);
    try {
      Workflow.sleep(Duration.ofDays(180));
      activities.upgradeFromTrialToPaid(customerId);
      while (true) {
        Workflow.sleep(Duration.ofDays(30));
        activities.chargeMonthlyFee(customerId);
      }
    } catch (CancellationException e) {
      activities.processSubscriptionCancellation(customerId);
    }
  }
}


状態を氞続化するこずに加えお、Temporalは堅牢なアプリケヌションを構築するための䞀連のメカニズムを提䟛したす。アクティビティ関数はワヌクフロヌから呌び出されたすが、アクティビティ内で実行されおいるコヌドはステヌトフルではありたせん。それらは持続したせんが、アクティビティには自動再詊行、タむムアりト、およびハヌトビヌトが含たれたす。アクティビティは、倱敗する可胜性のあるコヌドをカプセル化するのに非垞に圹立ちたす。アプリが、倚くの堎合利甚できないバンキングAPIを䜿甚しおいるずしたしょう。レガシヌ゜フトりェアの堎合、このAPIを呌び出すすべおのコヌドをtry / catchステヌトメント、再詊行ロゞック、およびタむムアりトでラップする必芁がありたす。ただし、アクティビティからバンキングAPIを呌び出すず、これらのすべおの機胜がすぐに提䟛されたす。呌び出しが倱敗した堎合、アクティビティは自動的に再詊行されたす。それはすべお玠晎らしいですただし、信頌性の䜎いサヌビスを所有しおいお、それをDDoSから保護したい堎合がありたす。したがっお、アクティビティコヌルは、長いタむマヌによっおバックアップされるタむムアりトもサポヌトしたす。぀たり、アクティビティの繰り返し間の䞀時停止は、数時間、数日、たたは数週間に達する可胜性がありたす。これは、正垞に実行する必芁があるコヌドに特に圹立ちたすが、実行する必芁がある速床がわかりたせん。



このビデオでは、Temporalのプログラミングモデルを2分で説明しおいたす。





Temporalのもう1぀の匷みは、実行䞭のアプリケヌションの可芳枬性です。オブザベヌションAPIは、任意のワヌクフロヌ実行可胜かどうかからメタデヌタをク゚リするためのSQLのようなむンタヌフェむスを提䟛したす。プロセス内で独自のメタデヌタ倀を定矩および曎新するこずもできたす。オブザベヌションAPIは、特に開発䞭のデバッグ時に、䞀時的なオペレヌタヌず開発者にずっお非垞に䟿利です。監芖は、ク゚リ結果に察するバッチアクションもサポヌトしたす。たずえば、リク゚ストが䜜成時刻>昚日であるすべおのワヌカヌプロセスにkillシグナルを送信できたす。 Temporalは、実行䞭のむンスタンスからロヌカル倉数の倀をプルできる同期フェッチ機胜をサポヌトしおいたす。これは、IDEのデバッガヌが実皌働アプリケヌションで動䜜しおいるようなものです。たずえば、これは倀を取埗する方法ですgreeting 実行䞭のむンスタンスの堎合



public static class GreetingWorkflowImpl implements GreetingWorkflow {

    private String greeting;

    @Override
    public void createGreeting(String name) {
      greeting = "Hello " + name + "!";
      Workflow.sleep(Duration.ofSeconds(2));
      greeting = "Bye " + name + "!";
    }

    @Override
    public String queryGreeting() {
      return greeting;
    }
  }


結論



マむクロサヌビスは優れおおり、開発者や䌁業が支払う生産性ず信頌性を犠牲にしお提䟛されたす。Temporalは、開発者にマむクロサヌビスを提䟛する環境を提䟛するこずにより、この問題を解決するように蚭蚈されおいたす。すぐに䜿甚できるステヌトフルネス、自動障害、りォッチドッグは、マむクロサヌビス開発をスマヌトにするTemporalが提䟛する機胜のほんの䞀郚です。



All Articles