I don't think the original poster had a requirement for synchronous
writes; he just didn't want to do the writes asynchronously because it
involved a lot more code.

I'm also perfectly fine with asynchronous writes and a very lax
interpretation of consistency.  I don't even mind writing extra code.
The thing I worry about is the feasibility of a heavy write load and
the total cost of it.

Unfortunately I really can't describe in detail what I want to do (I
normally laugh at this kind of secrecy, but in this case it's
warranted).  For the game mechanic I'm thinking about, the
average-case scenario is not very far from the worst-case scenario.
Just a little detail:

 * There is no requirement that all of a user's friends must be
playing the game or even have installed the app to receive points.
Welcome to the world of social gaming, you can play without even
without knowing it!
 * There are *lots* of FB users that have > 1k friends.  Probably
millions.  More active FB users are likely to have more friends... and
more likely to use my app.
 * Points can be assigned to multiple layers, so the # of updates is
(layers * friends).
 * Tens of thousands of people play this "game". It could become
hundreds of thousands very soon.  If I'm lucky, millions.

I would love to implement this game mechanic, but I just can't.
Asynchronous or not, it's *way* too expensive on appengine.  When it
comes time to implement this feature (and it's going to come, I can
see the winds blowing), I'm probably going to have to move my scoring
system out of appengine.  Which is a bit ironic, because one of the
main advantages of appengine is scalability.

I would *love* to see some sort of super-super-lax and
super-super-cheap consistency option for BigTable.  Or even an
alternative key/value datastore that simply works like a persistent
version of memcached.  Something that would let me sustain 10k
writes/sec without bankrupting me.

Jeff

On Thu, Feb 25, 2010 at 11:16 AM, Ikai L (Google) <ika...@google.com> wrote:
> Jeff, point taken, but the original poster has been asking for three
> different requirements:
> - requirement to do all writes synchronously
> - sub-some-couple-hundred-millisecond writes
> - 12k entities being written
>
> This just won't scale well if it's common. Messaging users can be done
> asynchronously, as can the portion crediting friends. I understand the
> argument that you may want to do this during the lifecycle of the request so
> the original user gets some kind of feedback backed by a strongly consistent
> datastore, but this just isn't done. Feedback is usually faked out
> optimistically, assuming that the writes will all be successful with some
> cached layer being the only part of the stack being updated inside the
> request. Thinking of worse case scenarios is a good thought exercise, but
> it's also a bit too optimistic to design a product assuming all of a Users'
> friends will play the game and engineer to meet that unrealistic
> expectation. What are the standard and slightly non-standard use cases? I'd
> probably look at a solution where I can store the data somewhere associated
> with the original user for any users not already in the datastore, then
> retrieve and generate a score for any of that User's friends on first
> access. Facebook's developer admin tool has some pretty good statistics such
> as bounce rate, block rate and invitation accept rate that can be used to
> tune this design.
> Slightly off topic, but we've been asked before if it was possible to
> provide different levels of datastore consistency. In some cases I can see
> the tradeoffs making sense.
>
> On Wed, Feb 24, 2010 at 5:52 PM, Jeff Schnitzer <j...@infohazard.org> wrote:
>>
>> On Wed, Feb 24, 2010 at 1:06 PM, Ikai L (Google) <ika...@google.com>
>> wrote:
>> > My point wasn't necessarily that it wasn't possible. makePersistentAll
>> > does
>> > use a batch write, and there are definitely sites that can do 12,000+
>> > writes
>> > a second (and well above that), but I don't know of any that will
>> > attempt to
>> > do that in a single request. While it's an interesting thought exercise
>> > to
>> > see if BigTable can do it through App Engine's interface (hint: it can,
>> > globally, easily), I can't think of a single use case for a site to need
>> > to
>> > do this all the time and with the sub-second requirement. I think it's
>> > reasonable to ask why this design exists and why the requirements exist
>> > and
>> > rethink one or the other.
>>
>> It does seem to be a pretty extreme case, but it's not all that far
>> fetched.  It's possible for a Facebook user to have 5,000 friends.
>> Perhaps a user wants to message all 5k of them.
>>
>> I could actually use this right ability now.  I would like to add a
>> game mechanic which, when you score some points, you also credit a
>> portion of that to all of a user's friends.  Worst case scenario is a
>> 5,000 element read followed by a 5,000 element write.  I'm probably
>> going to skip this mechanic for now because I can't afford it - even
>> with the average 200 or so friends.  If I want it badly enough, I may
>> ultimately need to move my scoring system offsite.
>>
>> 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.
>>
>
>
>
> --
> 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.
>

-- 
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.

Reply via email to