On Nov 10, 11:28 am, Eli Jones <eli.jo...@gmail.com> wrote:

> How big is the average entity for this Model that you are putting to? (Are
> you just putting one entity at a time?)

The data will vary based on user input. For the model in question, the
size is generally 3k or less. However, we have a large number of
custom indices to support user searches on multiple combinations of
properties. Pretty sure the index updates are the real resource cost
for the new record put().

>
> If you create a separate Model with the same properties but no indexes, how
> long and how much CPU does it use up on a put (in comparison to your fully
> indexed model)?  Also, what do you mean by "puts run too close to the 1,000
> ms limit"?  Do you just mean that your app uses up 1,000 CPU MS or 1,000
> API_CPU MS?

If I look at the appstats detail for my POST function the api-cost
cost for the most recent put is approximately 585 ms. There are some
other DB accesses in the full function call, so I segmented out this
data. This 585 ms is the bulk of the total api-cpu cost for the full
function. I am sorry, but right now I do not have anything set up to
test a write a similar model entity without any indices.

To be honest, I am not sure what the "throttling due to 1,000 cpu ms
response" really means relative to CPU or API_CPU ms, whether it
involves any smoothing across multiple handler functions.

Just looking at the 585 ms api put() resource indicates we would
likely have throttling issues should the infrastructure slow down due
to overall load. So, we're moving the put()s to the task queue. This
is in accordance to what I believe Google engineers' comments to this
forum about the 1,000 ms throttling affect (some posts perhaps
suggesting 800 ms is a more practical limit vs. the 1,000 ms
"theoretical limit" -- the latter being my term).

The TQ approach also allows us to break up some of the overhead in the
current single function. Overall, we'll be much better off re:
throttling risk, and task separations, but it does impose the overhead
of not being able to respond to the client that the everything related
to the function was complete in response to a client's single POST
request.

>
> Why are you generating a custom integer id instead of using the one that the
> datastore would create (I am not saying you should not do this, but I am
> wondering what the requirement is that makes you need to do it.)?

In retrospect, using our own generated integer key value may not have
been needed when the put() is done by the handler function called by
the client POST call. However, as we look to use the task queue for
executing the post, it will prove beneficial because it allows us to
quickly stage the task queue update, and provide information to the
client about what key value to request when it seeks to confirm the
task queue function using GETs subsequent to the initial POST.

>
> Also, you mention that you are not very write intensive and new records
> occur infrequently.. so what is the main reasoning for this complicated put
> process (does the processing leading up to the put place you near the 30
> second limit)?

The current process is pretty simple. If we did not face the issue
with our handler being throttled because we have a transaction or two
going through over 1,000 ms, then I'd leave it as is.

However (again according to my reading of their comments) Google's
engineers advocate moving logic that can take over 1,000 ms to the
task queue. I'm ok with that quite honestly.

As I think through the TQ step we will need to use, I am not sure how
a client can with a single POST to the on-line handler can be assured
that the new record TQ put() is completed. So that leads me to the
complicated process of the initial client POST being followed by a GET
to ensure completion.

If I am missing something, and the client can simply send the POST
data to the Task Queue and assume 100% of the TQ tasks sent will be
completed, then please advise. Just having the client send the current
single POST call is so much easier.

We are no where near 30 seconds for anything, even with a cold start.
No client URL calls currently take more that few seconds when combined
with a cold start. Prior to the Nov 6th update, all the new record
puts for this model were between 1-2 seconds, but are now coming in
lower than 1 sec.

Again, this is all to avoid being throttled due to a the new record
put()s should: 1) current gains from Nov 6th maintenance not hold, or
2) variability in infrastructure load even with the Nov 6th gains push
our 585 ms api-cpu over 1,000. (Getting throttled when the
infrastructure overall is running slow is a double whammy for which
users might not wait!)

>
> Depending on what your restrictions are.. there are different
> recommendations that can/could be made.

I'll happily try to clarify the restrictions, but am not sure what is
being asked here.

Again, many thanks for your help.
stevep

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

Reply via email to