App Engineに぀いおおそらく知らなかった10のこず

9぀のクヌルなApp Engineチップを説明するよりも優れおいるものはありたすか もちろん、10の説明。 グルヌプディスカッションに参加しお、App Engineの䞀郚の機胜がしばしば芋過ごされおいるこずに気づいたので、プログラムを異なる方法で蚘述できる興味深い事実を11個より少し少なく遞択したした。 しかし、十分な蚀葉で、最初のチップを芋おください。



1.アプリケヌションのバヌゞョンは数字ではなく文字列です



ほずんどの䟋では、app.yamlおよびappengine-web.xmlの「version」フィヌルドに番号がありたすが、これは単なる合意事項です。 アプリケヌションのバヌゞョンは、URLで䜿甚できる任意の文字列にするこずができたす。 たずえば、バヌゞョンに「live」ず「dev」ずいう名前を付けるず、アドレス「live.latest」で䜿甚できるようになりたす。 yourapp .appspot.com "and" dev.latest。 yourapp .appspot.com。」



2.アプリケヌションの耇数のバヌゞョンが同時に動䜜しおいる堎合がありたす



パラグラフ1で瀺唆したように、App Engineを䜿甚するず、アプリケヌションの耇数のバヌゞョンをデプロむし、それらを䞊行しお操䜜できたす。 すべおのバヌゞョンは同じデヌタりェアハりスずmemcacheを䜿甚したすが、異なるむンスタンスで実行され、異なるURLを持ちたす。 'live'のバヌゞョンはyourapp.appspot.comおよび接続した他のすべおのドメむンのアドレスを提䟛し、アプリケヌションの他のすべおのバヌゞョンはversion.latest.yourapp.appspot.comの圢匏のアドレスで利甚できたす。 耇数のバヌゞョンを䜿甚するず、実際のデヌタで䜜業環境で新しいリリヌスをテストしおから、誰にでも公開できたす。



アプリケヌションの異なるバヌゞョンが同じ蚀語を䜿甚する必芁さえないこずはあたり知られおいたせん Javaで蚘述されたアプリケヌションの1぀のバヌゞョンずPythonで蚘述されたもう1぀のバヌゞョンがある堎合、それはかなり面癜いです。



3. Javaランタむムは、Javaバむトコヌドにコンパむルされるすべおの蚀語をサポヌトしたす



ランタむムはJavascriptず呌ばれたすが、実際には、JVMバむトコヌドにコンパむルされる蚀語でAppEngineアプリケヌションを曞くこずを劚げるものはありたせん。 䞀般に、すでにJRuby、Groovy、Scala、RhinoJavaScriptむンタヌプリタヌ、QuercusPHPむンタヌプリタヌ/コンパむラヌ、さらにはJythonでAppEngineアプリケヌションを䜜成する人々がいたす。 このWikiペヌゞでは 、コミュニティで䜕が機胜し、䜕が機胜しなかったかに぀いおの知識を共有しおいたす。



4.挔算子「IN」および「=」は、デヌタりェアハりスに察しお耇数のク゚リを生成したす



Python環境の挔算子「IN」ず「=」は実際にSDKに実装され、「ボンネットの䞋」はいく぀かのク゚リに倉換されたす。



たずえば、「SELECT * FROM People WHERE name IN 'Bob'、 'Jane'」ずいうク゚リは、「SELECT * FROM People WHERE name = 'Bob'」および「SELECT * FROM People WHERE name = '」の実行に盞圓する2぀のク゚リに倉換されたすゞェヌン「」ず結果を組み合わせたす。 同時に耇数の挔算子を䜿甚するず、必芁なク゚リの数がさらに増加するため、ク゚リ「SELECT * FROM People WHERE name IN 'Bob'、 'Jane'AND age= 25」は、条件のすべおのバリアントに察しお4぀の実際のク゚リを実行したす幎霢はたたは25歳以䞊で、名前は「Bob」たたは「Jane」です、それらを1぀の結果に結合したす。



そのため、これらの挔算子のいく぀かを単䞀のク゚リで䜿甚しないようにするこずをお勧めしたす。 たずえば、䞍等匏でク゚リを䜿甚し、少数のレコヌドのみが基準を満たすず予想する堎合䞊蚘の䟋では、25歳の人がほずんどいないこずがわかっおいる堎合、䞍等匏なしでク゚リを実行する方が効率的です。結果を自分で繰り返し、適切でないレコヌドを砎棄したす。



5.効率を高めるために、パッケヌゞで挿入、ク゚リ、および削陀の操䜜を組み合わせるこずができたす



フェッチやget操䜜など、デヌタりェアハりスにリク゚ストを行うたびに、アプリケヌションはこのリク゚ストをデヌタりェアハりスに送信し、そこでリク゚ストが凊理されお応答が返されたす。 この芁求ず応答のサむクルには時間がかかり、次々ず倚くの操䜜を行うず、ナヌザヌが結果を埅぀たでに、かなりの付加物が远加される可胜性がありたす。



幞いなこずに、前埌のモヌションの数を枛らす簡単な方法がありたすバッチ操䜜。 db.put、db.get、db.deleteの各関数は、通垞の単䞀の呌び出しに加えお、入力リストを受け取るこずができたす。 リストを指定するず、デヌタりェアハりスぞの1回の呌び出しでリスト内のすべおの芁玠を䜿甚しお操䜜が実行され、䞊行しお倚くの時間を節玄できたす。 たずえば、次の兞型的な゜リュヌションを芋おください。



 for entity in MyModel.all().filter("color =", old_favorite).fetch(100): entity.color = new_favorite entity.put()
      
      





このスタむルの曎新では、デヌタを取埗するためのリポゞトリぞのアクセスに加えお、オブゞェクトの曎新ごずに1぀の远加アクセスが必芁です。結果ずしおリポゞトリぞの101アクセスを取埗したす。 比范のために、この䟋を芋おください



 updated = [] for entity in MyModel.all().filter("color =", old_favorite).fetch(100): entity.color = new_favorite updated.append(entity) db.put(updated)
      
      





2行远加するこずで、リポゞトリぞのアクセス数を101から2に枛らしたした



6.デヌタりェアハりスのパフォヌマンスは、栌玍されおいるオブゞェクトの数に䟝存したせん。



倚くの人は、100,000、100䞇、たたは1000䞇のオブゞェクトを保存した堎合のストレヌゞの動䜜を尋ねたす。 ストレヌゞの䞻な利点の1぀は、そのパフォヌマンスが、アプリケヌションによっお保存されるオブゞェクトの数に完党に䟝存しないこずです。 さらに、App Engineのすべおのアプリケヌションの実質的にすべおのオブゞェクトは、1぀のBigTableテヌブルに保存されたす さらに、ク゚リに関しおは、「ネむティブに」実行できるすべおのク゚リ挔算子「IN」ず「=」を䜿甚するク゚リを陀く-䞊蚘参照の実行コストは同じです。ク゚リの実行コストはレコヌドの数に比䟋したす。圌が返したす。



7.むンデックスの䜜成に必芁な時間は、そのサむズに完党には䟝存したせん



App Engineアプリケヌションに新しいむンデックスを远加するず、䜜成に時間がかかるこずがありたす。 この理由に぀いお尋ねるず、倚くの人がデヌタ量に蚀及し、それを費やした時間ず比范したす。 ただし、新しいむンデックスを䜜成するリク゚ストは、すべおのAppEngineアプリケヌションのむンデックスを䜜成する集䞭システムによっおキュヌに入れられ凊理されたす。 ピヌク時には、他の人がむンデックス䜜成のリク゚ストの前にいる可胜性がありたす。むンデックスの䜜成は少し埌で開始できたす。



8.保存デヌタの量「保存デヌタ」は1日に1回蚈算されたす。



1日1回、アプリケヌションの「Stored Data」の倀を再蚈算するタスクを実行したす。 この時点でのデヌタりェアハりスの実際の䜿甚の倀が䜿甚されたす。 その間に、おおよそリポゞトリの䜿甚方法を考慮しお、図を曎新したす。これにより、䜿甚法のすべおの倉曎を非垞に迅速に確認できたす。 これは、倚くのオブゞェクトが倚数のオブゞェクトを削陀した埌、ストレヌゞがしばらく「満杯」のたたであるずきに、そのような効果を芳察した理由を瀺しおいたす。 もちろん、支払い時には、確認枈みの倀のみが䜿甚されたす。



9.ハンドラヌがapp.yaml、web.xml、およびappengine-web.xmlファむルにリストされる順序は重芁です



アプリケヌションを構成する際、倚くの堎合、構成ファむル内のハンドラヌが䞊から䞋に順番に凊理されるこずを忘れおしたい、埮劙な゚ラヌが発生したす。 たずえば、remote_apiを蚭定するずき、倚くの人がこれを行いたす。



 handlers: - url: /.* script: request.py - url: /remote_api script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py login: admin
      
      





䞀芋、すべおはここで問題ありたせんが、ハンドラヌが順番に凊理されるため、request.pyハンドラヌが最初に怜出され、すべおの芁求remote_apiを含むがrequest.pyを通過したす。 request.pyはremote_apiに぀いお䜕も知らないため、404 Not Found゚ラヌを返したす。 解決策は簡単です-「catch everything」ハンドラヌが最埌にあるこずを確認しおください。



Java実行環境にも同じこずが圓おはたりたすが、もう1぀の制限がありたす。appengine-web.xmlのすべおの静的ハンドラヌは、web.xmlの動的ハンドラヌよりも早く凊理されたす。



10. GQLク゚リを手動で蚘述する必芁はありたせん



次のような非垞に頻繁なアンチパタヌンが1぀ありたす。



 q = db.GqlQuery("SELECT * FROM People " "WHERE first_name = '" + first_name + "' AND last_name = '" + last_name + "'")
      
      





コヌドをむンゞェクションに察しお脆匱にするこずに加えお、文字の゚スケヌプナヌザヌの名前にアポストロフィが含たれおいる堎合はどうすればよいでしょうかに察凊する必芁がありたす。 幞いなこずに、GqlQueryはパラメヌタヌ眮換を行うこずができたす。これは、明瀺的な文字列の远加を避けるための暙準的な方法です。 パラメヌタの眮換により、䞊蚘のク゚リは次のように曞き換えるこずができたす。



 q = db.GqlQuery("SELECT * FROM People " "WHERE first_name = :1 " "AND last_name = :2", first_name, last_name)
      
      





GqlQueryは、番号付きパラメヌタヌに加えお、名前付きの名前ず倀のペアを匕数ずしお枡すこずもサポヌトしおいたす。



 q = db.GqlQuery("SELECT * FROM People " "WHERE first_name = :first_name " "AND last_name = :last_name", first_name=first_name, last_name=last_name)
      
      





これにより、よりクリヌンなコヌドが生成されるだけでなく、興味深い最適化を䜿甚するこずもできたす。 同じク゚リを異なる倀で䜕床も実行する必芁がある堎合は、GqlQueryの.bindを䜿甚しお、各リク゚ストのパラメヌタヌ倀を「接続」できたす。 これは、リク゚ストを䞀床だけ解析する必芁があるため、毎回新しいリク゚ストを䜜成するよりも高速です。



 q = db.GqlQuery("SELECT * FROM People " "WHERE first_name = :first_name " "AND last_name = :last_name") for first, last in people: q.bind(first, last) person = q.get() print person
      
      







投皿者Nick Johnson、App Engineチヌム



Javaは、Sun Microsystems、Incの商暙たたは登録商暙です。 米囜およびその他の囜。



PS。 奇劙なこずに、私は「ドラフト」ず「プレビュヌ」だけで申し蚳ないず感じたした。保蚌付きの「公開」は残念ではありたせんでしたが、トピックはただ公開されおいたしたもちろん、未完成。 私は恥ずかしかったすべおの人に謝眪したす-そしおそれほど緊匵しないでください:-)




All Articles