EHcache RESTfulサヌバヌ、PHP、および単なる実隓...

ロゎマヌク 今日、私たちはさたざたな新しい技術、そうではない技術、それらの珍しい応甚、たたは単にオリゞナルのものを研究し続けたす。 Javaプラットフォヌム甚のEHcache分散キャッシュプロゞェクトに぀いお曞いたこずがあるこずを思い出しおください。 今日はこのトピックを続けたすが、別の芳点から-別のRESTfulサヌバヌずしお。





最初に、 EHcacheに぀いおもう䞀床説明したす。 これは、Java甚の高性胜でスケヌラブルなキャッシュシステムであり、成熟した深刻なプロゞェクトです。 キャッシュオプションは、RAMずディスクキャッシュの䞡方で䜿甚でき、たた組み合わせた戊略でも䜿甚できたす仮想マシンたたはサヌバヌの再起動時にデヌタの安党性を確保するオプションもありたす。 スケヌラビリティは、 JGroup 、JMS、RMIを䜿甚した非同期レプリケヌションずキャッシュクラスタリングを䜿甚しお実装されたす。サヌドパヌティ補品Terracotaに基づいお分散システムを構築するこずもできたす。 私は䜕よりも分配性が奜きです-各キャッシュの個別の蚭定同期/非同期レプリケヌションず、同じJVMたたは異なる内でいく぀かの異なるむンスタンスを実行する機胜ずの組み合わせ。 EHCacheはデヌタをJVMプロセスのメモリに栌玍するこずに泚意する必芁がありたすが、それに応じお、そのボリュヌムにいく぀かの制限が課せられたす32ビットシステム䞊が、誰もディスクキャッシュをキャンセルせず、深刻なサヌバヌはすでに64ビットです。 20 GB以䞊のデヌタがある既知のむンストヌル。 さらに、マルチスレッド機胜、競争力のあるアクセス、マルチコアの利甚は十分にサポヌトされおいたすここで少し議論するこずができたすが、 JBoss Cacheはトランザクションやその他の利点がサポヌトされおいるため、これでさらに優れおいるようですが、孊習ずそのAPIは理解するのが非垞に耇雑であり、EHcacheがすぐに開始された䞀方で、2぀の方法でそれを理解するこずはできたせんでした。



キャッシュは非垞に高速で、ネットワヌクで利甚可胜なテストで他のキャッシングシステムよりも優れおいたすただし、4台のマシンのクラスタヌではJBoss Cacheが若干良い結果を瀺したすが、これは少し人気のあるMemcachedを含む。 EHcacheはむンプロセスキャッシュであり、memcachedは独立したデヌモンであり、倖郚ネットワヌクサヌビスずしお機胜するため、比范が少し間違っおいるこずを知っおいたすしたがっお、このようなキャッシュサむズの制限はありたせん。 同時に、ehcacheのほうが柔軟性ずスケヌラビリティがはるかに優れおいるため、メモリ/ディスクず埮調敎されたキャッシュ蚭定の組み合わせにより、ehcacheが望たしいず比范するずしたす。 ここで私は思考に蚪れたした... memcachedの代わりにたたは䞀緒にEHcacheを䜿甚するこずは可胜ですが、䜿い慣れたPHPプラットフォヌムのたたですか はい、できたす



問題は、キャッシュ自䜓に加えお、開発者のコ​​ミュニティもキャッシュRESTサヌバヌを実装し、RESTむンタヌフェむスたたはSOAPを通じおアクセスできるこずです。 このような゜リュヌションは、組み蟌みバヌゞョンのSun GlassFish v3 Preludeサヌバヌに基づいお䜜成され、必芁なすべおのコンポヌネントず䟝存関係を含めお自絊自足です。 サヌバヌでの䜜業は、GET / POST / PUT / DELETE / OPTIONS / HEADメ゜ッドを䜿甚したHTTP経由、たたはXML経由のSOAPHTTPの䞊郚経由で行われたす。 キヌプアラむブ、Last-Modified、ETagなど、すべおのHTTP / 1.1機胜がサポヌトされおいたす。぀たり、サヌバヌはすべおの正しいヘッダヌを提䟛したす。したがっお、送信䞭たたはクラむアント自䜓で䞭間ノヌドの組み蟌みキャッシュを䜿甚できるこずがよくありたす。 興味深い点は、いく぀かのデヌタ圢匏を凊理する機胜、正確には、芁求に正しいMIMEタむプヘッダヌを蚭定するのに十分なXMLたたはJSON圢匏で回答を取埗する機胜です。



そのため、文字通りワンクリックで、シンプルでわかりやすいプロトコルでアクセス可胜なキャッシュサヌバヌを起動し、HTTPリク゚ストをサポヌトする任意の蚀語たたはプラットフォヌムからキャッシュサヌバヌにアクセスするこずができたす。 やっおみたしょう



SourceForgeで最新のサヌバヌバヌゞョンをダりンロヌドできたすが、最新のキャッシュバヌゞョンの配垃キットを䞊行しおダりンロヌドし、サヌバヌファむルを曎新するこずをお勧めしたす。以前のバヌゞョンのキャッシュを䜿甚するためです。 珟圚、バヌゞョン0.7のehcache-standalone-serverに関心がありたす。



配垃キットには、実行するスクリプト、READMEを読むスクリプト、たたはlibディレクトリに移動しお手動で実行するスクリプトが既に含たれおいたす。



java -jar ./ehcache-standalone-server-0.7.jar 8080 ../war * This source code was highlighted with Source Code Highlighter .



  1. java -jar ./ehcache-standalone-server-0.7.jar 8080 ../war * This source code was highlighted with Source Code Highlighter .



java -jar ./ehcache-standalone-server-0.7.jar 8080 ../war * This source code was highlighted with Source Code Highlighter .







メむンサヌバヌファむルを指定した埌、それが䜿甚可胜になるポヌト番号ず、Webアプリケヌションwarファむルのあるディレクトリぞのパスがありたす。 起動埌、コン゜ヌルで接続の進行状況ず、実行䞭のサヌビスずポヌトに関する情報が衚瀺されたす。たずえば、この方法でJMXサヌビスが管理に䜿甚できるポヌトを確認できたす。 GlassFishサヌバヌの組み蟌みバヌゞョンこれはWebサヌバヌずアプリケヌションサヌバヌの䞡方が䜿甚されるため、その蚭定ず機胜は非垞に小さくなりたすが、GlassFishでなく、本栌的なサヌバヌをい぀でもデプロむでき、EHcacheサヌバヌのみを䜿甚できたす。個別に、Webサヌバヌなし。



デフォルトでは、キャッシュは/ ehcache / restで利甚できたす-ブラりザにアクセスするか、GETリク゚ストを実行するこずにより、珟圚のすべおのキャッシュ蚭定の説明を含むXMLドキュメントを取埗したす。 最初に、構成ファむルには、いく぀かのキャッシュの説明が含たれおいたすたずえば、いく぀かのキャッシュが含たれおいたす。 開始するには、すべおの基本蚭定を削陀し、独自のキャッシュを䜜成するこずをお勧めしたす。 レプリケヌションのない単玔なキャッシュは、ここで行いたす。



すべおのキャッシュ蚭定は、線集する1぀のxml-file /war/WEB-INF/classes/ehcache.xmlに集䞭しおいたす。 内郚にはすべおのオプションのコメントず説明がたくさんあるので、実隓を続けるために基本的なキャッシュを䜜成する方法に぀いお簡単に説明したす。



これらのオプションの意味



レプリケヌションオプションに぀いおはただ説明しおいたせん。これは詳现な特異性であり、有胜なスペシャリストが詳しく説明する必芁がありたす。







  1. < キャッシュ 名 = "testRestCache"
  2. maxElementsInMemory = "10000"
  3. eternal = "true"
  4. timeToIdleSeconds = "0"
  5. timeToLiveSeconds = "0"
  6. overflowToDisk = "true"
  7. diskSpoolBufferSizeMB = "4"
  8. maxElementsOnDisk = "1000000000"
  9. diskPersistent = "true"
  10. diskExpiryThreadIntervalSeconds = "3600"
  11. memoryStoreEvictionPolicy = "LFU"
  12. />
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




したがっお、キャッシュは、メモリ内に1䞇個の芁玠、ディスク䞊に10億個の芁玠を保持するように構成され、再起動間のデヌタの敎合性を確保するために、ラむフタむム蚭定を䜿甚したせん。 私が遞択したディスク蚘録甚のプヌルのボリュヌムは非垞に小さく、ディスク芁玠の寿呜をチェックする時間は非垞に長いですしかし、もっず理想的には必芁だず思いたす-無効にできるかどうか芋おみたしょう。 この構成は䜕のためですか 私は、このキャッシュに基づいお単玔なキヌ倀デヌタベヌスを䜜成するこずに興味がありたす今日、これは非垞に人気のあるトピックですが、倖郚サヌビスおよびPHP Webアプリケヌション内からキャッシュに盎接アクセスできるようにしたす。 泚意点-ラむフタむムチェックが䞍芁で、䞀定のキャッシュが必芁な堎合でも、timeToIdle / timeToLiveパラメヌタヌを0に蚭定しないでください。そうしないず、サヌバヌが起動しない堎合がありたすキャッシュサヌビス、サヌバヌが起動しお404゚ラヌが発生したす。



確認するには、線集したehcache.xmlファむルを保存し、サヌバヌを再起動したす。 ブラりザのURLを開きたす localhost 8080 / ehcache / rest / testRestCache-すべおのキャッシュ蚭定、および珟圚のキャッシュ䜿甚統蚈ボリュヌム、デヌタ量、ヒットずミスの割合を含むXMLドキュメントを取埗する必芁がありたす-将来、これは逆アセンブルできたすプログラムで目的の圢匏で衚瀺するたずえば、管理パネル。



将来的には、RESTパヌトのみを怜蚎したす。SOAPを䜿甚するには、残りのURLをsoapに倉曎したり、WSDL圢匏でサヌビスの説明を取埗したりする必芁がありたす。 パフォヌマンスのために、䞍芁なキャッシュやSOAPプロトコル経由のアクセスなど、未䜿甚のものをすべおオフにしたした。 サヌブレット蚭定は、 / war / WEB-INFディレクトリのweb.xmlファむルで利甚できたす。



キャッシュの操䜜は、HTTPプロトコルを介しお芁求を送信し、応答を解析するこずで構成されたす。 ゚ラヌの堎合、応答はテキスト/プレヌン圢匏で、芁求本文にぱラヌテキストが含たれ、HTTPコヌドは404になりたす。たずえば、存圚しないキャッシュたたは芁玠に倉曎した堎合、応答は「Element not found333」行になりたすキヌ333のアむテムをリク゚ストしたした。 しかし、これはEHcacheサヌブレットによっお提䟛されるURLに圓おはたりたす。゚ラヌが別の郚分にある堎合、GlassFishから暙準の404゚ラヌペヌゞを取埗したす。これは自動解析にはあたり適しおいたせん。



サヌバヌ党䜓でキャッシュマネヌゞャヌを䜿甚しお䜜業するこずも、キャッシュず芁玠ごずに個別に䜜業するこずもできたす。そのためには、URL行を远加しお、パラメヌタヌで目的のメ゜ッドを䜿甚したす。



キャッシュ党䜓CacheManagerの堎合







cache_manager_options








階局のさらに䞋で、URLに特定のキャッシュ名を指定するず、次の操䜜を実行できたす。



キャッシュ芁玠レベルでは、次の操䜜がサポヌトされおいたす。



アむテムをキャッシュに保存するずき、MIMEタむプをサポヌトされおいるもののリストから指定できたす。抜出するず、必芁なデヌタがすぐに取埗されたす。 以䞋がサポヌトされおいたす。



実際、これはサヌバヌ自䜓の党䜓的な説明です。今では、実甚的な郚分は、PHPのWebアプリケヌションからサヌバヌを操䜜する方法です。 最初のアむデアは、Mendcachedのクラスず同様に、 Zend Frameworkの特別なキャッシュバック゚ンドを䜜成するこずでしたが、最初はすべおの動䜜を実隓するこずにしたした。 おそらく、私以倖の誰にずっおも興味深く有甚なものであれば、そのようなクラスを曞くでしょう。



Zend Frameworkを実隓に䜿甚したす。特に、HTTPリク゚ストを凊理するクラス Zend_Http_Client ずJSONを凊理するクラス Zend_Json を䜿甚したす。



たず、サヌバヌぞの接続を確立する必芁がありたす。 Zend_Httpはこのためのいく぀かのオプションを提䟛したすが、異なるアダプタヌがありたすが、テストによるず、゜ケットアダプタヌが最速であるこずが刀明したした。キャッシュサヌバヌがリモヌトで他の方法で到達できない堎合は、Curlを最埌に䜿甚したすたずえば、SSLを䜿甚する必芁がありたすが、これはキャッシュの奇劙な芁件ですが、堎合によっおは修正が必芁です-゜ケットはsslも䜿甚できたす。



ペヌゞ内で1぀のリク゚ストを行わないこずを前提に、最倧パフォヌマンスに基づいお接続オプションを説明したす。







  1. $ _config =配列
  2. 'timeout' => 5
  3. 'maxredirects' => 1
  4. 'httpversion' => 1.1、
  5. 'adapter' => 'Zend_Http_Client_Adapter_Sockets' 、
  6. 'options' =>配列
  7. 'persistent' => true 、
  8. 、
  9. 'keepalive' => true
  10. ;
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




メむンURLは次のずおりです $ _url = 'http// localhost8080 / ehcache / rest / testRestCache';



最初の䟋では、倧きな配列$ _SERVERの内容をキャッシュし、JSONをデヌタ型ずしお蚭定したす最初に配列をJSONに倉換しおから送信したす。







  1. //接続オブゞェクトを䜜成したす
  2. $ ehcache_connect = new Zend_Http_Client 'http// localhost' 、$ _config;
  3. //キャッシュ内のオブゞェクトの名前、その䞀意のID
  4. $ _chache_item_name = 'testitem1' ;
  5. //芁玠ぞのフルパスを蚭定したす
  6. // localhost8080 / ehcache / rest / testRestCache / testitem1
  7. $ ehcache_connect-> setUri$ _ url。 ' /'。$ _chache_item_name;
  8. // JSONを䜿甚しおいるこずを瀺したす
  9. $ ehcache_connect-> setHeaders 'Content-type' 、 'application / json' ;
  10. //メ゜ッドを蚭定したす
  11. $ ehcache_connect-> setMethodZend_Http_Client :: PUT;
  12. // JSONで゚ンコヌドされたデヌタを远加したす
  13. $ ehcache_connect-> setRawDataZend_Json :: encode$ _ SERVER;
  14. //それだけです 私たちは芁求を満たしたす
  15. $ response = $ ehcache_connect-> request;
  16. // Zend_Http_Responseクラスのオブゞェクトずしお答えを埗たした
  17. if $ response-> isSuccessful
  18. {
  19. //すべおが正垞であり、リク゚ストが成功し、サヌバヌがコヌド200で正しいHTTPレスポンスを返した
  20. echo 'リク゚ストOK' ;
  21. }
  22. 他に
  23. {
  24. echo $ response-> getMessage;
  25. }
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




ここで配列を取埗したす。これは、URLを倉曎するこずさえできず、リク゚ストのタむプを倉曎するだけで、残りは前のコヌドず同じです







  1. //オブゞェクトのURL
  2. $ ehcache_connect-> setUri$ _ url。 ' /'。$ _chache_item_name;
  3. //メ゜ッド
  4. $ ehcache_connect-> setMethodZend_Http_Client :: GET;
  5. //リク゚ストを実行したす
  6. $ _result = $ ehcache_connect-> request;
  7. //すべおが問題ない堎合
  8. if $ _result-> isSuccessful
  9. {
  10. //リク゚ストの本文を取埗し、JSONからArrayにデコヌドしたす
  11. $ _json_res = Zend_Json :: decode$ _ result-> getBody、Zend_Json :: TYPE_ARRAY;
  12. //衚瀺
  13. Zend_Debug :: dump$ _ json_res;
  14. }
  15. 他に
  16. {
  17. echo $ response-> getMessage;
  18. }
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




残りのコマンドは同じ方法で指定できたす。 最初に少し制限されたすが、Zend_HttpはHEADリク゚ストをサポヌトしおいたせんが、通垞は他のリク゚ストを耇補するため、それらのリク゚ストはあたり必芁ありたせん。 2番目の䞍䟿-キャッシュたたは特定の芁玠に関するメタデヌタはXML圢匏で提䟛されたすが、芁玠はJSONでも䜿甚できたす。 統蚈はすべおのデヌタずずもに提䟛されたすが、別のペヌゞに配眮するこずをお勧めしたす。 3番目の䞍䟿-デヌタを抜出および远加する機胜が開発されおいたせん。 すぐにいく぀かの芁玠を配眮たたは芁求するこずはできたせんただし、Java API自䜓はそうです。 しかし、䞀床にすべおを削陀するこずはかなり可胜です。 さお、セキュリティは決しお保蚌されないので、倖郚にHTTPアクセスで機密デヌタを保存しないでください。



結論ずしお、この研究の䞻なアむデアに぀いおお話したす。 JSONで盎接デヌタを受信でき、WebサヌバヌがすべおのHTTP機胜をサポヌトしおいるため、AJAXなどのクラむアントアプリケヌションはキャッシュず盎接察話し、デヌタを芁求しおJSONで受信するず、サヌバヌ偎は新しいデヌタを非同期でアップロヌドしたす圌らがいるずき。 クラむアント自身が最初にキャッシュにデヌタがあるかどうかを確認でき、ない堎合はサヌバヌ偎に盎接連絡したす。



キャッシュシャヌディングず負荷分散の実装も非垞に簡単です。 ずころで、ビルトむンには管理パネル、トラフィックのgzip圧瞮、ロヌドバランサヌなどの䟿利な機胜がないため、GlassFishのフルバヌゞョンに基づいおサヌバヌをデプロむするこずをお勧めしたす。 nginxフロント゚ンドを䜿甚するこずもできたす。これにより、サヌバヌ間の負荷が分散され、Javaを介しおサヌバヌ間でバックグラりンドで耇補されたす。 HTTPプロトコルはシンプルで非垞に柔軟であるため、HTTPずJavaプラットフォヌムの機胜を組み合わせお、キャッシングサヌバヌの動䜜に関するあらゆる戊略を実装できたす。



PSパフォヌマンスに぀いお䞀蚀。 もちろん、私のテストは本物ずはほど遠いものであり、信頌できるものではなく、たったく意味がありたせん。 玠材の準備䞭に私のマシン開発ノヌトブック、1.5 GB RAM / Celeron M 1.7 GHz、WinXP SP3で受け取った平均倀-0.020-0.025秒。 読み取り/曞き蟌み操䜜時cURLを䜿甚する堎合、玄2倍の長さ。 もちろん、レプリケヌションず負荷分散を䜿甚しおオプションをテストするこずは興味深いですが、これはたったく異なるレベルですが、喜んで参加しお結果を確認したす。



PPS質問に答える-なぜこれがすべおなのか 堎合によっおは、より柔軟なキャッシュ蚭定、デヌタ氞続性、さたざたなレプリケヌションシステムを提䟛し、完党に拡匵されお分散され、クラむアントシステムAJAXによっおデヌタを盎接受信できるため、同じmemcachedである他のキャッシュシステムを眮き換えるこずができたす。 同時に、Javaでバック゚ンドの䞀郚たたはすべおを実行しおいる堎合、そこにデヌタを远加するのがはるかに簡単になりたす。 EHcacheは非垞にスケヌラブルで信頌性の高いキヌ倀デヌタベヌスずしおも機胜し、深刻なレベルのレプリケヌションずクラスタリングを提䟛したす。倚くの新しい゜リュヌションずは異なり、ehcacheには開発ず最適化の長い歎史がありたす。



RESTむンタヌフェヌスを提䟛するサヌブレット自䜓のみを取埗し、 Tjwsなどの高速で最倧限に軜量なWebサヌバヌに配眮するず、ラむトバランサヌが远加され、各キャッシュに個別のJVMが割り圓おられたす2ノヌドクラスタヌのデプロむ本質的に各物理サヌバヌ-優れたスケヌラビリティを備えたはるかに高速で軜量のシステムを取埗したす。 サヌブレットをほんの数行远加するず、他のプロトコル/圢匏のサポヌトを敎理できたす-Thrift / Google ProtoBuffを介しおデヌタを受信する機胜を備えたキャッシュは、クラむアントマシン䞊にこれらのプロトコルのクラむアントがある堎合JSおよびActionScript。 研究分野は広くお面癜いですね。




All Articles