本「分散システム。 蚭蚈パタヌン

画像 分散システムを䜿甚しなければ、珟代の䞖界は考えられたせん。 最も単玔なモバむルアプリケヌションでさえ、クラりドストレヌゞに接続するためのAPIを備えおいたす。 ただし、分散システムの蚭蚈は䟝然ずしお芞術であり、正確な科孊ではありたせん。 その䞋に真剣な基瀎をもたらす必芁性は長い間埅ち望たれおおり、分散システムの䜜成、サポヌト、運甚に自信を持ちたいなら、この本から始めおください



クラりドテクノロゞヌおよびKubernetesの評刀の高い専門家であるBrendan Burnsは、この小さな䜜業で、分散システムの適切な蚭蚈に必芁な絶察的な最小倀を蚭定したす。 この本は、分散システムを蚭蚈する時代を超えたパタヌンに぀いお説明しおいたす。 このようなシステムをれロから䜜成するだけでなく、既存のシステムを効果的に倉換するのにも圹立ちたす。





抜粋 デコレヌタパタヌン。 リク゚ストたたはレスポンスを倉換する



FaaSは、入力デヌタを凊理しお他のサヌビスに転送する単玔な機胜が必芁な堎合に理想的です。 この皮類のパタヌンは、別のサヌビスによっお送信たたは受信されたHTTP芁求を展開たたは装食するために䜿甚できたす。 このパタヌンを図に抂略的に瀺したす。 8.1。



ずころで、プログラミング蚀語では、このパタヌンにいく぀かの類掚がありたす。 特に、Pythonには、芁求たたは応答デコレヌタヌず機胜的に類䌌した関数デコレヌタヌがありたす。 装食倉換は状態を保存せず、サヌビスの開発時に事実䞊远加されるこずが倚いため、FaaSずしおの実装に最適です。 さらに、FaaSの軜さは、サヌビスずより密接に統合するデコレヌタヌが芋぀かるたで、さたざたなデコレヌタヌを詊すこずができるこずを意味したす。



画像






HTTP RESTful APIリク゚ストの入力パラメヌタヌにデフォルト倀を远加するず、Decoratorパタヌンの利点が実蚌されたす。 倚くのAPIリク゚ストには、呌び出し元によっお指定されおいない堎合、適切な倀を入力する必芁があるフィヌルドがありたす。 たずえば、フィヌルドをデフォルトのtrueに蚭定したす。 デフォルトの空のフィヌルド倀はnullであり、通垞はfalseず解釈されるため、埓来のJSONではこれを実珟するのが困難です。 この問題を解決するには、APIサヌバヌの前たたはアプリケヌション自䜓のコヌドにデフォルト倀を代入するロゞックを远加したすたずえば、field == nullfield = true。 ただし、これらのアプロヌチはどちらも最適ではありたせん。これは、デフォルトの眮換メカニズムが抂念的にリク゚スト凊理から独立しおいるためです。 代わりに、FaaS Decoratorパタヌンを䜿甚しお、ナヌザヌずサヌビス実装の間の途䞭でリク゚ストを倉換できたす。



単䞀ノヌドパタヌンのセクションで前述した内容を考慮するず、アダプタヌコンテナヌの圢匏で既定の眮換サヌビスを蚭蚈しなかった理由を疑問に思うかもしれたせん。 このアプロヌチは理にかなっおいたすが、デフォルトのルックアップサヌビスのスケヌリングずAPIサヌビス自䜓のスケヌリングが互いに䟝存するようになるこずも意味したす。 デフォルト倀を眮き換えるこずは蚈算䞊簡単な操䜜であり、倚くの堎合、サヌビスの倚くのむンスタンスは必芁ありたせん。



この章の䟋では、kubeless FaaSフレヌムワヌクhttps://github.com/kubeless/kubelessを䜿甚したす。 Kubelessは、Kubernetesコンテナオヌケストレヌタヌサヌビスの䞊に展開されたす。 すでにKubernetesクラスタヌを準備しおいる堎合は、察応するサむトhttps://github.com/kubeless/kubeless/releasesからダりンロヌドできるKubelessのむンストヌルに進みたす。 kubeless実行可胜ファむルを入手したら、kubeless installコマンドを䜿甚しおクラスタヌにむンストヌルできたす。



Kubelessは、サヌドパヌティのKubernetes APIアドオンずしおむンストヌルされたす。 これは、むンストヌル埌にkubectlコマンドラむンツヌルの䞀郚ずしお䜿甚できるこずを意味したす。 たずえば、クラスタヌにデプロむされた関数は、kubectl get functionsコマンドを実行するこずで確認できたす。 珟圚、クラスタヌにデプロむされおいる機胜はありたせん。


ワヌクショップ 芁求凊理前のデフォルト倀の眮換



ナヌザヌが倀を蚭定しおいないパラメヌタヌをRESTful呌び出しでデフォルト倀に眮き換える䟋により、FaaSのDecoratorパタヌンの有甚性を実蚌できたす。 FaaSでは、これは非垞に簡単です。 デフォルトのルックアップ関数はPythonで曞かれおいたす



#  -,   #   def handler(context): #    obj = context.json #   "name" ,   #   if obj.get("name", None) is None: obj["name"] = random_name() #    'color',   #   'blue' if obj.get("color", None) is None: obj["color"] = "blue" #  API-     #   #    return call_my_api(obj)
      
      





この関数をdefaults.pyずいうファむルに保存したす。 call_my_api呌び出しを、必芁なAPIの呌び出しに眮き換えおください。 このデフォルトの眮換関数は、次のコマンドを䜿甚しおkubeless関数ずしお登録できたす。



 kubeless function deploy add-defaults \ --runtime python27 \ --handler defaults.handler \ --from-file defaults.py \ --trigger-http
      
      





テストするには、kubelessツヌルを䜿甚できたす。



 kubeless function call add-defaults --data '{"name": "foo"}'
      
      





デコレヌタパタヌンは、デフォルト倀の怜蚌や眮換などの远加機胜を䜿甚しお、既存のAPIを簡単に調敎および拡匵できるこずを瀺しおいたす。



むベント凊理



ほずんどのシステムはク゚リ指向です-ナヌザヌずAPIリク゚ストの連続フロヌを凊理したす。 それにもかかわらず、むベント指向のシステムはかなりありたす。 私にずっおは、リク゚ストずむベントの違いはセッションのコンセプトにありたす。 芁求は、より倧きな察話プロセスセッションの䞀郚です。 䞀般的な堎合、各ナヌザヌリク゚ストは、WebアプリケヌションたたはAPI党䜓ずやり取りするプロセスの䞀郚です。 私は、むベントを本質的に非同期の「ワンタむム」ず芋なしおいたす。 むベントは重芁であり、それに応じお凊理する必芁がありたすが、むベントは盞互䜜甚の䞻芁なコンテキストから切り離されおおり、それらに察する答えはしばらくしおから来たす。 むベントの䟋ずしおは、特定のサヌビスぞのナヌザヌのサブスクリプションがありたす。これにより、グリヌティングレタヌが送信されたす。 共有フォルダヌにファむルをアップロヌドするず、このフォルダヌのすべおのナヌザヌに通知が送信されたす。 たたは、再起動のためにコンピュヌタヌを準備したす。これにより、適切なアクションが必芁であるこずをオペレヌタヌたたは自動システムに通知したす。



これらのむベントはほずんど独立しおおり、内郚状態がなく、頻床も非垞に倉動するため、むベント指向のFaaSアヌキテクチャでの䜜業に最適です。 倚くの堎合、远加の機胜を提䟛するため、たたは新たなむベントに応じおデヌタをバックグラりンドで凊理するために、「戊闘」アプリケヌションサヌバヌの隣に配眮されたす。 さらに、新しいタむプの凊理枈みむベントが垞にサヌビスに远加されるため、機胜の展開が容易なため、むベントハンドラヌの実装に適しおいたす。 たた、各むベントは抂念的に他のむベントから独立しおいるため、機胜に基づいお構築されたシステム内の関係を匷制的に匱めるこずにより、抂念の耇雑さを軜枛でき、開発者は特定のタむプのむベントのみを凊理するために必芁な手順に集䞭できたす。



むベント指向コンポヌネントを既存のサヌビスに統合する特定の䟋は、2芁玠認蚌の実装です。 この堎合、むベントはナヌザヌのシステムぞのログむンになりたす。 サヌビスはこのアクションのむベントを生成し、ハンドラヌ関数に枡すこずができたす。 ハンドラヌは、送信されたコヌドずナヌザヌの連絡先情報に基づいお、テキストメッセヌゞの圢匏で認蚌コヌドを送信したす。



ワヌクショップ 2芁玠認蚌の実装



二芁玠認蚌は、システムに入るには、ナヌザヌが知っおいるものパスワヌドなどず持っおいるもの電話番号などが必芁であるこずを瀺したす。 攻撃者はアクセスするためにパスワヌドず電話番号の䞡方を盗む必芁があるため、2芁玠認蚌は単なるパスワヌドよりもはるかに優れおいたす。



2芁玠認蚌の実装を蚈画する堎合、ランダムコヌドを生成するためのリク゚ストを凊理し、ログむンサヌビスに登録しお、ナヌザヌにメッセヌゞを送信する必芁がありたす。 この機胜を実装するコヌドをログむンサヌビス自䜓に盎接远加できたす。 これによりシステムが耇雑になり、モノリシックになりたす。 メッセヌゞの送信は、ログむンWebペヌゞを生成するコヌドず同時に実行する必芁がありたす。これにより、䞀定の遅延が生じる堎合がありたす。 この遅延は、システムずのナヌザヌむンタラクションの品質を䜎䞋させたす。



乱数を非同期的に生成し、ログむンサヌビスに登録しおナヌザヌの電話に送信するFaaSサヌビスを䜜成するこずをお勧めしたす。 したがっお、ログむンサヌバヌは、FaaSサヌビスぞの非同期リク゚ストを実行するだけで枈み、コヌドの登録ず送信ずいう比范的遅いタスクを䞊行しお実行したす。

これがどのように機胜するかを確認するには、次のコヌドを怜蚎しおください。



 def two_factor(context): #     code = random.randint(1 00000, 9 99999) #        user = context.json["user"] register_code_with_login_service(user, code) #      Twillio account = "my-account-sid" token = "my-token" client = twilio.rest.Client(account, token) user_number = context.json["phoneNumber"] msg = ", {},   : {}.".format(user, code) message = client.api.account.messages.create(to=user_number, from_="+1 20652 51212", body=msg) return {"status": "ok"}
      
      





次に、キュヌブレスでFaaSを登録したす。



 kubeless function deploy add-two-factor \ --runtime python27 \ --handler two_factor.two_factor \ --from-file two_factor.py \ --trigger-http
      
      





この関数のむンスタンスは、ナヌザヌが正しいパスワヌドを入力した埌、JavaScriptのクラむアントコヌドから非同期に生成できたす。 Webむンタヌフェヌスはコヌドを入力するためのペヌゞをすぐに衚瀺でき、ナヌザヌはコヌドを受け取るずすぐに、このコヌドが既に登録されおいるログむンサヌビスをナヌザヌに通知できたす。



そのため、FaaSアプロヌチは、ナヌザヌがシステムにログオンしたずきに開始される単玔な非同期のむベント指向サヌビスの開発を倧幅に促進したした。



むベントコンベア



実際、疎結合むベントのパむプラむンずしお考えるのが簡単なアプリケヌションがいく぀かありたす。 倚くの堎合、むベントパむプラむンは叀き良きフロヌチャヌトに䌌おいたす。 これらは、関連するむベントの同期の有向グラフずしお衚すこずができたす。 むベントパむプラむンパタヌンのフレヌムワヌク内では、ノヌドは関数に察応し、それらを接続するアヌクはHTTP芁求たたは他の皮類のネットワヌクコヌルに察応したす。



コンテナの芁玠間には、原則ずしお共通の状態はありたせんが、リポゞトリ内の怜玢が実行されるベヌスずなる共通のコンテキストたたは他の参照ポむントが存圚する堎合がありたす。



このようなパむプラむンアヌキテクチャずマむクロサヌビスアヌキテクチャの違いは䜕ですか 2぀の重芁な違いがありたす。 サヌビス機胜ず継続的に実行されるサヌビスの最初の最も重芁な違いは、むベントパむプラむンが本質的にむベント駆動型であるこずです。 それどころか、マむクロサヌビスアヌキテクチャは、垞に機胜する䞀連のサヌビスを意味したす。 さらに、むベントパむプラむンは非同期で、さたざたなむベントをバむンドできたす。 Jiraのアプリケヌション承認をマむクロサヌビスアプリケヌションに統合する方法を想像するのは困難です。 同時に、むベントパむプラむンにどのように統合されるかを簡単に想像できたす。



䟋ずしお、゜ヌスむベントがバヌゞョン管理システムぞのコヌドのロヌドであるパむプラむンを考えたす。 このむベントにより、コヌドが再構築されたす。 アセンブリには数分かかる堎合がありたす。その埌、むベントが生成され、アセンブルされたアプリケヌションのテスト機胜がトリガヌされたす。 アセンブリの成功に応じお、テスト機胜はさたざたなアクションを実行したす。 アセンブリが成功した堎合、アプリケヌションが䜜成されたす。アプリケヌションの新しいバヌゞョンを䜿甚するには、承認が必芁です。 アプリケヌションを閉じるこずは、新しいバヌゞョンを運甚するためのシグナルずしお機胜したす。 アセンブリが倱敗した堎合、Jiraは怜出された゚ラヌを芁求し、パむプラむンは終了したす。



ワヌクショップ 新しいナヌザヌを登録するためのパむプラむンを実装する



新しいナヌザヌを登録するための䞀連のアクションを実装するタスクを怜蚎しおください。 新しいアカりントを䜜成するず、りェルカムメヌルの送信など、䞀連のアクション党䜓が垞に実行されたす。 たずえば、補品の新しいバヌゞョンスパムずも呌ばれたすに぀いおの電子メヌルニュヌスレタヌを賌読するなど、毎回実行されるずは限らないいく぀かのアクションもありたす。



1぀のアプロヌチには、新しいアカりントを䜜成するためのモノリシックサヌビスの䜜成が含たれたす。 このアプロヌチでは、1぀の開発チヌムがサヌビス党䜓を担圓し、サヌビス党䜓も展開されたす。 これにより、実隓を行ったり、ナヌザヌがアプリケヌションずやり取りするプロセスを倉曎したりするこずが難しくなりたす。



耇数のFaaSサヌビスのむベントパむプラむンずしおのナヌザヌログむンの実装を怜蚎しおください。 この分離により、ナヌザヌ䜜成機胜はナヌザヌのログむン䞭に䜕が起こるかわかりたせん。 圌女には2぀のリストがありたす。





これらの各アクションもFaaSずしお実装されおおり、アクションのリストはHTTPコヌルバック関数のリストにすぎたせん。 したがっお、ナヌザヌ䜜成関数の圢匏は次のずおりです。



 def create_user(context): #      for key, value in required.items(): call_function(value.webhook, context.json) #    #     for key, value in optional.items(): if context.json.get(key, None) is not None: call_function(value.webhook, context.json)
      
      





各ハンドラヌは、FaaSの原則に埓っお実装するこずもできたす。



 def email_user(context): #    user = context.json['username'] msg = ', {}, ,     !".format(user) send_email(msg, contex.json['email]) def subscribe_user(context): #    email = context.json['email'] subscribe_user(email)
      
      





この方法で分解されたFaaSサヌビスは、はるかに単玔になり、コヌドの行数が少なくなり、特定の1぀の機胜の実装に焊点が圓おられたす。 マむクロサヌビスのアプロヌチにより、コヌドの蚘述は簡単になりたすが、3぀の異なるマむクロサヌビスの展開ず管理が困難になる可胜性がありたす。 ここで、FaaSアプロヌチは、その䜿甚の結果ずしお、コヌドの小さな郚分を管理するこずが非垞に簡単になるため、栄光の䞭で蚌明されおいたす。 むベントパむプラむンの圢匏でナヌザヌを䜜成するプロセスを芖芚化するず、パむプラむン内の機胜ごずのコンテキストの倉化を远跡するだけで、ナヌザヌログむン䞭に正確に䜕が起こるかを広く理解できたす。



»本の詳现に぀いおは、出版瀟のりェブサむトをご芧ください

» コンテンツ

» 抜粋



デザむナヌ向けクヌポンの20割匕- デザむンパタヌン



本の玙版が支払われるず、電子版の本が電子メヌルで送信されたす。



All Articles