<div class="gmail_quote">On Tue, Jul 20, 2010 at 3:02 PM, Justin Sheehy <span dir="ltr"><<a href="mailto:justin@basho.com">justin@basho.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi, Eric!  Thanks for your thoughts.<br>
<div class="im"><br>
On Tue, Jul 20, 2010 at 12:39 PM, Eric Filson <<a href="mailto:efilson@gmail.com">efilson@gmail.com</a>> wrote:<br>
<br>
> I would think that this requirement,<br>
> retrieving all objects in a bucket, to be a _very_ common<br>
> place occurrence for modern web development and perhaps (depending on<br>
> requirements) _the_ most common function aside from retrieving a single k/v<br>
> pair.<br>
<br>
</div>I tend to see people that mostly try to write applications that don't<br>
select everything from a whole bucket/table/whatever as a very<br>
frequent occurrence, but different people have different requirements.<br>
 Certainly, it is sometimes unavoidable.<br></blockquote><div><br></div><div>Indeed, in my case it is :(</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im"><br>
> In my mind, this seems to leave the only advantage to buckets in this<br>
> application to be namespacing... While certainly important, I'm fuzzy on<br>
> what the downside would be to allowing buckets to exist as a separate<br>
> partition/pseudo-table/etc... so that retrieving all objects in a bucket<br>
> would not need to read all objects in the entire system<br>
<br>
</div>The namespacing aspect is a huge advantage for many people.  Besides<br>
the obvious way in which that allows people to avoid collisions, it is<br>
a powerful tool for data modeling.  For example, sets of 1-to-1<br>
relationships can be very nicely represented as something like<br>
"bucket1/keyA, bucket2/keyA, bucket3/keyA", which allows related items<br>
to be fetched without any intermediate queries at all.<br></blockquote><div><br></div><div>I agree however, the same thing can be accomplished by prefixing your keys with a "namespace"...</div><div><br></div><div>
bucket_1_keyA, bucket_2_keyA, bucket_3_keyA</div><div><br></div><div>Obviously, buckets in Riak have additional functionality and allow for some more complex but easier to use m/r functions across multiple buckets, etc... </div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
One of the things that many users have become happily used to is that<br>
buckets in Riak are generally "free"; they come into existence on<br>
demand, and you can use as many of them as you want in the above or<br>
any other fashion.  This is in essence what conflicts with your<br>
desire.  Making buckets more fundamentally isolated from each other<br>
would be difficult without incurring some incremental cost per bucket.<br></blockquote><div><br></div><div>For me, I am more than willing to add a small amount of overhead to the storage engine for increased functionality and reduced overhead on the application layer.  Again this is obviously application specific and I'm not saying it should all be converted over for all buckets exiting in their own space for every implementation but certainly a different storage engine or configuration option to allow this level/type of access would be nice :)</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">> I might recommend a hybrid<br>
> solution (based in my limited knowledge of Riak)... What about allowing a<br>
> bucket property named something like "key_index" that points to a key<br>
> containing a value of "keys in bucket".  Then, when calling GET<br>
> /riak/bucket, Riak would use the key_index to immediately reduce its result<br>
> set before applying m/r funcs.  While I understand this is essentially what<br>
> a developer would do, it would certainly alleviate some code requirements<br>
> (application side) as well as make the behavior of retrieving a bucket's<br>
> contents more "expected" and efficient.<br>
<br>
</div>A much earlier incarnation of Riak actually stored bucket keylists<br>
explicitly in a fashion somewhat like what you describe.  We removed<br>
this as one of our biggest goals is predictable and understandable<br>
behavior in a distributed systems sense, and a model like this one<br>
turns each write operation into at least two operations.  This isn't<br>
just a performance issue, but also adds complexity.  For instance, it<br>
is not immediately obvious what should be returned to the client if a<br>
data item write succeeds, but the read/write of the index fails?<br></blockquote><div><br></div><div><div>Haha, these are the exact reasons I would cite as a developer for using a similar method on Riak's side... without the option of auto bucket indexing it effectively places this double write into the application side where it requires more cycles and more data across the wire.  Instead of doing a single write, from the application side, and allowing Riak to handle this, you have to GET index_key, UPDATE index_key, ADD new_key... So rather than having a single transaction with Riak, you have to have three transactions with Riak + Application functionality.  Inherently, this adds another level of complexity into the application code base for something that could be done more efficiently by the DB engine itself.</div>
<div><br></div><div>I would think a separate error number and message would suffice as a return error, obviously though, this would require developers being made aware so they can code for the exception.</div><div><br></div>
<div>Also, this would be optional, if the index_key wasn't set for the bucket then this setup wouldn't be used.  This would at least make the system more flexible to the application requirements and developer preferences.</div>
</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Most people using distributed data systems (including but not limited<br>
to Riak) do explicit data modeling, using things like key identity as<br>
above, or objects that contain links to each other (Riak has great<br>
support for this) or other data modeling means to plan out their<br>
expected queries in advance.<br>
<div class="im"><br>
> Anyway, information is pretty limited on riak right now, seeing as how it's<br>
> so new, but talk in my development circles is very positive and lively.<br>
<br>
</div>Please do let us know any aspects of information on Riak that you<br>
think are missing.  We think that between the wiki, the web site, and<br>
various other materials, the information is pretty good.  Riak's been<br>
open source for about a year, and in use longer than that; while there<br>
are many things much older than Riak, we don't see relative youth as a<br>
reason not to do things right.<br>
<br>
Thanks again for your thoughts, and I hope that this helps with your<br>
understanding.</blockquote><div><br></div><div>Some very valuable information, for me, would be seeing a breakdown of how Riak scales out... </div><div><br></div><div>Something like showing how many keys in how many buckets takes how long with how many nodes... (extended by, now with 2 more machines, now with more complex m/r funcs, now with twice as many keys, etc...) I know this largely depends on whatever map/reduce functions are being run however even a simple example would be nice to see.  As it is I have no idea how many queries per second of what type I can run with how many active nodes?  Again, I realize this is something that needs to be benchmarked for any sort of accuracy but I'm speaking more of targeting developers, like myself, who are looking into this as a newer technology that may work for them.  It is a very large commitment of time and resources to design and implement something then benchmark it in order to obtain the "if it will work for this application efficiently" answer. Having some baseline stats from which to start may prompt more developers to explore Riak as a storage solution. </div>
<div><br></div><div>And one more thanks for hearing me out and your feedback.  I'd also like to reiterate that I'm coming from a limited nosql background... however I feel that's the case with the majority of developers out there today.  My recommendations for options are based on the real world application design challenges I've personally been presented with over my career and that I feel may be common to many other developers as well.  Obviously, even adding a single option such that I've mentioned is a massive undertaking on Basho's part but they are definitely pieces of functionality that would make me say, "done, Riak it is".  Rather than... is there something else which would better suit my needs... and when vying for adoption rate that's a major factor :)</div>
</div><br>