- From: Michael Toomim <toomim@gmail.com>
- Date: Mon, 22 Jul 2024 12:41:04 -0700
- To: HTTP Working Group <ietf-http-wg@w3.org>, Braid <braid-http@googlegroups.com>, Peter van Hardenberg <pvh@pvh.ca>
- Message-ID: <0a25c83e-6941-464e-9252-8ca98960226a@gmail.com>
Peter, thank you for your interest! I'm excited that you are bringing up performance for discussion! There's a lot to say on that, and I give an overview below: *== Compression & Performance ==* First, let me correct a big misinterpretation— this work absolutely prioritizes *high-performance*, *realtime* data synchronization. It should support thousands of mutations per second. Our implementations are higher-performance <https://josephg.com/blog/crdts-go-brrr/> than Automerge, for instance. I regularly work today with a doc composed of 110,000 edits. It loads instantly, thanks to some great Version-Types we've designed. The Version-Type (in the proposed Version-Type header) is the way you get performance increases. The key to performance is managing history growth. You manage that by finding a pattern in history, and then compressing or ignoring history. You can express those patterns as a Version-Type spec. (There's a robust theory behind this called Time Machines.) I apologize that this wasn't clear in the draft -00. I thought this would be an advanced feature that people wouldn't comment on for a bit — but am pleasantly surprised to hear your interest in it! I will be adding more clarity to the spec on Version-Types, and already have begun doing so in github: https://github.com/braid-org/braid-spec/blob/master/draft-toomim-httpbis-versions-01.txt#L885 I'd also encourage you to check out this sketch of how to bake RLE into HTTP Header Compression: https://braid.org/meeting-69/header-compression https://braid.org/video/https://invisiblecollege.s3.us-west-1.amazonaws.com/braid-meeting-69.mp4#4166 In any case, keep in mind that at this stage, we need to know only whether there is /interest/ in this area of work — not whether this particular spec meets your needs. If we adopt this work into the HTTP WG, we will get a chance to change or rewrite any part of the spec. This spec is just a starting point to get discussion going. So think of this as a problem statement rather than a solution statement. *== PUTs ==* As for PUTs, I suspect you might be thinking about HTTP/1.0 where each PUT might require a new TCP connection with its own TLS handshake. But keep in mind that with HTTP/2 and 3, all HTTP semantics are expressed in binary, and a PUT is usually just a single packet! This is just as efficient as any hand-rolled protocol you have, and it has the advantage of being interoperable with all of HTTP. *== History Retention == * This versioning model supports Time Machines <https://braid.org/time-machines>— the beauty of which is that peers become free to independently choose how much history to store. An archival peer can store the full history. A light client can store just the latest version (see the amazing Simpleton <https://braid.org/simpleton> client, which needs zero history). So each peer can choose how much history to store. If a peer doesn't have enough history to merge an edit, it can simply request that history from another peer. In this draft, you do so by requesting a GET with both Version and Parents headers specified. *== Signatures & Validation == * This is out of scope for this proposal on versions. However, (a) there are some Version-Types that double as signatures. When this happens, it can be specified by authoring a Version-Type spec to articulate the new constraint. And (b) this is a generally important area of work that I encourage. Cheers! Michael On 7/22/24 11:44 AM, Michael Toomim wrote: > > We've got divergent discussion threads that I'm merging together. > > First, Peter Van Hardenberg (of Ink & Switch, Local-First, and > Automerge) wrote this initial review of the draft. He's cc'd, and we > can respond in this thread. > > ------------------------ > -- Peter Van Hardenberg: -- > ------------------------ > > Hi Michael, > > I had a quick look at the spec and gave some thought to whether we'd > want to adopt it. I think right now it has quite a lot of per-version > overhead, and viewing this through a local-first lens, one can imagine > having to publish a large number of versions each as separate PUT > calls. You might want to consider supporting ranges for PUT in a > single message. > > Overall, our goals appear to differ from what you're proposing here so > this feedback may not be particularly important. My sense is that the > expected granularity of changes for Braid is relatively large and that > the frequency is relatively long -- on par with a changed HTML form > submission, perhaps. We spend quite a lot of our time thinking about > optimizing updates for potentially thousands of edits and trying to > minimize the number of round trips required to synchronize state in > both directions. You mention that the design intends to be optimizable > but I didn't see much in the text that clarified how. > > One other observation is that this spec does not appear to prioritize > retention of history: > > - If the Parents header is absent, the server SHOULD return a > > single response, containing the requested version of the resource > > in its body, with the Version response header set to the same > > version. > This design may centralize the system, as clients default to receiving > "flattened" versions of resources and thus may not be able to merge > changes from other sources. > > Last, have you considered specifying some kind of signature / > validation feature? If clients are applying patches iteratively, it > might help for them to be able to validate that they're in the > expected state either before or after applying a patch. > > All the best, > -p > > On 7/15/24 6:26 PM, Michael Toomim wrote: >> >> Hi everyone in HTTP! >> >> Last fall we solicited feedback on the Braid State Synchronization >> proposal [draft >> <https://datatracker.ietf.org/doc/html/draft-toomim-httpbis-braid-http-04>, >> slides >> <https://datatracker.ietf.org/meeting/118/materials/slides-118-httpbis-braid-http-add-synchronization-to-http-00>], >> which I'd summarize as: >> >> "We're enthusiastic about the general work, but the proposal is >> too high-level. Break the spec up into multiple independent >> specs, and work bottom-up. Focus on concrete 'bits-on-the-wire'." >> >> So I'm breaking the spec up, and have drafted up the first chunk for >> you. I would very much like your review on: >> >> *Versioning of HTTP Resources* >> draft-toomim-httpbis-versions >> https://datatracker.ietf.org/doc/html/draft-toomim-httpbis-versions-00 >> >> Versioning is necessary for state synchronization—and occurs in a >> range of HTTP systems: >> >> * Caching >> * Archiving >> * Version Control >> * Collaborative Editing >> >> Today, HTTP has resource versions in the Last-Modified and ETag >> headers, and sometimes embeds versions in URLs, like with WebDAV. >> Each of these options serves some needs, but also has specific >> limitations. An improved general approach is proposed, which provides >> new features, that could enable cool new applications, such as >> incrementally-updated RSS feeds, and could simplify existing >> specifications, such as resumeable uploads, and history compression >> in OT/CRDT algorithms. >> >> I would love to know if people find this work interesting. I think we >> could improve performance, interoperability, and be one step closer >> to having Google Docs power within HTTP URLs. >> >> Michael >> >> -------- Forwarded Message -------- >> Subject: New Version Notification for >> draft-toomim-httpbis-versions-00.txt >> Date: Mon, 08 Jul 2024 11:02:11 -0700 >> From: internet-drafts@ietf.org >> To: Michael Toomim <toomim@gmail.com> >> >> >> >> A new version of Internet-Draft draft-toomim-httpbis-versions-00.txt >> has been >> successfully submitted by Michael Toomim and posted to the >> IETF repository. >> >> Name: draft-toomim-httpbis-versions >> Revision: 00 >> Title: HTTP Resource Versioning >> Date: 2024-07-08 >> Group: Individual Submission >> Pages: 19 >> URL: https://www.ietf.org/archive/id/draft-toomim-httpbis-versions-00.txt >> Status: https://datatracker.ietf.org/doc/draft-toomim-httpbis-versions/ >> HTMLized: >> https://datatracker.ietf.org/doc/html/draft-toomim-httpbis-versions >> >> >> Abstract: >> >> HTTP resources change over time. Each change to a resource creates a >> new "version" of its state. HTTP systems often need a way to >> identify, read, write, navigate, and/or merge these versions, in >> order to implement cache consistency, create history archives, settle >> race conditions, request incremental updates to resources, interpret >> incremental updates to versions, or implement distributed >> collaborative editing algorithms. >> >> This document analyzes existing methods of versioning in HTTP, >> highlights limitations, and sketches a more general versioning >> approach that can enable new use-cases for HTTP. >> >> >> >> The IETF Secretariat >> >>
Received on Monday, 22 July 2024 19:41:11 UTC