On Dec 10, 2012, at 8:37 AM, Marko Topolnik wrote:

> It's true that STM is "all or nothing", but it is so over the scope of refs 
> you choose.  If there's some side-effecting bit you need to do somewhere, 
> then clearly that's not going to fit within a transaction…but that bit will 
> often fit just fine in a send-off to an agent provoked _by_ a transaction.
> 
> send-off fails to be useful whenever you need the results within the 
> transaction (quite often, that is).

I'm not aware of any system that provides transactional semantics in the face 
of in-transaction side-effecting actions.  If you can refer me to any, that'd 
be great.

> > My guess is, if your task is something purely computational and amenable to 
> > massive parallelization, you may have a go with STM; if it's just about 
> > business logic accessible concurrently by many clients, you won't find it 
> > workable. 
> 
> If your task is purely computational and amenable to massive parallelization, 
> you _should_ use agents whenever possible.  STM provides for coordination in 
> order to enforce consistency; unless all of your operations are commutative 
> (in which case, you should probably be using agents anyway), a program using 
> STM _will_ provoke retries and other means to route around ref contention.  
> This is acceptable because STM is all about maintaining correctness in the 
> face of concurrent mutation, and not necessarily about performance, aggregate 
> throughput, and so on.  
> 
> But concurrency is all about performance and throughput. So where is the 
> benefit of using correct, slow concurrent mutation? I guess in a 
> write-seldom, read-often scenario.

Fundamentally, concurrency is about simultaneous independent computation.  
Depending on the domain and computations involved, single-thread performance 
and aggregate throughput can vary significantly.

Anyway, read-heavy applications are still the norm in most industrial settings, 
despite the rise in popularity of write-scalable architectures.

> On the other hand, ref readers are _never_ blocked (regardless of what's 
> going on on the write side), so the data in such refs is always accessible.  
> This sounds like an ideal combination for "business logic" (as nebulous a 
> term as that is) to me. 
>  
> Business logic almost always involves communication with outside systems 
> (since it's usually about integration of many existing systems). Even if not, 
> a scalable solution must be stateless (a prerequisite for cluster deployment) 
> and any durable state must go into a single datasource common to all cluster 
> nodes. Again, these datasources don't participate in an STM transaction. 
> Maybe this would be a major route of improvement: integrate the STM with 
> external datasource transactions. But this is still quite removed from the 
> present.

I'm certain that particular set of requirements holds in certain settings, but 
they are hardly universal.

If I may make a tenuous inference, it sounds like you're trying to fit every 
state transition within an application into a transaction.  If so, I'd 
recommend the opposite: decomposing applications and their processes into 
modular bags of state and treating them separately will lead to big wins — 
including potentially being able to use e.g. STM in one place, and agents in 
another, each interacting with the other as necessary.

Re: getting disparate datasources to participate in transactions, you might 
want to take a look at Avout:

        http://avout.io  

I can't say I've used it, but it is at least an existence proof of the ability 
of the Clojure STM model to be distributable.

Cheers,

- Chas

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

Reply via email to