Apache Igniteトポロゞを䜿甚する

以前の蚘事で、 Apache Igniteの単玔なトポロゞヌを構築する方法に぀いお説明したした。 1぀のクラむアントず1぀のサヌバヌで構成され、クラむアントはサヌバヌにメッセヌゞを送信し、サヌバヌはそれを衚瀺したした。 補品を構成し、その重芁なアクティビティを監芖する方法に぀いお説明されたした。 ここで、より耇雑な䟋の時間です。 耇雑なトポロゞの構築ず、より興味深い盞互䜜甚のシナリオが瀺されたす。 読者は、最初の蚘事で説明したApache Igniteの基本操䜜に粟通しおいるこずを前提ずしおいたす。 これら2぀の蚘事を読んだ結果、読者は自分のプロゞェクトでこれを誇匵せずに匷力な補品に適甚する方法に぀いおいく぀かの仮定を持っおいるかもしれたせん。 たた、この蚘事は、高性胜システムの構築に関心があり、自転車のタヌンキヌ゜リュヌションを芗きたい人にも圹立ちたす。



トポロゞ蚭定



Igniteトポロゞは、クラむアントずサヌバヌの2皮類のノヌドで構成されおいるこずを思い出しおください。 クラむアントは、䞀般的な堎合ただし必須ではありたせん、芁求を送信し、サヌバヌがそれらを凊理したす。 ノヌドの動䜜は、その構成によっお決たりたす。これは、察応するIgniteオブゞェクトのSpring構成です。 ノヌドの構成に関連する䞻なポむントは、 前の蚘事で説明されおいたす 。 次に、「gridName」プロパティが異なり、他の点では同じである2぀のサヌバヌタむプxml構成を䜜成したす。 この䟋では、これらは「testGrid-server」および「testGrid-server1」ずいう名前になりたす。 たずえば、最初の構成で2぀のノヌドを実行し、2番目の構成で1぀のノヌドを実行したす。 それぞれが個別のJVMで起動されるため、ノヌドメモリの構成に泚意する必芁がありたす。そのため、ignite.batの-Xmsおよび-Xmxパラメヌタヌの倀を枛らすこずができたす。 ignitevisorcmd。Bat | shコマンドを䜿甚しお、Igniteトポロゞの監芖に䜿甚されるVisorナヌティリティを実行したす。 起動時に、いずれかの構成を指定し、いずれかを指定する必芁がありたす。結果は同じです。









このような耇雑なトポロゞができたので、バむザヌの䞻な機胜に慣れるずきが来たした。 圌は、 helpコマンドでコマンドの完党なリストを衚瀺したす。 それらの簡単な説明付きの完党なリストは、補品ドキュメントのペヌゞで芋るこずができたす 。 ドキュメントに蚘茉されおいるこずに加えお、バむザヌ甚にプラグむンを䜜成でき、Scala自䜓で䜜成されおいるこずに泚意しおください。 この蚘事のコンテキストでは、バむザヌコマンドconfigに泚意を払う必芁がありたす。このコマンドは、指定されたノヌドに関するすべおの関連詳现を衚瀺したす。 これは非垞に倧量の情報であるため、ここでは説明したせん。



ちなみにこれは必芁ではありたせんでしたが、非Javaノヌドもあり、珟圚はC ++ず.NETのサポヌトがありたす。 たた、ノヌドのラむフサむクルハンドラを定矩できるこずも蚀及しおいたせん。 ぀たり、ノヌドの開始/停止の前埌に4぀のむベントがありたす。 そこで行う䟡倀は明確ではありたせん。ロギングは暙準的な手段、おそらくいく぀かのセキュリティチェックたたはサヌバヌ蚭定によっお提䟛されたす。 Igniteで提䟛されるLifecycleBeanむンタヌフェむスの唯䞀の実装は、.NETノヌドの初期化に䜿甚されたす。 䞀芋したずころ、この機胜を䜿甚しおも䟿利なこずは䜕もできたせん。



サヌバヌに接続する



前の蚘事では、クラむアントをサヌバヌに接続し、「Hello World」ずいうメッセヌゞを送信したした。 前の䟋から少し倉曎しお、テストでクラむアントずサヌバヌの2぀のノヌドを䜜成したす。 䜜成方法によっおは、同じJVMで䜜成されたす。 それらは異なるxml構成で構成され、サヌバヌのgridNameは「testGrid-server0」になりたす。 テストコヌドは次のずおりです。



@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"/ignite/providerConfig.xml"}) public class IgniteHelloWorld { @Autowired @Qualifier("clientProvider") private IgniteProvider igniteClient; @Autowired @Qualifier("serverProvider") private IgniteProvider igniteServer; @Test public void sendHelloTest() { try (Ignite server = igniteServer.getIgnite(); Ignite client = igniteClient.getIgnite()) { client.compute().broadcast(() -> System.out.println("Hello World from client!")); server.compute().broadcast(() -> System.out.println("Hello World from server!")); } } }
      
      





AutoCloseableむンタヌフェむスを実装するIgniteオブゞェクトは、䜿甚埌に良奜なトヌンで閉じるこずに泚意しおください。 そのため、コマンドラむンから3぀のサヌバヌノヌドを起動したした。 3぀のコン゜ヌルのそれぞれ、およびIDEのコン゜ヌルでテストを実行した埌、同じこずがわかりたす。









別のクラむアントずサヌバヌが3぀の既存のサヌバヌに参加したした。 この動䜜はどのように保蚌されたすか タスクを実行するサヌバヌのグルヌプを決定するcomputeメ゜ッドには、2぀の実装がありたす。 テストで呌び出すパラメヌタヌなしの実装は次のようになりたす。



  @Override public IgniteCompute compute() { return ((ClusterGroupAdapter)ctx.cluster().get().forServers()).compute(); }
      
      





ここで䜕が起こるか芋おみたしょう。 GridKernalContextImpl型のctxオブゞェクト開発者はいく぀かの重芁な䌝統のために「 Kernal 」ずいう単語を䜿甚したすで、clusterメ゜ッドが呌び出され、トポロゞヌずの盞互䜜甚に関しお明らかにノヌドを象城するClusterProcessorオブゞェクトを返したす。 実際に、getメ゜ッドをさらに呌び出すこずにより、シングルトンクラスタヌの圢匏でノヌドを取埗したす。これにより、 IgniteClusterImplオブゞェクトが提䟛され、倚くのこずが可胜になりたす。 たず、述語をノヌドに適甚するこずに基づいおノヌドのサブセットを構築したす。぀たり、オブゞェクトの特定のセットで蚈算され、フィルタリングする条件です。 この堎合、forServersメ゜ッドは、ATTR_CLIENT_MODE == falseプロパティを持぀ノヌドに察しおtrueを返す述語を返したす。 属性の完党なリストが利甚可胜です 。 属性の述郚に加えお、Igniteには、他の興味深い述郚の実装がいく぀か付属しおいたす。 たずえば、キャッシュの内容でフィルタリングするこずができたす。これは、埌で導入するのが理にかなっおいたすし、他の倚くの、より゚キゟチックなものでも構いたせん。



この知識があれば、遞択したノヌドにメッセヌゞが送信されるようにテストを倉曎するこずは難しくありたせん。 識別のために、gridNameパラメヌタヌがありたす。gridName== "testGrid-server"のサヌバヌに送信しおみたしょう。これは2です。



 client.compute(client.cluster() .forAttribute(ATTR_GRID_NAME, "testGrid-server") .forServers()) .broadcast(() -> System.out.println("Hello World from client!")); server.compute(server.cluster() .forAttribute(ATTR_GRID_NAME, "testGrid-server1") .forServers()) .broadcast(() -> System.out.println("Hello World from server!"));
      
      





予想どおり、クラむアントから2぀のメッセヌゞずサヌバヌから1぀のメッセヌゞを受信したす。 述語が䜕も返さない堎合、䟋倖がスロヌされたす "ClusterGroupEmptyCheckedExceptionCluster group is empty"。 forServersに加えお、forRemotes、forRandom、forOldest、forYoungestなど、他の倚くの興味深い暙準述語がありたす。



最埌に、broadcastを呌び出すこずだけができるわけではありたせん。 ここで実行するずは、実行のためにIgniteCallableオブゞェクトを枡すこずを意味したす。 たた、callメ゜ッドにはいく぀かのバヌゞョンがあり、broadcastずは異なり、結果を返したす。



しかし、䞭身は䜕ですか



それがどのように機胜するかを知るこずは興味深いでしょう。 調べるために、次の実隓を実行したす。クラむアントから、gridName ==“ testGrid-server0”でテストで䜜成されたサヌバヌにメッセヌゞを送信し、デバッグで䜕が起こるかを確認したす。 より参考になるように、テストを少し倉曎したす。



 int param = 1; Integer clientResult = client.compute(client.cluster() .forAttribute(ATTR_GRID_NAME, "testGrid-server0") .forServers()) .call(() -> { System.out.println("Hello World from client!"); return param + 1; });
      
      





callメ゜ッドを呌び出したずきに最初に起こるこずは、クラむアントで読み取り/曞き蟌みロックを蚭定するこずです。 興味深いこずに、Igniteはsun.misc.Unsafeに基づいお、 thisのGridSpinReadWriteLockクラスでこのメカニズムの独自の実装を䜿甚したす。 䞀方で、これは良いこずです。Ignite開発者はパフォヌマンスに関心がありたすが、䞀方で、Java 9 Unsafeで切り取るずどうなりたすか 䞍安を持っおむベントの経過をたどりたす... Ignite開発者が暙準のjava.util.concurrent.Futureクラスを拒吊しお、 IgniteFutureむンタヌフェむスの独自の実装を支持しおいるこずは、 驚くこずではありたせん 。 それらがはるかに優れおいるかどうかはわかりたせんが、1぀のこずは明らかです。ApacheIgniteで密茞したい人は、䞊行性に぀いお非垞に深い知識を持っおいる必芁がありたす...次に、ラムダに基づいお、実行のために転送されるタスクが生成されたす。 このタスクは、GridTaskProcessorクラスのstartTaskメ゜ッドに委任されたす。 ここではセキュリティチェックが提䟛されたすが、実装されおいたせん。将来のバヌゞョンで衚瀺される可胜性がありたす。 次の重芁なステップは、クラスの分散展開ですが、これたでこの匷力な機胜に぀いおは説明したせん。 元のドキュメントを参照しおください。 Igniteは、タスクが実行されるすべおのノヌドで実行可胜コヌドが確実に実行されるように察策を講じる必芁があるこずを思い出させおください。 タスクの堎合、デフォルトのLong.MAX_VALUEに等しいタむムアりトを蚭定でき、実際には無限倧であり、再定矩できたす。 タスク起動ログを構成するこずもできたす。 ゚ンタヌプラむズ機胜のトレヌスが衚瀺されたす-負荷分散、フォヌルトトレランス、およびトランザクション性の蚭定に぀いおは、以䞋をご芧ください。 凊理時間のある時点で、タスクがダンプされたサヌバヌが萜ちたように芋える堎合、凊理は䟋倖で䞭断されたす。 途䞭で萜ちなかった堎合、ゞョブが圢成され、GridIoManager I / Oマネヌゞャヌに枡されたす。 メッセヌゞを圢成し、 TcpCommunicationSpiを䜿甚しお送信したす 。 このオブゞェクトはノヌドのxml構成で指定できるこずを思い出しおください。぀たり、TcpCommunicationSpiの子孫を実装するこずにより、メッセヌゞの送信プロセスに圱響を䞎えるこずができたす。 さらに、簡単ではありたせんが、最終的にNIOを䜿甚するずメッセヌゞは消えたす。 そしお、サヌバヌを取埗したす。 蚈算し、同様に回答を送信したす。 そしお、圌は呌び出しの堎所に来たした。この堎合、それは2番です。



負荷管理



耇数のサヌバヌでタスクを完了できるずどうなりたすか これを確認するには、gridName ==“ testGrid-server”を䜿甚しおサヌバヌに芁求を送信したす。その䞭、ノヌドの可甚性に関する情報を考慮しお、耇数のノヌドがタスクに䜿甚できる堎合、Collections.shuffleを䜿甚しお混合したす。このリストは暙準のロヌドバランサヌに転送され、ノヌド1から遞択する必芁がありたす。 デフォルトですべおを残した堎合、 RoundRobinLoadBalancingSpiクラスによっお提䟛されるRound-Robbinアルゎリズムが䜿甚されたす。 このSPIIgniteでは、すべおのプラグむンアルゎリズムはSPIず呌ばれたすは、ラりンドロビン方匏を䜿甚しおノヌドを反埩凊理し、次のノヌドを順番に遞択したす。 setPerTaskbooleanを呌び出すこずにより蚭定される、タスクずグロヌバルの2぀の動䜜モヌドが利甚可胜です。 タスクモヌドが遞択されおいる堎合、SPIは実行の開始時にノヌドをランダムに遞択し、タスクが完了するず呚期的に繰り返したすこの堎合、タスクは1぀だけですが、実行のためにタスクのリストを転送できたす。 このアプロヌチはデフォルトで䜿甚されたす。 グロヌバルモヌドでは、ノヌドの共通の順次キュヌがすべおのタスクに䜿甚されたす。 この堎所でアルゎリズムを遞択するず、ノヌド間の負荷分散に圱響する可胜性があるこずは明らかです。 Round-Robbinバランサヌに加えお、さらに2぀が利甚可胜です。adaptiveは、デフォルトでノヌドサヌバヌのCPUの負荷であるカスタムメトリックに基づいおノヌドのパフォヌマンスを考慮し、構成䞭に指定できるノヌドの重みに基づくランダム遞択ですデフォルトではすべお10です 。 最埌に、適切なむンタヌフェヌスを実装するこずにより、独自のものを䜜成できたす。 ノヌドのxml構成でバランシングSPIを指定できたすここでは少し理解できたせんが、それらのリストを指定できたす。どのようにバランシングを実行するか、誰が正確にバランスを取りたすかコヌドから刀断するず、クラス名は文字列にスタックされ、その埌SPIはクラス名によっおむンスタンス化されたすこれは機胜したすかJavadocのヒントから刀断するず、バヌゞョン2.1から機胜したす。



バランシングに加えお、開発者はさらに2぀の゚ンタヌプラむズレベルの機胜を管理できたす。 フェむルオヌバヌは、 フェむルオヌバヌSPIを䜿甚しお制埡できたす。 これが必芁になる可胜性がある理由には、タスクの実行プロセスでの゚ラヌ、トポロゞからのタヌゲットノヌドの損倱、およびタスクの完了を拒吊するノヌドが含たれたす。 このタむプのSPIの目的は、欠陥のあるノヌドず匕き換えにノヌドを提䟛するこずです。 すぐに䜿甚できる3぀の実装が提䟛されたす。NeverFailoverSpi䜕も返さないず、2぀のトリッキヌな実装 、 AlwaysFailoverSpiおよびJobStealingFailoverSpiです。 AlwaysFailoverSpiは、別のノヌドを提案する前に、ノヌドにいく぀かの詊行を䞎えたすデフォルト5はオヌバヌラむドできたす。 同時に、タスクの芪和性が考慮されたす-タスクが接続されおいる堎合、䞀定の詊行回数の埌にドロップが発生し、そうでない堎合は、バランサヌのデヌタを考慮しお、新しいノヌドが遞択され、欠陥のあるノヌドがブラックリストに登録されたす。 詊行回数ずノヌドのブラックリストは、タスクのコンテキストに保存されたす。 JobStealingFailoverSpiはさらにトリッキヌであり、考慮したせん。 フェむルオヌバヌSPIリストも構成で指定できたす。 䜕も指定しない堎合、デフォルトでAlwaysFailoverSpiが䜜成されたす。



このシリヌズの最埌のSPIであるCheckpoint SPIは、ご想像のずおり 、セヌブポむントチェックポむント、぀たり、長いタスクたたは耇雑なタスクの䞭間ポむントを䜜成するように蚭蚈されおいたす。 このタむプのSPIは、チェックポむントを保存、削陀、およびロヌドできるAPIを提䟛したす。 Igniteの䜜成者が考案したこのAPIは、システムでのみ䜿甚する必芁がありたす。 ただし、技術的には、この機胜はアプリケヌション開発者に限定されたせん。 この機胜の恐ろしい腞に飛び蟌むこずはありたせん;デフォルトでは、䜕もしない実装は接続されおいたせん。



トラックを怜玢する



最埌に、これらすべおの課題の痕跡を芋぀けおみたしょう。 Igniteは完党なロギングを提䟛したす。 デフォルトの状態を倉曎するために䜕もしないず、コン゜ヌルにメッセヌゞを曞き蟌むデフォルトのロガヌが䜜成されたす。 これは通垞のJavaロギングであり、config / java.util.logging.properties構成を䜜成できる構成甚です。 これが適切でない堎合は、 IgniteLoggerむンタヌフェむスを実装し、xml-configを介しお接続できたす。



バむザヌを求めるこずもできたす。 nodeコマンドを䜿甚するず、ノヌドの詳现な統蚈を芁求できたすどの統蚈情報を尋ねるべきかわかっおいる堎合は、蚈算にコン゜ヌルに出力を远加したため、知るこずができたす。 その結果、数回起動するず次のようなものが衚瀺されたす。









ただし、トポロゞの監芖に぀いおは別の機䌚に話したす。



結論



Igniteの内郚が良奜で、内郚にフィットしおいるこずは明らかです。 Igniteノヌドに基づいお、倧芏暡な゚ンタヌプラむズ芏暡で非垞に興味深い゜リュヌションを構築したり、少なくずも興味深いアむデアを取り入れたりできるこずは盎感的に明らかです。 この蚘事を読んだ埌、読者がIgniteが提䟛するツヌルを䜿甚しお、本圓に耇雑で重芁なトポロゞを構築する方法に぀いおのアむデアを圢成したこずを願っおいたす。



参照資料



GitHubテストケヌスコヌド



All Articles