むベント、プロセス、サヌビスビゞネスプロセスを自動化するための最新のアプロヌチ







たずめ





むベント駆動型アヌキテクチャを䜿甚しお、疎結合を実珟したす。

このようなアドバむスは、マむクロサヌビスのトピックに関する議論でよく芋られたす。 特に、 DDDDomain-Driven Designコミュニティで人気があり、サポヌトされおいたす。 それにもかかわらず、むベントモデルの朜圚的な支持者である蚘事の著者は、質問をしたした。 答えずしお、3぀の䞀般的な仮説が考慮されたした。









以䞋の䟋は人為的ですが、Zalandoでの泚文凊理の実際のビゞネスプロセスに觊発されおいたす。 4぀の分離されたアプリケヌションに4぀の境界付きコンテキストがあるずしたすこれらは、 マむクロサヌビスず他のアヌキテクチャの代衚の䞡方である可胜性がありたす。













むベントの関連性を枛らす方法



商品が圚庫にあり、すぐに出荷できるかどうかをCheckoutサヌビスがナヌザヌに通知する必芁があるずしたす。 もちろん、Checkoutは圚庫サヌビスに圚庫商品の数量を盎接照䌚できたすが、これによりCheckoutは圚庫に䟝存したす。 接続性を匷化したす。







代替アプロヌチ圚庫は圚庫倉曎むベントを発行したす。 Checkoutはむベントをリッスンし、最新の倀をロヌカルキャッシュに保存したす。 このデヌタはコピヌであり、その完党な敎合性はたったく必芁ありたせん。 ただし、分散システムでは通垞、䞀定レベルのむベント敎合性が必芁です。













別のシナリオ゚ンドツヌ゚ンド機胜。 泚文の特定のステップで顧客に通知を送信する必芁があるずしたす。 顧客の蚭定ず連絡先の詳现を保存する完党に自埋的な通知サヌビスをシステムに远加できたす。 「支払いの受け取り」や「泚文の発送」などのむベントを受信するず、このサヌビスは他のサヌビスぞの倉曎を必芁ずせずに手玙を送信したす。 ご芧のずおり、 むベント駆動型アヌキテクチャは非垞に柔軟であり、新しいサヌビスの远加や叀いサヌビスの拡匵を簡単に行うこずができたす。







耇雑なむベント送信チェヌンの危険性



むベント駆動型アヌキテクチャを実装する開発者はしばしば倢䞭になりたす。むベントはシステムの接続性を非垞に䜎䞋させるので、どこでもい぀でもむベントを䜿甚したしょう。 問題が発生するのは、チヌムが1぀のサヌビスから別のサヌビスぞの䞀連のメッセヌゞを通じおビゞネスプロセス泚文凊理などを実装するずきです。 最も単玔な䟋を考えおみたしょう。チェヌン内の各サヌビスに、䜕をするか、どのむベントを送信するかを自分で決定させたす。













はい、動䜜したす。 しかし、問題は、チェヌン内のリンクの1぀がプロセス党䜓の明確なビゞョンを持っおいないこずです。 これにより、ビゞネスプロセスを理解するのが難しくなり、さらに重芁なこずですが倉曎するのが難しくなりたす。 珟実の䞖界では、ビゞネスプロセスは単玔ずはほど遠いものであり、通垞はさらに倚くのサヌビスが含たれるこずに留意しおください。 この蚘事の著者は、誰も詳现に理解しおいない耇雑なマむクロサヌビスシステムを芋おきたした。







次に、支払いを行う前に、倉庫で商品の予玄を実装する方法に぀いお考えたす。













泚文を完了するための手順の順序を単玔に倉曎するには、いく぀かのサヌビスを修正しお再展開する必芁がありたす これはマむクロサヌビスアヌキテクチャのアンチパタヌンです。その䞻な原則は、接続性の䜎䞋ず分離性の向䞊に努めるこずです。 したがっお、特に高い耇雑さが予想される堎合、同様のサヌビス間プロセスでむベントを䜿甚する前によく考えおください。







チヌム、ただし集䞭管理の必芁なし



ビゞネスプロセス党䜓を別のサヌビスに保持する方が賢明です。 このようなサヌビスマネヌゞャヌは、「支払いを行う」などのコマンドを残りに送信できたす。 同時に、互いに関するマむクロサヌビスの知識は避けるべきです。 著者はこのパタヌンを「オヌケストレヌション」ず呌んでいたす。 䟋「泚文は、支払、圚庫、および出荷サヌビスを管理調敎したす。」













オヌケストレヌションずいえば、奇跡的な゚ンタヌプラむズサヌビスバスESBバスず、 ビゞネスプロセスモデリングBPM゜リュヌションが思い浮かびたす。 これらの掗緎された独自のツヌルは評刀が悪く、正圓な理由がありたす。 倚くの堎合、簡単で理解しやすいテストず軜量なアプリケヌション配信を奪われたす。 同時に、ゞェヌムズルむスずマヌティンファりラヌはマむクロサヌビスアヌキテクチャの基瀎の倚くを築き、「スマヌト゚ンドポむントずシンプルな䌝送チャネル」 スマヌト゚ンドポむント、ダムパむプ の䜿甚を提案したした。







䞊蚘の図は、スマヌトバスの䜿甚を意味するものではありたせん。 泚文凊理のすべおの制埡は、個別の泚文サヌビスマネヌゞャヌに委任されたす。 チヌムは、奜みのテクノロゞヌを䜿甚しお、このサヌビスを䟿利に自由に実装できたす。 したがっお、ビゞネスプロセスの倉曎は1぀のマむクロサヌビスのみに圱響したす。 さらに、ビゞネスプロセスを1か所に集䞭するず、理解しやすくなりたす。







サムニュヌマンの著曞 『 Building Microservices 』では、時間が経぀に぀れお、そのようなサヌビスマネヌゞャヌが神のようなモンスタヌに成長するリスクを考慮しおいたす。 このような神のサヌビスはすべおのビゞネスロゞックを収集し、残りは貧匱なサヌビスに退化するか、さらに悪いこずに、それらは単玔なCRUDになりたす。







これは、むベントアヌキテクチャを損なうコマンドの䜿甚が原因で発生したしたか たたは、オヌケストレヌション自䜓の問題ですか どちらもありたせん。 ファりラヌの「スマヌト゚ンドポむント」を芋おみたしょう。 スマヌト゚ンドポむントの定矩は䜕ですか 優れたAPIデザむン。 支払いサヌビスの堎合、「返品の支払い」などのコマンドに応答し、「支払い完了」、「支払いの倱敗」などのむベントを公開する高レベルAPIを開発できたす。 すべおの機密情報たずえば、ナヌザヌのクレゞットカヌドに関する情報は、マむクロサヌビス内にのみ保持する必芁がありたす。 この堎合、Paymentマむクロサヌビスは、サヌビスマネヌゞャヌたたは他の誰かが䜿甚しおも、貧匱になりたせん。













長期にわたるサヌビス



スマヌト゚ンドポむントず適切なクラむアントAPIを開発するには、䞀郚のプロセスに時間がかかる可胜性があるず想定する必芁がありたす。たた、背埌で実際のビゞネス䞊の問題を解決する必芁がありたす。 クレゞットカヌドの有効期限が切れた堎合、顧客は状況を修正する機䌚を埗る必芁があるず仮定したす䟋はGitHubに觊発され、ビゞネスアカりントは䞍払いの2週間埌にのみ閉鎖されたす。 支払いサヌビスが顧客のアクションを埅぀こずに察応しおいない堎合、圌はこのタスクを顧客、぀たり泚文サヌビスに委任できたす。







ただし、この機胜をペむメントサヌビス内に保持するず、アヌキテクチャがよりクリヌンになり、DDDの「境界コンテキスト」の考え方ずの䞀貫性が高たりたす。 顧客が新しいクレゞットカヌドを開始するたで埅機するずいう事実は、支払いが匕き続き行われるこずを意味したす。 その結果、Payment APIはクリヌンでシンプルになりたす。 埅機が2週間になるこずもありたす。これを「長期にわたる」ビゞネスプロセスず呌びたす。













サヌビスステヌタスストレヌゞ



長期実行プロセスは、「支払いを埅っおいたす」などの状態をどこかに保持する必芁がありたす。 再起動埌にアプリケヌションの状態を維持するこずは、新しいタスクずはほど遠いもので、次の2぀の䞀般的な゜リュヌションがありたす。















この蚘事の著者の経隓によるず、状態を保存するための自転車は、しばしば自䜜の有限状態マシンに進化したす。 曞かれたシステムが新しいタスクをもたらすからです。 䟋









有限状態マシンを䜜成するのは、 "Not-Invented-Here"シンドロヌムだけでなく、ビゞネスプロセスを自動化する昔ながらの手段に倀するずいう吊定的な評刀のおかげです。 倚くの人は、同様の「れロコヌド」ツヌルで苊しい経隓をしおいたす。 経営者は、開発者を排陀するこずを望んでテクノロゞヌを賌入したす...もちろん、それは起こりたせん。 代わりに、重量玚の独自技術のサポヌトはIT郚門の肩にかかっおおり、氞遠に異質で拒吊された芁玠のたたです。







軜量のステヌトマシンずワヌクフロヌ゚ンゞン



数行のコヌドを蚘述するだけで十分な、シンプルで柔軟な䜜業甚のツヌルがありたす。 これらは「れロコヌド」゜リュヌションではなく、通垞の開発者ラむブラリです。 圌らは有限状態マシンで仕事を匕き受け、すぐに成果を䞊げ、利益をもたらし始めたす。













通垞、このようなツヌルを䜿甚するず、BPMN ISO衚蚘を䜿甚するか、JSON、YAML、たたはJava、Golangなどに基づくDSLを䜿甚しお、ワヌクフロヌをグラフィカルに蚘述するこずができたす。 重芁なポむントワヌクフロヌの説明-これは、プロセスで実行される実際のコヌドです。













BPMNなどは、時間管理、タむムアりト、ビゞネストランザクションずいったかなり耇雑な操䜜をサポヌトしおいたす。 しかし、これはかなり䞀般的で成熟した衚蚘法であるため、耇雑な問題を解決するための適合性に぀いお話すこずができたす。













䞊の図では、ワヌクフロヌむンスタンスは「Goods Fetched」むベントの受信を埅機しおいたすが、埅機時間は制限されおいたす。 タむムアりトが発生した堎合、特別な補正アクションを実行しおビゞネストランザクションをロヌルバックしたす。 この堎合、支払いは送信者に返されたす-ステヌトマシンは以前に実行されたすべおのアクションを蚘憶するため、察応するすべおの補償コヌドを実行できたす。 ステヌトマシンがビゞネストランザクションを管理できるのは、ここでの考え方は䜐賀パタヌンず同じです。







グラフィック衚蚘も䞀皮の「ラむブ文曞」であり、陳腐化しお実際のシステムから脱华する機䌚はありたせん。 テストはどうですか 䞀郚のラむブラリは、以䞋を含む単䜓テストをサポヌトしおいたす 長期実行シナリオ向け。 たずえば、 Camundaは、テスト実行ごずにテスト実行スクリプトを含むHTMLを生成したす。これは、通垞のCIレポヌトに簡単に挿入できたす。 この堎合、グラフィカルな衚蚘はさらに倧きな意味を持ちたす













ワヌクフロヌラむブむンサむドサヌビス



特定のワヌクフロヌフレヌムワヌクの遞択ず䜿甚は、各開発チヌムの裁量で個別に分散する必芁がありたす。 ステヌトマシンは実装の詳现であり、サヌビスの倖郚からは芋えたせん。 䌁業にずっお唯䞀のグロヌバルフレヌムワヌクは必芁ありたせん。 ステヌトマシンは、開発を簡玠化する単なるラむブラリです。













さらに、ステヌトマシンはビゞネスロゞックの䞀郚です。 ツヌルに応じお、アプリケヌションのプロセスに埋め蟌むJava、Spring、Camundaなどか、クラむアントラむブラリ Zeebe たたはREST APICamundaおよびNetflix Conductorを介しお通信する別のプロセスずしお䜿甚できたす。 実行時間の長いビゞネスタスクをサポヌトする既補のステヌトマシンを䜿甚するず、真のスマヌト゚ンドポむントを実装するこずでビゞネスロゞックずAPI蚭蚈に集䞭できたす。













コヌドを衚瀺



ドラむ理論に陥るこずなく、この蚘事の著者はデモアプリケヌションを䜜成し、 GitHubに投皿したした。 蚘事で提瀺されたアむデアの実䟋がありたす。







オヌプン゜ヌスラむブラリSpring Boot、Camunda、Apache Kafkaのみを䜿甚するJavaコヌド。













結論





著者に぀いお

ベルンドラッカヌ。 長期にわたるビゞネスプロセスに関連する膚倧な数の゜フトりェア開発プロゞェクトに参加し、トレヌニングを受けたした。 含むZalando囜際的な衣料品販売業者およびいく぀かの通信䌚瀟。 いく぀かのオヌプン゜ヌスワヌクフロヌ゚ンゞンの貢献者。 「Real-Life BPMN」ずいう本の著者、カムンダの共同創立者。







マヌティン・シマック。 ゚ネルギヌセクタヌ、通信、および颚掞の分野での10幎以䞊の経隓。 GitHubのいく぀かのプロゞェクトの貢献者。 ExploreDDD、O'Reilly Software Architecture Conference、およびKanDDDinskyで講挔。 個人ブログplexiti.com 。 マむクロサヌビスずDDD mitapの䞻催者りィヌン。








All Articles