Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread Yasuo Higa
Hi Jeff,

 In other words, Twig cannot perform the simple query:

 IterableObject foo = ofy.query().ancestor(yourobject);

 If you ever want to support something like this, you will need a
 registration process.

 If you ever want to support true polymorphic queries, you will need a
 registration process.

Slim3 supports kindless ancestor queries and true polymorphic queries,
and does not need a registration process.

http://sites.google.com/site/slim3appengine/slim3-datastore/queries-and-indexes/introducing-queries
http://sites.google.com/site/slim3appengine/slim3-datastore/polymorphic-model

Yasuo Higa

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread John Patterson

On 1 Apr 2010, at 12:51, Jeff Schnitzer wrote:


In other words, Twig cannot perform the simple query:

IterableObject foo = ofy.query().ancestor(yourobject);


All queries that are possible with the low-level datastore are  
possible with Twig because there are low-level to type-safe bridge  
methods.  So you can simply do a typeless low-level ancestor query and  
then get Twig to convert the resulting Entities into typesafe instances.


Quite frankly there just hasn't yet been the need to build un-typed  
queries into the API.  But if a good common use case arises then it  
would fit in nicely to the FindCommand.



If you ever want to support something like this, you will need a
registration process.


That is a completely incorrect conclusion to jump to.  As I said,   
there actually was a very similar untyped query in the API that I  
removed because it didn't seem so useful.


I am curious about what limitations Objectify has that makes this a  
requirement.  This thread (or this forum) is probably not the best  
place to discuss the internal implementation details of future  
features for Twig or Objectify so it might be better to take this  
topic offline.



If you ever want to support true polymorphic queries, you will need a
registration process.


Just wrong.  What ever makes you claim that?


Don't claim this short-sightedness as a feature.



Think twice before posting replies at the end of a long day.

--
You received this message because you are subscribed to the Google Groups Google 
App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread Jeff Schnitzer
On Thu, Apr 1, 2010 at 12:45 AM, John Patterson jdpatter...@gmail.com wrote:

 All queries that are possible with the low-level datastore are possible with
 Twig because there are low-level to type-safe bridge methods.  So you can
 simply do a typeless low-level ancestor query and then get Twig to convert
 the resulting Entities into typesafe instances.

That's nonsense.  This could only work if you've either encoded the
full java package and classname into the Entity (a colossal mistake)
or you've somehow registered a mapping (typically from Kind, but it
could be any synthetic field) to the java class ahead of time.  This
means that

Your framework can't perform magic.  A truly polymorphic query (of
which ancestor queries are one flavor) doesn't know the concrete type
of the object until it's fetched from the datastore.  If you don't
understand this, you haven't thought about the problem enough.

Jeff

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread John Patterson


On 1 Apr 2010, at 15:04, Jeff Schnitzer wrote:


or you've somehow registered a mapping (typically from Kind, but it
could be any synthetic field) to the java class ahead of time.  This
means that


You are making a classic premature optimization mistake.

Twig is built on the principal that it should work out of the box with  
*zero* configuration and then allow optimizations to increase  
performance after the application is up and running.  According to  
this principal safe defaults are needed for many settings: all fields  
are indexed by default, all fields are stored by default and all  
references are stored as independent entities (c.f. embedded, parent  
or child entities).


The only String value that can uniquely identify a class with no  
registration is its fully qualified type name.  I see no problem  
using that kind name as a sensible default.  There is nothing special  
about it - its just a default that can be changed later.  In fact I  
recommend defining a shorter name as an optimisation to save datastore  
space.


If you rename your class and want to keep the same data you will need  
to explicitly define the kind name for the class.



Your framework can't perform magic.


Actually it does contain a small bit of magic but it's not well  
documented.



A truly polymorphic query (of
which ancestor queries are one flavor) doesn't know the concrete type
of the object until it's fetched from the datastore.  If you don't
understand this, you haven't thought about the problem enough.


Chill Jeff...  I've thought about the problem and so has Yasuo.  I  
imagine this sensible default will eventually make its way into  
Objectify once you think about it some more :)


Now lets keep this in perspective: on my mac mini I can run about 3  
million reflective calls to get a constructor in a second.  I do not  
claim that enforced registration is bad for startup times - it is  
almost insignificant.  Its just a pain in the ass when a default can  
handle it for you out-of-the-box.


John

--
You received this message because you are subscribed to the Google Groups Google 
App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread John Patterson


On 1 Apr 2010, at 14:58, Jeff Schnitzer wrote:

If you go with #2, you've just created a framework that will break
your datastore when you rename your Java objects.  I'll assume nobody
thinks this is actually a good idea.


From a quick browse of the Objectify source code it looks to me like  
the default is to use Class.getSimpleName() for the kind name which  
will also break on renaming and doesn't even have the advantage of  
working out-of-the-box with no registration.


--
You received this message because you are subscribed to the Google Groups Google 
App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread Jeff Schnitzer
On Thu, Apr 1, 2010 at 1:57 AM, John Patterson jdpatter...@gmail.com wrote:

 You are making a classic premature optimization mistake.
 [...]
 The only String value that can uniquely identify a class with no
 registration is its fully qualified type name.  I see no problem using
 that kind name as a sensible default.  There is nothing special about it -
 its just a default that can be changed later.  In fact I recommend defining
 a shorter name as an optimisation to save datastore space.
 If you rename your class and want to keep the same data you will need to
 explicitly define the kind name for the class.

1) I vehemently disagree that fully-qualified java class names should
show up in the datastore.  It's one of those things that nobody
notices at the beginning and then becomes cruft that is difficult to
change sometime later.  Ask any DBA what they think of creating tables
named com.mycompany.project.component.entity.MyEntity - and it's
*way* easier to change table names on an RDBMS than it is in GAE.

2) As you note, long kind names will significantly increase your
storage requirements.  Full package paths in the kind name are just a
bad idea.

3) If you rename your class (or use a shorter name), you will need to
register your entities ahead of time.  That is, if you want
polymorphic queries to work.

So... you've avoided registration in the simple, un-shortened case
(which you don't recommend) by storing full java package paths in the
datastore.  You call registration premature optimization, I call it
planning ahead.

Jeff

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread Jeff Schnitzer
On Thu, Apr 1, 2010 at 2:19 AM, John Patterson jdpatter...@gmail.com wrote:

 From a quick browse of the Objectify source code it looks to me like the
 default is to use Class.getSimpleName() for the kind name which will also
 break on renaming and doesn't even have the advantage of working
 out-of-the-box with no registration.

This approach has quite a few advantages:

 * It tends to be short
 * You can repackage at will
 * Even changing the classname is merely a question of adding
@Entity(name=OldName)

If Objectify users always register their classes explicitly, their
code will always work.  Not most of the time or for most queries
but *all of the time*.  It would be trivial to autoregister classes on
first explicit use, but it wouldn't work *all of the time*.

Jeff

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread John Patterson


On 1 Apr 2010, at 16:20, Jeff Schnitzer wrote:


1) I vehemently disagree that fully-qualified java class names should
show up in the datastore.  It's one of those things that nobody
notices at the beginning and then becomes cruft that is difficult to
change sometime later.  Ask any DBA what they think of creating tables
named com.mycompany.project.component.entity.MyEntity - and it's
*way* easier to change table names on an RDBMS than it is in GAE.


One string is pretty much as good as another as long as it is unique  
for a class.  Whether you like that string is of secondary  
importance to supporting the goal of zero-configuration



2) As you note, long kind names will significantly increase your
storage requirements.  Full package paths in the kind name are just a
bad idea.


They are un-optimised.  Optimise them later when your app or prototype  
is running and its time to tune performance.  Personally, about half  
of my data models explicitly define their kind name.  The rest either  
are not present in such large numbers to impact storage or have not  
been renamed.



3) If you rename your class (or use a shorter name), you will need to
register your entities ahead of time.  That is, if you want
polymorphic queries to work.


Yes.  That is assuming you want to keep the data that was stored with  
the old kind name.  During development/prototyping  this is not always  
the case.



So... you've avoided registration in the simple, un-shortened case
(which you don't recommend)


Exactly.  The simple case is not optimised.


You call registration premature optimization, I call it
planning ahead.


Different goals.  Working out-of-the-box with no configuration is one  
of the basic features of the using the ObjectDatastore.





--
You received this message because you are subscribed to the Google Groups Google 
App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread John Patterson


On 1 Apr 2010, at 16:26, Jeff Schnitzer wrote:

On Thu, Apr 1, 2010 at 2:19 AM, John Patterson  
jdpatter...@gmail.com wrote:


From a quick browse of the Objectify source code it looks to me  
like the
default is to use Class.getSimpleName() for the kind name which  
will also

break on renaming and doesn't even have the advantage of working
out-of-the-box with no registration.


This approach has quite a few advantages:

* It tends to be short
* You can repackage at will
* Even changing the classname is merely a question of adding
@Entity(name=OldName)

If Objectify users always register their classes explicitly, their
code will always work.  Not most of the time or for most queries
but *all of the time*.  It would be trivial to autoregister classes on
first explicit use, but it wouldn't work *all of the time*.


These advantages are also present with Twig (and presumably Slims  
implementation?).  The difference is one of defaults - you do not  
*have* to register classes to get started with Twigs ObjectDatastore.   
The defaults will just work.


To be clear, Twig *never* registers kind names for Classes on first  
use.  What it does do is cache reflective meta-data on first use as an  
optimisation.  But admittedly, this is hardly even relevant in the  
context of an RPC call.



--
You received this message because you are subscribed to the Google Groups Google 
App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread Duong BaTien
Hi:

On Wed, 2010-03-31 at 22:51 -0700, Jeff Schnitzer wrote:
 On Wed, Mar 31, 2010 at 6:41 PM, jd jdpatter...@gmail.com wrote:
 
  On Apr 1, 3:14 am, Jeff Schnitzer j...@infohazard.org wrote:
  What does Twig do when someone issues a type-less query?
 
  datastore.find().addFilter(color, EQUAL, green). returnResultsNow()
 
  The expression above is actually not possible to enter using the
  fluent commands.  You can only set a filter on the interface that is
  returned from calling FindCommand.type(Class?)
 
  It is also illegal according to the datastore docs for a Query with no
  kind:
 
  Currently the only operations supported on a kind-less query are
  filter by __key__, ancestor, and order by __key__ ascending
 
 In other words, Twig cannot perform the simple query:
 
 IterableObject foo = ofy.query().ancestor(yourobject);
 

This is the required pattern shown in Google IO scalable application for
GAE.

Duong BaTien
DBGROUPS and BudhNet

 If you ever want to support something like this, you will need a
 registration process.
 
 If you ever want to support true polymorphic queries, you will need a
 registration process.
 
 Don't claim this short-sightedness as a feature.
 
 Jeff
 

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-04-01 Thread John Patterson


On 1 Apr 2010, at 19:02, Duong BaTien wrote:


Hi:


IterableObject foo = ofy.query().ancestor(yourobject);



This is the required pattern shown in Google IO scalable application  
for

GAE.



If you are talking about the million fan out problem in Bret  
Slatkins talk that was also a typed query.  So more like this:


IterableObject foo = ofy.query(MessageIndex.class).ancestor(message);

--
You received this message because you are subscribed to the Google Groups Google 
App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



[appengine-java] Re: Why should app startup times be a problem.

2010-03-31 Thread SRF
David, Ikai:

Thanks very much for those blog posts on reducing the cold start
time.  I think 1 to 2 seconds is reasonable.  I'm definitely going to
take a closer look at Objectify.

++Steve

On Mar 30, 4:54 pm, Ikai L (Google) ika...@google.com wrote:
 David, that post mirrors many of the points made here:

 http://www.answercow.com/2010/03/google-app-engine-cold-start-guide-f...

 There's one or two more tips on that page.

 On Tue, Mar 30, 2010 at 12:47 PM, David Chandler turboman...@gmail.comwrote:





  In the mean time, here are some ideas for reducing startup times by
  shrinking our apps. I went from 8.1s to 2.5s mainly by eliminating
  Guice, and I would expect similar results with Spring. I can
  definitely live with 2.5s...

 http://turbomanage.wordpress.com/2010/03/26/appengine-cold-starts-con...

  /dmc

  On Mar 30, 3:04 pm, Baz b...@thinkloop.com wrote:
   Great information, Ikai.

   I really feel that instances should be completely avoided in concept
  and
   language on the GAE. What if the feature was simply an enable/disable
  deal
   called Warm Scale. If it were enabled, then your *next* instance would
   always be warm, regardless of how many instances you already had. This
  would
   be most noticeable and suitable for low QPS production apps that are
   constantly going from 0 to 1 instances (as you mentioned), but it could
   still be important for others, say, for a super-high-profile site, or a
   situation where your QPS is right at the threshold of instances and
   oscillating back and forth between two instances. Whatever the situation,
  if
   the solution were generalized like that, and most importantly not tied to
  a
   SPECIFIC NUMBER of instances, it would be up to the user to decide how
   important it was for them and whether to enable it.

   Cheers,
   Baz

  --
  You received this message because you are subscribed to the Google Groups
  Google App Engine for Java group.
  To post to this group, send email to
  google-appengine-j...@googlegroups.com.
  To unsubscribe from this group, send email to
  google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2B 
  unsubscr...@googlegroups.com
  .
  For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.

 --
 Ikai Lan
 Developer Programs Engineer, Google App 
 Enginehttp://googleappengine.blogspot.com|http://twitter.com/app_engine

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-31 Thread Blake Caldwell
Yeah, that blog post was awesome. I started moving to Twig last night.
I understand and appreciate the concerns of others that frameworks are
our friends, and that it's not unreasonable to use them, but at the
same time, CPU and network optimization are even more important, so
long as the barrier to achieve them isn't too high.

 From the few hours I've spent with Twig, it seems easier -  not
harder than JDO for everything I'm doing. If you want to use JPA or
JDO because you're already familiar with them, that's great and all,
but the mapping to BigTable isn't that straight forward, so cramming
the framework on top might not be the answer.

Create a data store tier, wrap all Twig/Objectify logic in there, and
while your app won't be as portable as if you were using JDO, it'll
perform better, use less resources, and not be terribly dificult to
port later on, if you have to.

My $0.02


---
Sent from my iPad

On Mar 31, 2010, at 6:23 AM, SRF srfar...@gmail.com wrote:

 David, Ikai:

 Thanks very much for those blog posts on reducing the cold start
 time.  I think 1 to 2 seconds is reasonable.  I'm definitely going to
 take a closer look at Objectify.

 ++Steve

 On Mar 30, 4:54 pm, Ikai L (Google) ika...@google.com wrote:
 David, that post mirrors many of the points made here:

 http://www.answercow.com/2010/03/google-app-engine-cold-start-guide-
 f...

 There's one or two more tips on that page.

 On Tue, Mar 30, 2010 at 12:47 PM, David Chandler
 turboman...@gmail.comwrote:





 In the mean time, here are some ideas for reducing startup times by
 shrinking our apps. I went from 8.1s to 2.5s mainly by eliminating
 Guice, and I would expect similar results with Spring. I can
 definitely live with 2.5s...

 http://turbomanage.wordpress.com/2010/03/26/appengine-cold-starts-con
 ...

 /dmc

 On Mar 30, 3:04 pm, Baz b...@thinkloop.com wrote:
 Great information, Ikai.

 I really feel that instances should be completely avoided in
 concept
 and
 language on the GAE. What if the feature was simply an enable/
 disable
 deal
 called Warm Scale. If it were enabled, then your *next*
 instance would
 always be warm, regardless of how many instances you already had.
 This
 would
 be most noticeable and suitable for low QPS production apps that
 are
 constantly going from 0 to 1 instances (as you mentioned), but it
 could
 still be important for others, say, for a super-high-profile
 site, or a
 situation where your QPS is right at the threshold of instances and
 oscillating back and forth between two instances. Whatever the
 situation,
 if
 the solution were generalized like that, and most importantly not
 tied to
 a
 SPECIFIC NUMBER of instances, it would be up to the user to
 decide how
 important it was for them and whether to enable it.

 Cheers,
 Baz

 --
 You received this message because you are subscribed to the Google
 Groups
 Google App Engine for Java group.
 To post to this group, send email to
 google-appengine-j...@googlegroups.com.
 To unsubscribe from this group, send email to
 google-appengine-java+unsubscr...@googlegroups.comgoogle-
 appengine-java%2B unsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.

 --
 Ikai Lan
 Developer Programs Engineer, Google App Enginehttp://
 googleappengine.blogspot.com|http://twitter.com/app_engine

 --
 You received this message because you are subscribed to the Google
 Groups Google App Engine for Java group.
 To post to this group, send email to google-appengine-java@googlegroups.com
 .
 To unsubscribe from this group, send email to 
 google-appengine-java+unsubscr...@googlegroups.com
 .
 For more options, visit this group at 
 http://groups.google.com/group/google-appengine-java?hl=en
 .


-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-31 Thread John Patterson


On 31 Mar 2010, at 17:58, Blake Caldwell wrote:

From the few hours I've spent with Twig, it seems easier -  not
harder than JDO for everything I'm doing.


Nice to hear.  You should get improved in ease of use from all of the  
non-standard persistence interfaces designed specifically at the  
datastore - just choose the features you need.  Twigs ObjectDatastore  
aims to be as efficient as hand coded low-level solutions with no  
startup overhead.  Unlike some of the other frameworks there is no  
registration process for your data model classes - each class is  
analyzed the first time it is used per server instance and the meta- 
data is cached for the duration of the instance.


One user found that queries which had to be run as tasks previously  
with JDO could now be calculated on the fly in real time by using the  
ObjectDatastore.


Performance can be compared directly to JDO - I believe that Twig is  
the only option which  allows you to reuse you stored JDO data -  
correct me if I am wrong on that.



If you want to use JPA or
JDO because you're already familiar with them, that's great and all,
but the mapping to BigTable isn't that straight forward, so cramming
the framework on top might not be the answer.

Create a data store tier, wrap all Twig/Objectify logic in there, and
while your app won't be as portable as if you were using JDO, it'll
perform better, use less resources, and not be terribly dificult to
port later on, if you have to.


Exactly.  If you ever find yourself creating DTO's to abstract away  
details of the persistence framework you use then consider that data  
models in Twig *are* your DTOs - they have no dependencies at all.   
Pure POJOs which are really simple to port to any persistence  
interface you choose.


It also makes working with GWT a breeze because you can send a whole  
object graph over the wire without having to fetch each item by Key  
(or KeyT)




My $0.02



$0.04 total

--
You received this message because you are subscribed to the Google Groups Google 
App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-31 Thread Tobias Rothe
looks interesting. I think I will give this a try.
Can someone give any advice on doing full-text search over datastore
entities? Compass+lucene is by far the heaviest part of my application.

On Wed, Mar 31, 2010 at 3:36 PM, John Patterson jdpatter...@gmail.comwrote:


 On 31 Mar 2010, at 17:58, Blake Caldwell wrote:

 From the few hours I've spent with Twig, it seems easier -  not
 harder than JDO for everything I'm doing.


 Nice to hear.  You should get improved in ease of use from all of the
 non-standard persistence interfaces designed specifically at the datastore -
 just choose the features you need.  Twigs ObjectDatastore aims to be as
 efficient as hand coded low-level solutions with no startup overhead.
  Unlike some of the other frameworks there is no registration process for
 your data model classes - each class is analyzed the first time it is used
 per server instance and the meta-data is cached for the duration of the
 instance.

 One user found that queries which had to be run as tasks previously with
 JDO could now be calculated on the fly in real time by using the
 ObjectDatastore.

 Performance can be compared directly to JDO - I believe that Twig is the
 only option which  allows you to reuse you stored JDO data - correct me if I
 am wrong on that.


  If you want to use JPA or
 JDO because you're already familiar with them, that's great and all,
 but the mapping to BigTable isn't that straight forward, so cramming
 the framework on top might not be the answer.

 Create a data store tier, wrap all Twig/Objectify logic in there, and
 while your app won't be as portable as if you were using JDO, it'll
 perform better, use less resources, and not be terribly dificult to
 port later on, if you have to.


 Exactly.  If you ever find yourself creating DTO's to abstract away details
 of the persistence framework you use then consider that data models in Twig
 *are* your DTOs - they have no dependencies at all.  Pure POJOs which are
 really simple to port to any persistence interface you choose.

 It also makes working with GWT a breeze because you can send a whole object
 graph over the wire without having to fetch each item by Key (or KeyT)


 My $0.02


 $0.04 total

 --
 You received this message because you are subscribed to the Google Groups
 Google App Engine for Java group.
 To post to this group, send email to
 google-appengine-j...@googlegroups.com.
 To unsubscribe from this group, send email to
 google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.



-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



[appengine-java] Re: Why should app startup times be a problem.

2010-03-31 Thread Sarath
Here is some more insight. http://bit.ly/d2lOnv

Looks like I was way off on numbers for Grails. Like I said, We should
think less about work arounds, and frameworks-on-diet (not that they
dont work) and rather look at an out of box solution.

-Sarath.


On Mar 31, 2:29 am, Sarath sarath...@yahoo.com wrote:
 This is getting really interesting. I have been follwoing this post
 from a couple of days.

 I managed to see What exactly is ammounting to delayed startup.

 Some have suggested to remove spring/di/jpa/jdo. While this is true,
 it solves much of the problem - These are the reason why I would
 choose java over python.

 I may be wrong here - But I tried this experiment.

 I had four versions of a simple java app.

 one with grails
 one with spring (full di - context: scan etc)
 one with spring (lazyloading, )
 one with slim1.0
 one with NOTHING (only commons logging)

 I realised there are two parts to the load time.

 The load time from google.
 The load time from the libraries.

 I believe from a developers perspective the second one should NOT be
 considered for optimization.

 For #1 a recommendation is warm startup. While in theory it might
 sound good, the elasticity and managment will take it back to EC2 type
 like baz suggests.

 For my experiment the results are like this

 Version                                                                 - 
 Google Warmup - Framework Warmup
 with grails                                                                   
   -       ~9+ secs        -       ~4secs
 with spring (full di - context: scan etc)                               -     
   ~4+ secs        -       ~3 secs
 with spring (lazyloading, )                                             -     
   ~4 secs -       ~2 secs
 with slim1.0                                                            -     
   ~2-3 secs       -       1 secs
 with NOTHING (only commons logging)                     -       ~2 secs -     
   1 sec

 Now I dont know what exactly Google spins down - I assume just the
 apps - not the whole container. In which case, There is a lot of load
 while loading the libraries. I can only guess, (corrections expected
 from technical team at google) most of the time take should be during
 the class loading. Grails/Spring have a bunch of libraries that are
 almost 1 mb some times.

 An assumable solution would be to preload / share these libraries in
 the parent classloader and  have some kind of manifest either in app-
 web.xml or manifest.mf  to use them.  It may not be a fully loaded
 osgi type of a stack but a noval hierachied classloading with ways to
 selectively load libraries. Otherwise there be some other classloading
 mechanism that is fast. like probably from memcache.

 Google tech team - to comment/

 I will try to upload some actual numbers from my logs and post the
 information.

 -Sarath

 On Mar 31, 1:54 am, Ikai L (Google) ika...@google.com wrote:

  David, that post mirrors many of the points made here:

 http://www.answercow.com/2010/03/google-app-engine-cold-start-guide-f...

  There's one or two more tips on that page.

  On Tue, Mar 30, 2010 at 12:47 PM, David Chandler 
  turboman...@gmail.comwrote:

   In the mean time, here are some ideas for reducing startup times by
   shrinking our apps. I went from 8.1s to 2.5s mainly by eliminating
   Guice, and I would expect similar results with Spring. I can
   definitely live with 2.5s...

  http://turbomanage.wordpress.com/2010/03/26/appengine-cold-starts-con...

   /dmc

   On Mar 30, 3:04 pm, Baz b...@thinkloop.com wrote:
Great information, Ikai.

I really feel that instances should be completely avoided in concept
   and
language on the GAE. What if the feature was simply an enable/disable
   deal
called Warm Scale. If it were enabled, then your *next* instance would
always be warm, regardless of how many instances you already had. This
   would
be most noticeable and suitable for low QPS production apps that are
constantly going from 0 to 1 instances (as you mentioned), but it could
still be important for others, say, for a super-high-profile site, or a
situation where your QPS is right at the threshold of instances and
oscillating back and forth between two instances. Whatever the 
situation,
   if
the solution were generalized like that, and most importantly not tied 
to
   a
SPECIFIC NUMBER of instances, it would be up to the user to decide how
important it was for them and whether to enable it.

Cheers,
Baz

   --
   You received this message because you are subscribed to the Google Groups
   Google App Engine for Java group.
   To post to this group, send email to
   google-appengine-j...@googlegroups.com.
   To unsubscribe from this group, send email to
   google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
   .
   For more options, visit this group at
  

[appengine-java] Re: Why should app startup times be a problem.

2010-03-31 Thread Sarath
Blake,

The versions I have are primarily bare. And only used to measure bare
minimum *cold start up time*. The benchmark is ONLY for startup-time
measurement. And to show that the more (and heavy) libraries you add,
The more is the cold startup time. And THAT could be delt with other
technical solutions than to keep instances warm. That way all
container resources will be consumed sooner or later. Hence the very
few Java/Jee hosting providers.

I understand some code optimization need to be done on the application
to get better performance. No disagreement on that.My post only goes
to counter the aspect of keeping *warm instances*. As pointed out by
others, it  just is against the concept of *cloud*.

-Sarath.

On Mar 31, 8:05 pm, Blake blakecaldw...@gmail.com wrote:
 Cool post Sarath, thanks for sharing.

 I'm also scrambling to get better performance, but I'm getting nowhere
 near as high CPU times as you are.  What types of queries are you
 doing?  I've restructured my app so that all of my queries are by
 keys.  I've denormalized, serialized child objects into parents when I
 didn't need to query the children.

 I'm not going to assume I know what your app's doing, and starting
 handing out advice on ignorance, but we all need to accept that this
 isn't a traditional relational data store.  We need to do more with
 our write operations in preparation for specific read operations.
 Trade-offs need to be made with every request.  Even with 100 views
 per day, our app is basically in a system that's getting pummeled, so
 we need to code as if we're getting 1million pageviews per day.

 There's all kinds of tricks you can do (again, assuming you're not
 doing them already).  If the CSS is dynamically generated, cache it
 and/or store it as a text field in a table.  Use AJAX to give the
 perception of a quick-loading app by putting as much into the html
 files as you can, with spinners on the client as the data is loaded
 asynchronously.

 That extra work will even save you money once you get above the free
 quota.

 What are you doing in those requests that can't be cleaned up for
 better App Engine performance?

 - a side note to this thread, not necessarily Sarath -
 I agree with everyone on what would be nice.  I'd love to make a
 fully relational database that handles ad hoc queries and no awareness
 of the underlying framework, but the system is what it is, so let's
 embrace it and squeeze every cpu clock cycle and millisecond of wait
 time out of it.  If we can't do that, then why don't we just move to
 LAMP hosts for $10/month?

 On Mar 31, 10:19 am, Sarath sarath...@yahoo.com wrote:

  Here is some more insight.http://bit.ly/d2lOnv

  Looks like I was way off on numbers for Grails. Like I said, We should
  think less about work arounds, and frameworks-on-diet (not that they
  dont work) and rather look at an out of box solution.

  -Sarath.

  On Mar 31, 2:29 am, Sarath sarath...@yahoo.com wrote:

   This is getting really interesting. I have been follwoing this post
   from a couple of days.

   I managed to see What exactly is ammounting to delayed startup.

   Some have suggested to remove spring/di/jpa/jdo. While this is true,
   it solves much of the problem - These are the reason why I would
   choose java over python.

   I may be wrong here - But I tried this experiment.

   I had four versions of a simple java app.

   one with grails
   one with spring (full di - context: scan etc)
   one with spring (lazyloading, )
   one with slim1.0
   one with NOTHING (only commons logging)

   I realised there are two parts to the load time.

   The load time from google.
   The load time from the libraries.

   I believe from a developers perspective the second one should NOT be
   considered for optimization.

   For #1 a recommendation is warm startup. While in theory it might
   sound good, the elasticity and managment will take it back to EC2 type
   like baz suggests.

   For my experiment the results are like this

   Version                                                                 - 
   Google Warmup - Framework Warmup
   with grails                                                               
         -       ~9+ secs        -       ~4secs
   with spring (full di - context: scan etc)                               - 
         ~4+ secs        -       ~3 secs
   with spring (lazyloading, )                                             - 
         ~4 secs -       ~2 secs
   with slim1.0                                                            - 
         ~2-3 secs       -       1 secs
   with NOTHING (only commons logging)                     -       ~2 secs - 
         1 sec

   Now I dont know what exactly Google spins down - I assume just the
   apps - not the whole container. In which case, There is a lot of load
   while loading the libraries. I can only guess, (corrections expected
   from technical team at google) most of the time take should be during
   the class loading. 

Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-31 Thread Jeff Schnitzer
On Wed, Mar 31, 2010 at 6:36 AM, John Patterson jdpatter...@gmail.com wrote:

  Unlike some of the other frameworks there is no registration process for
 your data model classes - each class is analyzed the first time it is used
 per server instance and the meta-data is cached for the duration of the
 instance.

What does Twig do when someone issues a type-less query?

datastore.find().addFilter(color, EQUAL, green). returnResultsNow()

Jeff

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-31 Thread Jeff Schnitzer
On Wed, Mar 31, 2010 at 6:41 PM, jd jdpatter...@gmail.com wrote:

 On Apr 1, 3:14 am, Jeff Schnitzer j...@infohazard.org wrote:
 What does Twig do when someone issues a type-less query?

 datastore.find().addFilter(color, EQUAL, green). returnResultsNow()

 The expression above is actually not possible to enter using the
 fluent commands.  You can only set a filter on the interface that is
 returned from calling FindCommand.type(Class?)

 It is also illegal according to the datastore docs for a Query with no
 kind:

 Currently the only operations supported on a kind-less query are
 filter by __key__, ancestor, and order by __key__ ascending

In other words, Twig cannot perform the simple query:

IterableObject foo = ofy.query().ancestor(yourobject);

If you ever want to support something like this, you will need a
registration process.

If you ever want to support true polymorphic queries, you will need a
registration process.

Don't claim this short-sightedness as a feature.

Jeff

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-30 Thread Guillermo Schwarz
Well, both Baz and Shawn are correct.

Shawn is correct from the economical point of view. Baz is correct from the
techinical point of view (no sane user would wait 15 seconds for a page to
appear, right?).

The great thing is that both can be done at the same time. Warmed instances
can be brought up in the background without the user knowing about it.

Cheers,
Guillermo.

On Mon, Mar 29, 2010 at 9:01 PM, Shawn Brown big.coffee.lo...@gmail.comwrote:

It's boggled my mind from day 1 why instances
  aren't loaded in the background. I always assumed it would be addressed

 What is difficult to understand?

 1 server has X resources
 warmed instanced require Y resources

 X - YN = resources left over for the server to fulfill requests.

 By reducing N (the number of warmed instances), you can increase the
 capacity to fulfill actual requests.

 By allowing us to pay for our own N, Google can presumably increase
 the capacity of each server or can increase the number of servers.

 I can see how it can cost Google to have unused apps loaded and ready
 to immediately serve.  Can't you.

 I don't see what the difficulty understanding is.

 Shawn

 --
 You received this message because you are subscribed to the Google Groups
 Google App Engine for Java group.
 To post to this group, send email to
 google-appengine-j...@googlegroups.com.
 To unsubscribe from this group, send email to
 google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.




-- 
Saludos cordiales,

Guillermo Schwarz
Sun Certified Enterprise Architect

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-30 Thread Baz
Shawn,

By the same token google could cut all their hardware in half and double
page loads, check out this formula:

NumberOfRequests / HardwareQuality = PageLoad

Therefore, Google should power the entire GAE infrastructure with a netbook
- yes each page would take 2.5 decades to load, but imagine the cost
savings!

The main point of my post is the model, not the money. I am more than
willing to pay for AppEngine as I love it and think it's the future. The
issue is that I don't want to pay and manage instances because in my
opinion that goes against the model. I would prefer to pay a higher rate (or
the equivalent money some other way) without the knowledge of instances.

With all that said, and re-reading some other posts, I may actually be wrong
here... To be sure, if I pay for a warmed instance and, say, my site
gradually becomes more and more popular and gradually goes from 1 instance
to 11 - have I received the benefit of a warmed instance at every step of
the way? Is my twelfth instance now the warm one?

Cheers,
Baz

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-30 Thread Ikai L (Google)
We're still working through the details of reserved instances. The
constructive feedback on this thread is useful; it is theoretically possible
to pay for an unused instance that requests spill into when they go over
capacity of the current spun up requests. That is - pay for one more
instance than you need to avoid a loading request - for many people, they
would go from 0-1, and for some folks, they would go from 1-2, and so
forth.

Even if this isn't the case when we first launch the feature (remember that
we are always iterating to improve App Engine), the issue with many of our
developers looking for this feature is that they are relatively low QPS
applications that experience loading requests on every single request. As a
result, a high percentage of their requests take several seconds, and these
are the developers we intend on serving with this feature. At the QPS tier
where you spin up additional instances to handle load, it is a much lower %
- an almost negligible % of requests that take several seconds. While this
is far from ideal, we've heard very little feedback from our developers
running high QPS (100s - 1000s QPS) applications about this. I suspect it
simply has to do with what users have expected with regards to latency
spikes with the internet in general and just pass it off. Heck, I refresh
pages several times at home sometimes, but that's because my DSL connection
is terrible ... and probably also related to the fact that my WiFi router is
next to a microwave. I'm not defending it, as in our perfect scenario all
requests are served in sub 200ms. Businesses may or may not be willing to
pay the cost to deal with these requests.

If any of you are running high QPS applications, have these additional
loading requests affected your business? If these requests have caused
measurable loss of revenue or usage, then you'd have to weigh this as well
as its opportunity cost against the (still undecided) cost of keeping
serving  instances ready.

On Tue, Mar 30, 2010 at 7:57 AM, Baz b...@thinkloop.com wrote:

 Shawn,

 By the same token google could cut all their hardware in half and double
 page loads, check out this formula:

 NumberOfRequests / HardwareQuality = PageLoad

 Therefore, Google should power the entire GAE infrastructure with a netbook
 - yes each page would take 2.5 decades to load, but imagine the cost
 savings!

 The main point of my post is the model, not the money. I am more than
 willing to pay for AppEngine as I love it and think it's the future. The
 issue is that I don't want to pay and manage instances because in my
 opinion that goes against the model. I would prefer to pay a higher rate (or
 the equivalent money some other way) without the knowledge of instances.

 With all that said, and re-reading some other posts, I may actually be
 wrong here... To be sure, if I pay for a warmed instance and, say, my site
 gradually becomes more and more popular and gradually goes from 1 instance
 to 11 - have I received the benefit of a warmed instance at every step of
 the way? Is my twelfth instance now the warm one?

 Cheers,
 Baz

  --
 You received this message because you are subscribed to the Google Groups
 Google App Engine for Java group.
 To post to this group, send email to
 google-appengine-j...@googlegroups.com.
 To unsubscribe from this group, send email to
 google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.




-- 
Ikai Lan
Developer Programs Engineer, Google App Engine
http://googleappengine.blogspot.com | http://twitter.com/app_engine

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-30 Thread Baz
Great information, Ikai.

I really feel that instances should be completely avoided in concept and
language on the GAE. What if the feature was simply an enable/disable deal
called Warm Scale. If it were enabled, then your *next* instance would
always be warm, regardless of how many instances you already had. This would
be most noticeable and suitable for low QPS production apps that are
constantly going from 0 to 1 instances (as you mentioned), but it could
still be important for others, say, for a super-high-profile site, or a
situation where your QPS is right at the threshold of instances and
oscillating back and forth between two instances. Whatever the situation, if
the solution were generalized like that, and most importantly not tied to a
SPECIFIC NUMBER of instances, it would be up to the user to decide how
important it was for them and whether to enable it.

Cheers,
Baz

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



[appengine-java] Re: Why should app startup times be a problem.

2010-03-30 Thread David Chandler
In the mean time, here are some ideas for reducing startup times by
shrinking our apps. I went from 8.1s to 2.5s mainly by eliminating
Guice, and I would expect similar results with Spring. I can
definitely live with 2.5s...

http://turbomanage.wordpress.com/2010/03/26/appengine-cold-starts-considered/

/dmc

On Mar 30, 3:04 pm, Baz b...@thinkloop.com wrote:
 Great information, Ikai.

 I really feel that instances should be completely avoided in concept and
 language on the GAE. What if the feature was simply an enable/disable deal
 called Warm Scale. If it were enabled, then your *next* instance would
 always be warm, regardless of how many instances you already had. This would
 be most noticeable and suitable for low QPS production apps that are
 constantly going from 0 to 1 instances (as you mentioned), but it could
 still be important for others, say, for a super-high-profile site, or a
 situation where your QPS is right at the threshold of instances and
 oscillating back and forth between two instances. Whatever the situation, if
 the solution were generalized like that, and most importantly not tied to a
 SPECIFIC NUMBER of instances, it would be up to the user to decide how
 important it was for them and whether to enable it.

 Cheers,
 Baz

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-30 Thread Ikai L (Google)
David, that post mirrors many of the points made here:

http://www.answercow.com/2010/03/google-app-engine-cold-start-guide-for.html

There's one or two more tips on that page.

On Tue, Mar 30, 2010 at 12:47 PM, David Chandler turboman...@gmail.comwrote:

 In the mean time, here are some ideas for reducing startup times by
 shrinking our apps. I went from 8.1s to 2.5s mainly by eliminating
 Guice, and I would expect similar results with Spring. I can
 definitely live with 2.5s...


 http://turbomanage.wordpress.com/2010/03/26/appengine-cold-starts-considered/

 /dmc

 On Mar 30, 3:04 pm, Baz b...@thinkloop.com wrote:
  Great information, Ikai.
 
  I really feel that instances should be completely avoided in concept
 and
  language on the GAE. What if the feature was simply an enable/disable
 deal
  called Warm Scale. If it were enabled, then your *next* instance would
  always be warm, regardless of how many instances you already had. This
 would
  be most noticeable and suitable for low QPS production apps that are
  constantly going from 0 to 1 instances (as you mentioned), but it could
  still be important for others, say, for a super-high-profile site, or a
  situation where your QPS is right at the threshold of instances and
  oscillating back and forth between two instances. Whatever the situation,
 if
  the solution were generalized like that, and most importantly not tied to
 a
  SPECIFIC NUMBER of instances, it would be up to the user to decide how
  important it was for them and whether to enable it.
 
  Cheers,
  Baz

 --
 You received this message because you are subscribed to the Google Groups
 Google App Engine for Java group.
 To post to this group, send email to
 google-appengine-j...@googlegroups.com.
 To unsubscribe from this group, send email to
 google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.




-- 
Ikai Lan
Developer Programs Engineer, Google App Engine
http://googleappengine.blogspot.com | http://twitter.com/app_engine

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



[appengine-java] Re: Why should app startup times be a problem.

2010-03-30 Thread Sarath
This is getting really interesting. I have been follwoing this post
from a couple of days.

I managed to see What exactly is ammounting to delayed startup.

Some have suggested to remove spring/di/jpa/jdo. While this is true,
it solves much of the problem - These are the reason why I would
choose java over python.

I may be wrong here - But I tried this experiment.

I had four versions of a simple java app.

one with grails
one with spring (full di - context: scan etc)
one with spring (lazyloading, )
one with slim1.0
one with NOTHING (only commons logging)

I realised there are two parts to the load time.

The load time from google.
The load time from the libraries.

I believe from a developers perspective the second one should NOT be
considered for optimization.

For #1 a recommendation is warm startup. While in theory it might
sound good, the elasticity and managment will take it back to EC2 type
like baz suggests.

For my experiment the results are like this

Version - 
Google Warmup - Framework Warmup
with grails 
-   ~9+ secs-   ~4secs
with spring (full di - context: scan etc)   -   
~4+ secs-   ~3 secs
with spring (lazyloading, ) -   
~4 secs -   ~2 secs
with slim1.0-   
~2-3 secs   -   1 secs
with NOTHING (only commons logging) -   ~2 secs -   
1 sec

Now I dont know what exactly Google spins down - I assume just the
apps - not the whole container. In which case, There is a lot of load
while loading the libraries. I can only guess, (corrections expected
from technical team at google) most of the time take should be during
the class loading. Grails/Spring have a bunch of libraries that are
almost 1 mb some times.

An assumable solution would be to preload / share these libraries in
the parent classloader and  have some kind of manifest either in app-
web.xml or manifest.mf  to use them.  It may not be a fully loaded
osgi type of a stack but a noval hierachied classloading with ways to
selectively load libraries. Otherwise there be some other classloading
mechanism that is fast. like probably from memcache.

Google tech team - to comment/

I will try to upload some actual numbers from my logs and post the
information.

-Sarath


On Mar 31, 1:54 am, Ikai L (Google) ika...@google.com wrote:
 David, that post mirrors many of the points made here:

 http://www.answercow.com/2010/03/google-app-engine-cold-start-guide-f...

 There's one or two more tips on that page.

 On Tue, Mar 30, 2010 at 12:47 PM, David Chandler turboman...@gmail.comwrote:



  In the mean time, here are some ideas for reducing startup times by
  shrinking our apps. I went from 8.1s to 2.5s mainly by eliminating
  Guice, and I would expect similar results with Spring. I can
  definitely live with 2.5s...

 http://turbomanage.wordpress.com/2010/03/26/appengine-cold-starts-con...

  /dmc

  On Mar 30, 3:04 pm, Baz b...@thinkloop.com wrote:
   Great information, Ikai.

   I really feel that instances should be completely avoided in concept
  and
   language on the GAE. What if the feature was simply an enable/disable
  deal
   called Warm Scale. If it were enabled, then your *next* instance would
   always be warm, regardless of how many instances you already had. This
  would
   be most noticeable and suitable for low QPS production apps that are
   constantly going from 0 to 1 instances (as you mentioned), but it could
   still be important for others, say, for a super-high-profile site, or a
   situation where your QPS is right at the threshold of instances and
   oscillating back and forth between two instances. Whatever the situation,
  if
   the solution were generalized like that, and most importantly not tied to
  a
   SPECIFIC NUMBER of instances, it would be up to the user to decide how
   important it was for them and whether to enable it.

   Cheers,
   Baz

  --
  You received this message because you are subscribed to the Google Groups
  Google App Engine for Java group.
  To post to this group, send email to
  google-appengine-j...@googlegroups.com.
  To unsubscribe from this group, send email to
  google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
  .
  For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.

 --
 Ikai Lan
 Developer Programs Engineer, Google App 
 Enginehttp://googleappengine.blogspot.com|http://twitter.com/app_engine

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 

Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-29 Thread Ikai L (Google)
Hah, Blake, guess you caught us! We might be doing more stuff with that in
addition to what went out with 1.3.2.

On Fri, Mar 26, 2010 at 6:50 PM, Blake blakecaldw...@gmail.com wrote:

 Ikai - that's awesome - great to see you guys listening to us.  Is
 that doc already outdated?  Didn't you just release this?

 Ability to select different availability vs. latency options for
 Datastore

 On Mar 26, 1:42 pm, Ikai L (Google) ika...@google.com wrote:
  Keeping reserved instances has been added to our public roadmap:
 
  http://code.google.com/appengine/docs/roadmap.html
 
  http://code.google.com/appengine/docs/roadmap.htmlAs far as spinning
 up
  additional instances, there are probably a few good solutions here. We'll
 be
  best off collecting feedback when we ship reserved instances on which
  solution works best.
 
 
 
 
 
  On Fri, Mar 26, 2010 at 10:38 AM, gholler georgehol...@gmail.com
 wrote:
   Thanks for your replies.  I think we would want an option to pay to
   keep at least one instance warm and ready to go at any time (I don't
   know what makes sense for a fee though).
   And as Guillermo says, that won't help us as new instances are needed
   to scale.  There could be a fee for paying accounts to get those
   special startup requests, and I also don't know what makes sense for a
   fee there. It would also need to be able to handle more than 30
   seconds, ideally it could be a task that keeps gettings called until
   it returns a 200-299 status. The url for the task could be specified
   in the appengine-web.xml.
 
   G
 
   --
   You received this message because you are subscribed to the Google
 Groups
   Google App Engine for Java group.
   To post to this group, send email to
   google-appengine-j...@googlegroups.com.
   To unsubscribe from this group, send email to
   google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.comgoogle-appengine-java%2B
 unsubscr...@googlegroups.com
   .
   For more options, visit this group at
  http://groups.google.com/group/google-appengine-java?hl=en.
 
  --
  Ikai Lan
  Developer Programs Engineer, Google App Enginehttp://
 googleappengine.blogspot.com|http://twitter.com/app_engine

 --
 You received this message because you are subscribed to the Google Groups
 Google App Engine for Java group.
 To post to this group, send email to
 google-appengine-j...@googlegroups.com.
 To unsubscribe from this group, send email to
 google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.




-- 
Ikai Lan
Developer Programs Engineer, Google App Engine
http://googleappengine.blogspot.com | http://twitter.com/app_engine

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-29 Thread Guillermo Schwarz
JohnJ,

The way I see it, you just need to pay for one warmed instance.

I've measured that one instance is enough to handle 30 requests per second.
Trying to execute more requests than that immediatly triggers the loading of
a new instance and so far some of the requests fail.

Therefore, If you are using 1 instance in real traffic (max 30 requests per
second), you only need another one when you reach 31 requests per second, so
that new instance in theory would all you need warmed (unless you think
you will jump from one instance to 3 instance from one second to the next).

Assuming all requests end before one second, and assuming the time to load
an instance to be kept warmed is a few seconds, you only need 1 warmed
instance added to the instances you are actually using (which should be
number of requests per second / 30).

Did I make myself clear?

Cheers,
Guillermo.

On Mon, Mar 29, 2010 at 1:58 PM, Ikai L (Google) ika...@google.com wrote:

 Hah, Blake, guess you caught us! We might be doing more stuff with that in
 addition to what went out with 1.3.2.


 On Fri, Mar 26, 2010 at 6:50 PM, Blake blakecaldw...@gmail.com wrote:

 Ikai - that's awesome - great to see you guys listening to us.  Is
 that doc already outdated?  Didn't you just release this?

 Ability to select different availability vs. latency options for
 Datastore

 On Mar 26, 1:42 pm, Ikai L (Google) ika...@google.com wrote:
  Keeping reserved instances has been added to our public roadmap:
 
  http://code.google.com/appengine/docs/roadmap.html
 
  http://code.google.com/appengine/docs/roadmap.htmlAs far as spinning
 up
  additional instances, there are probably a few good solutions here.
 We'll be
  best off collecting feedback when we ship reserved instances on which
  solution works best.
 
 
 
 
 
  On Fri, Mar 26, 2010 at 10:38 AM, gholler georgehol...@gmail.com
 wrote:
   Thanks for your replies.  I think we would want an option to pay to
   keep at least one instance warm and ready to go at any time (I don't
   know what makes sense for a fee though).
   And as Guillermo says, that won't help us as new instances are needed
   to scale.  There could be a fee for paying accounts to get those
   special startup requests, and I also don't know what makes sense for a
   fee there. It would also need to be able to handle more than 30
   seconds, ideally it could be a task that keeps gettings called until
   it returns a 200-299 status. The url for the task could be specified
   in the appengine-web.xml.
 
   G
 
   --
   You received this message because you are subscribed to the Google
 Groups
   Google App Engine for Java group.
   To post to this group, send email to
   google-appengine-j...@googlegroups.com.
   To unsubscribe from this group, send email to
   google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.comgoogle-appengine-java%2B
 unsubscr...@googlegroups.com
   .
   For more options, visit this group at
  http://groups.google.com/group/google-appengine-java?hl=en.
 
  --
  Ikai Lan
  Developer Programs Engineer, Google App Enginehttp://
 googleappengine.blogspot.com|http://twitter.com/app_engine

 --
 You received this message because you are subscribed to the Google Groups
 Google App Engine for Java group.
 To post to this group, send email to
 google-appengine-j...@googlegroups.com.
 To unsubscribe from this group, send email to
 google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.




 --
 Ikai Lan
 Developer Programs Engineer, Google App Engine
 http://googleappengine.blogspot.com | http://twitter.com/app_engine

 --
 You received this message because you are subscribed to the Google Groups
 Google App Engine for Java group.
 To post to this group, send email to
 google-appengine-j...@googlegroups.com.
 To unsubscribe from this group, send email to
 google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
 .
 For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.




-- 
Saludos cordiales,

Guillermo Schwarz
Sun Certified Enterprise Architect

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-29 Thread Baz
Warmed instances make absolutely no sense on the GAE! It's supposed to be an
invisible, infinite, platform without the notion of ram, cpu's, drives or
instances - it goes completely against the heart and soul of the project.
That just makes us an Amazon. It's boggled my mind from day 1 why instances
aren't loaded in the background. I always assumed it would be addressed
shortly - but instead we've decided to completely break the model. Why? I
hate to over-simply, but it really doesn't seem like it's that difficult to
make sure requests only go to ready/warm servers. I bet you could even solve
99% of the cases by simply waiting 3 minutes before serving a request.

Of course, I still love the GAE :)

Baz

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.



Re: [appengine-java] Re: Why should app startup times be a problem.

2010-03-29 Thread Shawn Brown
   It's boggled my mind from day 1 why instances
 aren't loaded in the background. I always assumed it would be addressed

What is difficult to understand?

1 server has X resources
warmed instanced require Y resources

X - YN = resources left over for the server to fulfill requests.

By reducing N (the number of warmed instances), you can increase the
capacity to fulfill actual requests.

By allowing us to pay for our own N, Google can presumably increase
the capacity of each server or can increase the number of servers.

I can see how it can cost Google to have unused apps loaded and ready
to immediately serve.  Can't you.

I don't see what the difficulty understanding is.

Shawn

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.