Hi,

I'm new to Akka and CRDT, so take the below with a grain of salt.
I'm trying to implement the application requirements with thousands of 
LWW-Maps, not related to each other.
The implementation itself is not the main issue I have, but the internal 
"distributed data" gossip protocol implementation, I found interesting...

I suppose the problem below is related to my understanding (or lack of 
understanding) of CRDT, or current implementation of distributed-data 
plugin...

Let's say I have 10K not related to each other CRDT based data type 
instances, for example 10K LWW-Maps. From the application point of view, 
they may be out of sync in relation to each other, but each one should be 
eventually consistent and synced in a cluster, using Local Consistency. By 
reading distributed-data plugin source code, I've found that for 
LWW-Map Key created (as any other CRDT data type instance defined) "lives" 
in a Replicator.dataEntries map.

Then, the gossip protocol, based on the tick interval, replicates once a 
time configured chunk size of data, but no more than 10 chunks at 
once(Replicator.gossipTo()?). Means, the whole dataEntries map is 
replicated, no matter how many LWW-Maps were changed, if at all. The 
replication is goes as sending the digests of all (!) LWW-Maps (entries in 
dataEntries, using Status message) by gossip initiating node, and then 
requesting the differences and sending them back, if such differences were 
found (Gossip, one more round trip).
That means, even with zero changes to my 10K LWW-Map entries, with few 
entries per each LWW-Map instance, 10K digests will be sent to all nodes 
each gossip tick fired. I see this behavior in a log...
This is the flow seen in 2.4.16 release version.

In 2.5.0-SNAPSHOT, delta CRDT approach is presented. Although the 
documentation and the article mentioned talk about deltas changes of 
different CRDT data types (ex.: c, d elements in a set), the replication 
mechanism works on key->dataEnvelope level, means on the whole changed 
entry of dataEntries map (deltaPropagationSelector.update(key.id, d) ...). 
Please 
notice, the replication is not performed as a sending delta changes of a 
single data type instance(changed entries of of particular Set for 
example), but as a whole Set replication. In the current implementation, 
 "delta" means that only changed instances will be replicated by gossip 
protocol, and not the actual delta of CRDT data type instance.

I spotted this behavior when having 1K different non related LWW-Maps with 
different key names, the system initiated sending of 1K digest signatures 
to all nodes without single change (in 2.4.16), or, having single map entry 
changed will fire the same flow anyway.

2.5.0-SNAPSHOT version should improve this approach, but, yet, the delta 
message is not built on a single CRDT type instance, but the all entries 
from dataEntires map there were changed, even if a single entry was changed 
in a 10 entries LWW-Map.

So based on my understanding, my questions are:
- in 2.4.16, what is the rationale to treat non related CRDT instances in 
dataEntries map as one composite CRDT, and replicate them as one single 
structure, and not as non-delta replication, but for each instance 
separately? If my approach is wrong, what is the way to do it anyway?
- in 2.5.0, why the delta mechanism works on dataEntries map level, but the 
documentation and the article talk about delta of a single CRDT data type 
instance (members of CRDT Set) ? Is my understanding correct? If so, what 
is the reason for the current implementation?
- What is the best way to implement large amount of non-related CRDT data 
type instances, Local Consistency, and reduce the replication overhead?


Current implementation creates huge amount of inter-node traffic and cpu 
overhead, and even for less than 100K entries is pretty heavy. I don't 
really understand how the "shopping cart" like example (in case of Local 
Consistency!) with simultaneously logged-in 10K users with 10K shopping 
carts replicated each gossip interval  (digest round trip saves a lot, but 
still) should work in real life. On my opinion, working with Local 
Consistency should improve performance in comparison with any other 
consistency strategy, but it looks like for large amount of CRDT data type 
instances, it's not the case in my performance tests ...


P.S. I also found that "Subscribe" mechanism uses a kind of "delta" 
approach even in 2.4.16, as it saves all changed entries in 
"Replicator.changed" set for later notifications. So, the delta mechanism 
per entries of dataEntries map level exists, but only for notifications...


Vadim Punski

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to akka-user+unsubscr...@googlegroups.com.
To post to this group, send email to akka-user@googlegroups.com.
Visit this group at https://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to