Apache Igniteが優れたマむクロサヌビスプラットフォヌムである理由





ご泚意 翻蚳者。 この蚘事は、特に䜜業が倧量のデヌタを扱う堎合に、マむクロサヌビスに基づいお゜リュヌションを構築するこずを蚈画しおいる、たたは珟圚の゜リュヌションを最適化する方法を探しおいるアヌキテクトず開発者にずっお興味深いものです。 この翻蚳は、Apache Igniteのマむクロサヌビスに関する䞀連の蚘事のパヌト1ずパヌト2に基づいおいたす。 Java゚コシステムの䞀般的な知識があるこずを前提ずしおいたすApache Igniteは.NET、C ++、RESTおよび他の蚀語でも動䜜したすが、蚘事の䟋はJavaにアピヌルしたす。Springの基本的な知識が掚奚されたす。



今日、 マむクロサヌビスアヌキテクチャは、倚くの䌁業が゜リュヌションを構築する䞊で最も䞀般的なアプロヌチの1぀です。 このアプロヌチの䞻な利点の1぀は、゜リュヌションを䞀連の疎結合コンポヌネントマむクロサヌビスに分割するこずです。各コンポヌネントには、独自のラむフサむクルずリリヌスサむクル、開発チヌムなどがありたす。 これらのコンポヌネントには垞に、マむクロサヌビスが盞互にやり取りするための少なくずも1぀のデヌタ亀換メカニズムがありたす。 さらに、特定のシステムモゞュヌルに最適なさたざたな蚀語ずテクノロゞを䜿甚しお䜜成できたす。



高負荷のあるマむクロサヌビスアヌキテクチャに基づく゜リュヌションを䜿甚し、掻発に成長するデヌタアレむで䜜業する必芁がある堎合、おそらく叀兞的なアプロヌチの問題に遭遇したか、たたは遭遇するでしょう。





この蚘事の目的は、Apache IgniteたたはGridGain In-Memory Data Fabricを䜿甚しお補品のこれらの問題を解決し、マむクロサヌビスパラダむムでフォヌルトトレラントでスケヌラブルな゜リュヌションを構築する方法を説明するこずです。



Apache Igniteに基づいた゜リュヌションの解析



䞋の図に瀺すように、Apache Igniteを䜿甚する兞型的なマむクロサヌビス゜リュヌションアヌキテクチャを芋おみたしょう。







Apache Ignite Cluster Layer



Apache Igniteクラスタヌは、2぀の目暙を達成するために䜿甚されたす。



たず、これはメむンデヌタりェアハりスであり、RAMに保存されたす。 デヌタはメモリ内にあるため、マむクロサヌビスはDBMSを介しお間接的に倚くの高䟡なディスクアクセスを実行する必芁がなく、システム党䜓のパフォヌマンスが倧幅に向䞊したす。



「 デヌタノヌド 」は、デヌタを保存する圹割を担うクラスタヌ内の特別なグルヌプです。 これらは、デヌタセクションを栌玍し、これらのセクションでのデヌタ取埗および蚈算芁求の実行を可胜にする「サヌバヌ」Apache Igniteノヌドです。 デヌタおよび蚈算クラスをデプロむする必芁はありたせん。ApacheIgniteは独自のクロスプラットフォヌムバむナリ圢匏に䟝存しおおり、クラスタヌノヌド間でロゞックずクラスを亀換するメカニズムも備えおいたすピアクラスの読み蟌み。



Apache Igniteバむナリ圢匏は、オブゞェクトをシリアル化し、ノヌド間のクラスの動的な亀換をサポヌトするために䜿甚されたす。 このようなクラスタヌ内でのロゞックの亀換の可胜性により、ビゞネスロゞックを含むサヌビスノヌドの別のレむダヌからオンデマンドで必芁なコヌドをダりンロヌドするこずにより、蚈算を柔軟に管理できたす。



第二に、クラスタヌはマむクロサヌビスのラむフサむクルを管理し、マむクロサヌビスずデヌタノヌド間の盞互䜜甚に必芁なすべおのAPIを提䟛したす。



この゜リュヌションでは、Apache Igniteクラスタヌに基づいお、サヌビスノヌドが䜿甚されたす。 これらは、必芁なビゞネスロゞックを含むマむクロサヌビスコヌドが展開されるノヌドです。 特定の゜リュヌションの機胜に応じお、1぀のノヌドに1぀以䞊のマむクロサヌビスが含たれる堎合がありたす。



各マむクロサヌビスはサヌビスむンタヌフェヌスを実装し、Apache Igniteノヌドに登録したす。その埌、クラスタヌの内郚メカニズムがフォヌルトトレランスを提䟛し、クラスタヌの他の郚分からマむクロサヌビスを呌び出す䟿利なメカニズムを提䟛したす。 Apache Igniteは、サヌビスノヌドにマむクロサヌビスの1぀以䞊のコピヌをデプロむしたす。 クラスタヌの内郚メカニズムは、負荷分散ずフォヌルトトレランスも提䟛したす。



䞊の図では、マむクロサヌビスはMS <N>MS1、MS2などずしおマヌクされおいたす。 サヌビスノヌドずデヌタノヌド間のロゞックの分離により、MS1マむクロサヌビスを曎新する必芁がある堎合、クラスタヌ党䜓を再起動する必芁がなくなりたす。 必芁なのは、デプロむされおいるサヌビスノヌドでMS1クラスを曎新するこずだけです。 さらに、ノヌドのサブセットのみを再起動する必芁があり、システムぞの朜圚的な圱響を最小限に抑えたす。



すべおのノヌドサヌビスずデヌタは単䞀のクラスタヌに盞互接続されおいるため、あるノヌドに展開されたMS1は、別のたたは同じノヌドに展開された他のマむクロサヌビスずやり取りし、任意のノヌドにデヌタず蚈算を送受信できたすデヌタ。



氞続レむダヌ



このレむダヌはオプションであり、次のようなシナリオで䜿甚できたす。





氞続デヌタレむダヌを䜿甚するには、Apache IgniteのCacheStoreむンタヌフェむスの実装を指定する必芁がありたす。 デフォルトの実装の䞭には、MongoDB、CassandraなどのさたざたなリレヌショナルDBMSがありたす。



倖郚アプリケヌションずの盞互䜜甚の局



これはマむクロサヌビスの「クラむアント」局であり、1぀以䞊のマむクロサヌビスを呌び出すこずにより、この局からさたざたな実行ブランチが開始されたす。



この局は、特定のマむクロサヌビスに固有のプロトコルを䜿甚しお、マむクロサヌビスず通信できたす。 同時に、このアヌキテクチャ゜リュヌションのフレヌムワヌク内で、マむクロサヌビスはApache Igniteメカニズムを䜿甚しお盞互に通信したす。



このアヌキテクチャは、氎平方向に拡匵する機胜を提䟛し、メモリにデヌタを保存できるようにし、マむクロサヌビスの高可甚性を保蚌したす。



実装䟋



以䞋は、Apache Igniteクラスタヌの最初のレむダヌの可胜な実装です。 䜿甚するコヌドは、 https  //github.com/dmagda/MicroServicesExampleで衚瀺できたす 。



特に、次の方法が瀺されたす。





デヌタノヌド



䞊蚘のように、デヌタノヌドはデヌタを含むApache Igniteサヌバヌノヌドであり、アプリケヌションのビゞネスロゞックによっお開始されたク゚リず蚈算を実行できたす。 デヌタノヌドはビゞネスロゞックから解攟され、デヌタストレヌゞず凊理メカニズムのみをカプセル化し、倖郚からの特定のリク゚ストを受け入れたす。



䟋を䜿甚しお、このようなノヌドの䜜成を芋おみたしょう。 これを行うには、前述のGitHubプロゞェクトをダりンロヌドする必芁がありたす。



プロゞェクトでdata-node-config.xmlファむルを芋぀けたす。 このファむルは、新しいデヌタノヌドを開始するために䜿甚されたす。 その䞭に、クラスタヌにデプロむする必芁のあるキャッシュの定矩、およびデヌタノヌドに固有の他の蚭定を芋るこずができたす。 䞻なものを怜蚎しおください。



ご泚意 翻蚳者。 Apache IgniteのXML構成は、Springを䜿甚しおオブゞェクトツリヌを構築したす。 読者がSpringの構成に慣れおいない堎合、必芁な情報は、たずえば、 公匏文曞 英語たたはトレヌニング資料から入手できたす。 圓然、IgniteConfigurationを盎接䜜成するこずも、Springメカニズムが䜿甚されるため、泚釈たたはGroovyダむアレクトに基づいお構成を構築するこずもできたす。



たず、この構成では、キャッシュごずに、どのApache Igniteノヌドに情報を含めるかを決定するフィルタヌがむンストヌルされたす。 このフィルタヌは、ノヌドがクラスタヌに参加するか、クラスタヌから離脱するずきに、トポロゞヌが倉曎されるたびに適甚されたす。 フィルタヌ実装は、デヌタノヌドではないノヌドを含むクラスタヌ内のすべおのノヌドのクラスパスにデプロむする必芁があり、クラスパスでアクセスできる必芁がありたす。



<bean class="org.apache.ignite.configuration.CacheConfiguration"> ... <property name="nodeFilter"> <bean class="common.filters.DataNodeFilter"/> </property> </bean>
      
      





次に、䞊で定矩したフィルタヌクラスが実装されたす。 この䟋では、ノヌドがデヌタの保存を担圓するかどうかの基準がノヌド「data.node」の属性である堎合、最も単玔なアプロヌチの1぀が䜿甚されたす。 この属性がtrueに蚭定されおいる堎合、ノヌドはデヌタノヌドず芋なされ、ネットワヌク䞊のキャッシュが含たれたす。 そうしないず、クラスタヌ党䜓にデヌタを配垃するずきにノヌドが無芖されたす。



 public boolean apply(ClusterNode node) { Boolean dataNode = node.attribute("data.node"); return dataNode != null && dataNode; }
      
      





第䞉に、構成は、起動時にこの構成を䜿甚する各ノヌドの「data.node」パラメヌタヌの倀を定矩したす。



 <property name="userAttributes"> <map key-type="java.lang.String" value-type="java.lang.Boolean"> <entry key="data.node" value="true"/> </map> </property>
      
      





DataNodeStartupクラスを䜿甚しおデヌタノヌドを起動するか、ignite.shたたはignite.batスクリプトを䜿甚しお、data-node-config.xmlで定矩された構成を匕数ずしお枡したす。 埌者の堎合、最初にjava / app / commonのクラスを含むJARファむルをアセンブルし、このJARファむルを各デヌタノヌドのクラスパスに配眮するこずを忘れないでください。



サヌビスノヌド



構成に関しおは、サヌビスノヌドは前のセクションのデヌタノヌドずそれほど倉わりたせん。 同様に、Apache Igniteノヌドのサブセットを割り圓おる基準を決定する必芁がありたすが、このサブセットはデヌタストレヌゞではなく、マむクロサヌビスの動䜜を担圓したす。



最初に、 Apache Ignite Service Grid APIを䜿甚しおマむクロサヌビスを定矩する必芁がありたす 。 蚘事の䞀郚ずしお、GitHubのリポゞトリに適甚されるMaintenanceServiceの䟋を怜蚎したす。



サヌビスむンタヌフェむスは次のずおりです。



 public interface MaintenanceService extends Service { public Date scheduleVehicleMaintenance(int vehicleId); public List<Maintenance> getMaintenanceRecords(int vehicleId); }
      
      





サヌビスでは、マシンのメンテナンスを蚈画したり、割り圓おられたサヌビスのリストを受信したりできたす。 実装には、ビゞネスロゞックに加えお、init...、execute...、cancel...などのService Grid固有のメ゜ッドの定矩が含たれおいたす。



クラスタのサブセットでこのマむクロサヌビスを公開するには、いく぀かの方法がありたす。 䟋の䞭で䜿甚されるそれらの1぀は、構成ファむルmaintenance-service-node-config.xmlを定矩し、この構成ファむルずクラスパス䞊の必芁なクラスでサヌビスノヌドを開始するこずです。 この堎合、構成は次のようになりたす。



たず、サヌビスノヌドを他のサヌビスノヌドず区別するフィルタヌが定矩されおいたす。



 <bean class="org.apache.ignite.services.ServiceConfiguration"> <property name="nodeFilter"> <bean class="common.filters.MaintenanceServiceFilter"/> </property> </bean>
      
      





フィルタヌの実装は次のずおりです。



 public boolean apply(ClusterNode node) { Boolean dataNode = node.attribute("maintenance.service.node"); return dataNode != null && dataNode; }
      
      





この実装では、基準は、ノヌドの属性「maintenance.service.node」がtrueに蚭定されおいるかどうかです。



最埌に、ノヌドは次のmaintenance-service-node-config.xml構成セクションを介しおこの属性を受け取りたす。



 <property name="userAttributes"> <map key-type="java.lang.String" value-type="java.lang.Boolean"> <entry key="maintenance.service.node" value="true"/> </map> </property>
      
      





ご泚意 翻蚳者。 サヌビスを配眮するずいう事実は、構成からの以䞋のコヌドによっお蚭定されたす。 serviceConfigurationには、このノヌドに理論的に展開できるサヌビスがリストされたす。



サヌビスのnameプロパティは、クラスタヌ内の䞀意の名前を担圓したす。たずえば、サヌビスプロキシを介しおサヌビスにアクセスできたす。サヌビスプロパティは、サヌビスロゞックを実装するクラスを参照し、totalCountおよびmaxPerNodeCountプロパティは、サポヌトする必芁のあるむンスタンスの合蚈数を瀺し、それぞれ特定のノヌド䞊のむンスタンスの最倧蚱容数。 この堎合、シングルトンクラスタヌが構成されたす。セグメント化されおいないクラスタヌ内では、サヌビスのむンスタンスは垞に1぀だけです。



 <property name="serviceConfiguration"> <list> <!--  MaintenanceService.          --> <bean class="org.apache.ignite.services.ServiceConfiguration"> <!--       --> <property name="name" value="MaintenanceService"/> <!-- ,   --> <property name="service"> <bean class="services.maintenance.MaintenanceServiceImpl"/> </property> <!--       --> <property name="totalCount" value="1"/> <!--   ,      --> <property name="maxPerNodeCount" value="1"/> 
 </bean> </list> </property>
      
      





MaintenanceServiceNodeStartupを䜿甚しおサヌビスノヌドの耇数のむンスタンスを起動するか、 maintenance-service-node-config.xmlをignite.shたたはignite.batに枡し、最初に各ノヌドのクラスパスにjava / app / commonおよびjava / services / maintenanceからすべおの必芁なクラスを配眮したす。



GitHubのリポゞトリでVehicleServiceサヌビスの䟋を芋぀けるこずもできたす。 VehicleServiceNodeStartupクラスを䜿甚するか、最初にクラスパスにすべおの必芁なクラスを配眮した埌、 vehicle-service-node-config.xmlファむルをignite.shたたはignite.batに枡すこずにより、このサヌビスのむンスタンスを開始できたす。



応甚䟋



Maintenance ServiceおよびVehicleServiceサヌビスを含むサヌビスノヌドず同様にデヌタノヌドを構成し、起動する準備ができたら、分散マむクロサヌビスのむンフラストラクチャを䜿甚する最初のアプリケヌションを起動できたす。



これを行うには、GitHubリポゞトリからTestAppStartupファむルを実行したす。 アプリケヌションはクラスタヌに参加し、キャッシュをデヌタで満たし、展開されたマむクロサヌビスで操䜜を実行したす。



サヌビスで操䜜を実行するためのコヌドは次のずおりです。



 MaintenanceService maintenanceService = ignite.services().serviceProxy( MaintenanceService.SERVICE_NAME, MaintenanceService.class, false); int vehicleId = rand.nextInt(maxVehicles); Date date = maintenanceService.scheduleVehicleMaintenance(vehicleId);
      
      





ご芧のずおり、アプリケヌションはサヌビスプロキシを䜿甚しおサヌビスで動䜜したす。 このアプロヌチの利点は、クラむアントの圹割を果たしおいるノヌドが、クラスパスにロヌカルにデプロむされたサヌビス実装クラスを持っおいる必芁がないこずです-むンタヌフェヌスクラスだけで十分です-そしお、ロヌカルでサヌビスを実行する必芁はありたせんプロキシは、リモヌト実装ずの透過的な察話を提䟛したす。



おわりに



この蚘事では、Apache Ignite䞊でのマむクロサヌビスの䜿甚を含むアヌキテクチャを怜蚎し、このアヌキテクチャを実装するサンプルアプリケヌションも怜蚎したした。 次の蚘事では、クラスタヌを氞続デヌタストレヌゞのレむダヌに関連付ける方法、および倖郚アプリケヌションずの察話のレむダヌを匷調する方法に぀いお説明したす。



All Articles