GraphQLフェデレヌションを䜿甚しおMonolithPythonからMicroservicesGoに段階的に移行する方法  

たたは、叀い家の基瀎を厩さないように倉曎する方法







箄10幎前、モノリシック孊習プラットフォヌムの開発にPython2を遞択したした。しかし、それ以来、業界は劇的に倉化したした。 Python 2は 、2020幎1月1日に正匏に 埋葬されたした。で 、以前の 私たちは、Python 3に移行しないこずに決めた理由の蚘事、私たちは説明し 



、毎月圓瀟のプラットフォヌムを䜿甚しお䜕癟䞇人もの人々 。 



Goでバック゚ンドを曞き盎しおアヌキテクチャを倉曎するこずにしたずき、私たちは䞀定のリスクを冒したした。 



Goを遞択した理由はいく぀かありたす。



  1.  é«˜ã„コンパむル速床。
  2. RAMの節玄。
  3. GoをサポヌトするIDEの非垞に幅広い遞択肢。


しかし、私たちはリスクを最小限に抑えるアプロヌチを取りたした。



GraphQL連盟は、



私たちは呚りの私たちの新しいアヌキテクチャを構築するこずを決め GraphQLアポロ連盟。GraphQLは、RESTAPIの代わりにFacebook開発者によっお䜜成されたした。フェデレヌションずは、耇数のサヌビスのための単䞀のゲヌトりェむを構築するこずです。各サヌビスは独自のGraphQLスキヌマを持぀こずができたす。共通のゲヌトりェむは、スキヌマを組み合わせお単䞀のAPIを生成し、同時に耇数のサヌビスのリク゚ストを蚱可したす。 



先に進む前に、次の点に焊点を圓おたいず思いたす。



  1. REST APIずは異なり、各GraphQLサヌバヌには独自の型付きデヌタスキヌマがありたす。これにより、デヌタず必芁な任意のフィヌルドの任意の組み合わせを正確に取埗できたす。



  2. REST APIゲヌトりェむを䜿甚するず、1぀のバック゚ンドサヌビスにのみリク゚ストを送信できたす。GraphQLゲヌトりェむは、任意の数のバック゚ンドサヌビスのク゚リプランを生成し、それらからの遞択を単䞀の汎甚応答で返すこずができたす。


したがっお、システムにGraphQLゲヌトりェむを含めるず、次のようになりたす。





画像のURL     https://lh6.googleusercontent.com/6GBj9z5WVnQnhqI19oNTRncw0LYDJM4U7FpWeGxVMaZlP46IAIcKfYZKTtHcl-bDFomedAoxSa9pFo6pdhL2daxyWNX2ZKVQIgqIIBWHxnXEouzcQhO9_mdf1tODwtti5OEOOFeb 



-䞀枚岩ではないだけで、ゲヌトりェむサヌビスgraphql-ゲヌトりェむ別名は、圓瀟の他のサヌビスぞのク゚リプランGraphQL-ク゚リを䜜成し、送信するための責任がありたす。 Goサヌビスには独自のGraphQLスキヌマがありたす。gqlgenこれはGo甚のGraphQLラむブラリですを䜿甚しお、ク゚リぞの応答を生成し たす。 



GraphQLフェデレヌションは共通のGraphQLスキヌマを提䟛し、ゲヌトりェむはすべおの個別のサヌビススキヌマを1぀にバンドルするため、モノリスは他のサヌビスず同じように盞互䜜甚したす。これが基本的なポむントです。



次に、Apollo GraphQLサヌバヌをカスタマむズしお、モノリスPythonからマむクロサヌビスアヌキテクチャGoに安党に移行する方法に぀いお説明したす 。



サむドバむサむドテスト



GraphQLは、特定のタむプのオブゞェクトずフィヌルドのセットで「考え」たす。着信芁求をどう凊理するか、フィヌルドからどのデヌタをどのように抜出するかを知っおいるコヌドは、リゟルバヌず呌ばれたす。 



割り圓おのデヌタ型の䟋を䜿甚しお、移行プロセスを考えおみたしょう。



123 タむプAssignment {createdDateTime   。}


実際にはもっず倚くのフィヌルドがあるこずは明らかですが、各フィヌルドですべおが同じように芋えたす。



このモノリスフィヌルドをGoで蚘述された新しいサヌビスで衚珟したいずしたす。新しいオンデマンドサヌビスがモノリスず同じデヌタを返すこずをどのように確認できたすかこれを行うには、Scientistラむブラリず同様のアプロヌチを䜿甚したす 。モノリスず新しいサヌビスの䞡方からデヌタを芁求したすが、結果を比范しお、そのうちの1぀だけを返したす。



ステップ1手動モヌド



ナヌザヌがcreatedDateフィヌルドの倀を芁求するず、GraphQLゲヌトりェむは最初にモノリスにアクセスしたすPythonで蚘述されおいるこずを芚えおおいおください。 





最初のステップでは、すでにGoで蚘述されおいる新しい割り圓おサヌビスにフィヌルドを远加できるこずを確認する必芁がありたす。拡匵子が.graphqlのファむルには、次のリゟルバヌコヌドが含たれおいる必芁がありたす。



12345 タむプの割り圓おを拡匵 キヌフィヌルド "id"{idID 倖郚     createdDateTime @migratefrom "python"、state "manual"}


ここでは、フェデレヌションを䜿甚しお、サヌビスがcreatedDateフィヌルドを割り圓おタむプに远加しおいるこずを瀺しおいたす。フィヌルドにはidでアクセスしたす。たた、「秘密の芁玠」である移行ディレクティブも远加したす。これらのディレクティブを理解し、リク゚ストをルヌティングするかどうかを決定するずきにGraphQLゲヌトりェむが䜿甚するいく぀かのスキヌマを䜜成するコヌドを䜜成したした。



手動モヌドでは、芁求はモノリスコヌドにのみアドレス指定されたす。新しいサヌビスを開発するずきは、この可胜性を考慮する必芁がありたす。createdDateフィヌルドの倀を取埗するために、モノリスに盎接プラむマリモヌドでアクセスするか、手動モヌドでGraphQLゲヌトりェむにスキヌマを照䌚するこずができたす。䞡方のオプションが機胜するはずです。



ステップ2サむドバむサむドモヌド



createdDateフィヌルドのリゟルバヌコヌドを蚘述した埌、サむドバむサむドモヌドに切り替えたす。



12345 タむプの割り圓おを拡匵 キヌフィヌルド "id"{idID 倖郚     createdDateTime @migratefrom "python"、state "side-by-side"}


そしお今、ゲヌトりェむはモノリスPythonず新しいサヌビスGoの䞡方にアクセスしたす。結果を比范し、違いがある堎合をログに蚘録し、モノリスからナヌザヌに結果を返したす。



このモヌドは、移行プロセス䞭にシステムにバグが発生しないずいう倧きな自信をもたらしたす。䜕幎にもわたっお、䜕癟䞇ものナヌザヌず「キロトン」のデヌタがフロント゚ンドずバック゚ンドを通過しおきたした。このコヌドが実際の条件でどのように機胜するかを芳察するこずで、たれなケヌスやランダムな倖れ倀もキャプチャされ、安定しお正しく凊理されるこずを確認できたす。



テスト䞭に、そのようなレポヌトを受け取りたす。 





品質を倧幅に損なうこずなく、レむアりト䞭にこの画像を拡倧しおみおください。



それらは、モノリスず新しいサヌビスの運甚に矛盟が芋぀かった堎合に焊点を圓おおいたす。 



最初、私たちはしばしばそのようなケヌスに遭遇したした。時間の経過ずずもに、このような問題を特定し、重倧床を評䟡し、必芁に応じお排陀するこずを孊びたした。



開発サヌバヌを䜿甚するずきは、色の違いを匷調するツヌルを䜿甚したす。これにより、問題の分析ず゜リュヌションのテストが容易になりたす。



突然倉異はどうですか



PythonずGoの䞡方で同じロゞックを実行するかどうか疑問に思われるかもしれたせんが、デヌタをク゚リするだけでなく、デヌタを倉曎するコヌドはどうなりたすかGraphQLの甚語では、これはミュヌテヌションず呌ばれたす。



私たちのサむドバむサむドテストでは、突然倉異は考慮されおいたせん。これを行うためのいく぀かのアプロヌチを怜蚎したした-それらは私たちが思っおいたよりも耇雑であるこずが刀明したした。しかし、私たちは突然倉異の問題そのものを解決するのに圹立぀アプロヌチを開発したした。



ステップ2.5カナリアモヌド



生産段階たで正垞に生き残ったフィヌルドたたは突然倉異がある堎合は、カナリアモヌドを有効にしたす。



12345 タむプの割り圓おを拡匵 キヌフィヌルド "id"{idID 倖郚     createdDateTime @migratefrom "python"、state "canary"}


カナリアフィヌルドずミュヌテヌションは、ごく䞀郚のナヌザヌ向けにGoサヌビスに远加されたす。さらに、プラットフォヌムの内郚ナヌザヌはカナリアスキヌムをテストしおいたす。これは、耇雑な倉曎をテストするためのかなり安党な方法です。䜕かが期埅どおりに機胜しない堎合は、カナリア回路をすばやく無効にするこずができたす。



䞀床に1぀のカナリア回路のみを䜿甚したす。実際には、同時にカナリアモヌドになっおいるフィヌルドず突然倉異は倚くありたせん。ですから、今埌は問題ないず思いたす。スキヌマが非垞に倧きく5000フィヌルドを超える、ゲヌトりェむむンスタンスが3぀のスキヌマプラむマリ、手動、カナリアをメモリに栌玍する必芁があるため、これは適切な劥協案です。



ステップ3移行モヌド



このステップでは、createdDateフィヌルドを移行モヌドにする必芁がありたす。



12345 タむプの割り圓おを拡匵 キヌフィヌルド "id"{idID 倖郚     createdDateTime @migratefrom "python"、state "migrated"}


このモヌドでは、GraphQLゲヌトりェむはGoで蚘述された新しいサヌビスにのみリク゚ストを送信したす。しかし、い぀でもモノリスが同じ芁求をどのように凊理するかを芋るこずができたす。これにより、問題が発生した堎合に倉曎を展開しおロヌルバックするこずがはるかに簡単になりたす。



ステップ4移行を完了する



デプロむが成功するず、このフィヌルドのモノリスコヌドは䞍芁になり、リゟルバヌコヌドから@migrateディレクティブを削陀したす。



12345 タむプの割り圓おを拡匵 キヌフィヌルド "id"{idID 倖郚     createdDate時間}


今埌、ゲヌトりェむは、Assignment.createdDate匏を、Goで蚘述された新しいサヌビスからフィヌルド倀を取埗するものずしお解釈したす。



これがむンクリメンタル移行です。



そしお、私たちはどこたで行ったのでしょうか



今幎、サむドバむサむドのテストむンフラストラクチャを完成させたした。これにより、安党に、ゆっくりず、しかし確実に䞀連のGoコヌドを曞き盎すこずができたした。幎間を通じお、システム内のトラフィックの増加を背景に、プラットフォヌムの高可甚性を維持しおきたした。この蚘事の執筆時点では、GraphQLフィヌルドの玄40がGoサヌビスに移動されおいたす。したがっお、説明したアプロヌチは、移行プロセスでうたく機胜したした。



プロゞェクトが完了した埌でも、アヌキテクチャの倉曎に関連する他のタスクにこのアプロヌチを匕き続き䜿甚できたす。



PS Steve Coffmanがこのトピックに぀いお講挔したした Google Open Source Liveで。あなたは録音を芋るこずができたす このYouTubeトヌクたたはプレれンテヌションを芋るだけ 。






Macleodのクラりドサヌバヌ は高速で安党です。



䞊蚘のリンクを䜿甚するか、バナヌをクリックしお登録するず、任意の構成のサヌバヌをレンタルした最初の月が10割匕になりたす。






All Articles