Alex, yeah that explains it for me. I'll probably want to use a fully
connected address space, via a mesh or a hub and spoke topology, that I
fully manage - so this is the perfect level of abstraction for me. I'd like
to see that ZQ implementation though.

So, to be clear, if node A sends schism-map M to node B, both A and B
update M, B sends M back to A, A converges M1 and M2: If M1 and M2 have
destructive conflicts, does the most "recent" change win? Or does the local
copy win?

Thanks,

V/r

John

John

On Thu, Apr 19, 2018 at 8:55 AM, Alex Redington <areding...@gmail.com>
wrote:

> I'll try to answer this question and John's at the same time.
>
> Schism does not try to manage state for you over time; there are a lot of
> good tools for doing that already (atoms, refs, agents, channels, etc).
> Schism is a set of collections that augment basic clojure collections with
> enough additional information that you can take two persistent collections
> with common ancestry and merge them together. So, you could take a schism
> map held in an atom, dereference it and send it from a pedestal process to
> an om application as edn, and read-string it in the om app to have a
> replicated copy of the map. The om app could make some changes (dissoc one
> key, update another) without communicating to the pedestal app for each
> operation. Then send it back to the pedestal app in a POST body, and the
> pedestal app would swap! the atom using schism.core/converge and the value
> it just received from om. The changes, both additive and destructive, would
> be replicated in the atom's value.
>
> So, yes, you could build a serverless chatroom where each client held an
> atom with a schism collection, and they sent their copies around using
> WebRTC to stay in sync. You could push a schism edn serialization over a
> message queue to be synchronized on the other end. I anticipate pushing
> each discrete state over the mq with an add-watch hook might yield bad
> performance for little semantic gain. Schism collections are necessarily
> more expensive than Clojure collections in serialization size, and
> synchronization is where all of the signficant computational expense of
> these kinds of data structures resides, so doing it less frequently than
> every discrete update will probably be best. (A debounced send & sync that
> guaranteed transmission after n milliseconds of being inert would make
> sense to me)
>
> I'm not presently confronting a problem that these solve in my day job; my
> intent was to build and have the tool ready if and when we wanted to have
> better answers for "offline sync" in a single page ClojureScript
> application.
>
> Thank you for the great questions!
>
> -Alex
>
> On Wednesday, April 18, 2018 at 9:55:36 PM UTC-4, Luke Burton wrote:
>>
>>
>> This is cool!
>>
>> There seems to be some room for a recommendation on how to apply these
>> data structures effectively in practice, especially around the distribution
>> mechanism. For instance, I can imagine storing these in an atom and using
>> watchers to push changes out over zero-mq. Or is that the Worst Idea Everâ„¢?
>> I feel like the transit layer probably has *some* impact on whether CRDTs
>> are the right solution to the problem, and I'm interested to know what
>> those boundaries are.
>>
>> Have you used them in production over the network, and if so, what
>> solution did you use?
>>
>> Thanks again!
>>
>>
>>
>> On Apr 18, 2018, at 5:57 PM, Alex Redington <aredi...@gmail.com> wrote:
>>
>> Good evening!
>>
>> I submit for your evaluation and reasoned feedback a library I've been
>> working on to provide a set of convergent replicated data types to Clojure
>> and ClojureScript:
>>
>> https://github.com/aredington/schism
>> [com.holychao/schism "0.1.0"]
>>
>> Schism provides convergent collections for sets, vectors, lists, and
>> maps, along with edn readers and writers out of the gate. My intent is to
>> provide you with all the tools necessary to replicate a collection across
>> two or more computing nodes.
>>
>> Replication is a hard problem, so there are a few caveats to these tools
>> as I provide them:
>>
>> - You must identify nodes within your cluster. You may choose to identify
>> nodes with a random UUID, in which case schism will help you to do so. Node
>> identifiers must be clojure serializable data.
>> - Schism purposefully avoids carrying around a monotonically increasing
>> historical collection of data about deleted entries. Consequently there are
>> some ambiguities during convergence that may not exactly mirror local
>> modification.
>> - Schism is only solving the problem of synchronizing two in memory sets.
>> Maintaining identity of those two sets, tracking state changes, and long
>> term durability are responsibilities left to the schism user.
>>
>> Schism collections are persistent collections, so you should feel free to
>> work with them as a drop in replacement for a function which would work
>> against a Clojure collection. The usual utilities such as conj, assoc,
>> dissoc, disj, and rest are pure functions which will return you derived
>> copies, implicitly soing the convergence bookkeeping necessary in the
>> background. As you work with it, schism will maintain node and timestamp
>> information, with the goal of convergence providing the same result as if
>> all previous invocations had occurred on one local collection in memory.
>> Schism's requirements are your expectations of a Clojure collection, so
>> hash, =, and support for meta are all included, as well as many other
>> functions defined against Clojure's own collections. Particularly with hash
>> and =, you can expect a schism collection to return the same hashcode as
>> its Clojure equivalent, and to determine equality in the same way as its
>> Clojure equivalent would.
>>
>> I've built schism in the absence of a direct itch to scratch with it.
>> Should you find that it betrays your expectations of Clojure collections,
>> I'd greatly appreciate a bug report and will work to correct schism quickly.
>>
>> I hope that it assists you in solving your own problems.
>>
>> -Alex
>>
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clojure+u...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>>
>> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to