Matt/Hadrian, to your question about the distributed lock being "safe" when
things crash...it depends on the implementation, but
http://www.hazelcast.com/documentation.jsp#Lock Hazelcast claims that it is
designed to handle this scenario...
"Locks are fail-safe. If a member holds a lock and some of the members go
down, cluster will keep your locks safe and available. Moreover, when a
member leaves the cluster, all the locks acquired by this dead member will
be removed so that these locks can be available for live members
immediately. "
Overall, I don't think the concept of synchronizing/locking blocks of
code/routes via the DSL would be that confusing to any Java developer (since
they are core Java concepts). Though it may be fairly simple to do this in
a POJO processor/bean, so are loops and other EIPs that we provide APIs for.
Adding camel-hazelcast locking support seems to be an easier sell given that
we already support the other Hazelcast features and it doesn't affect the
DSL directly...
That being said, I agree that Camel shouldn't try to do everything. Seems
like a fine line between adding value vs. clutter given how much it already
does...
Matt Pavlovich wrote:
>
> Hadrian-
>
> I agree. This is the same conceptual problem NFS/GFS and other similar
> systems have. Anytime you implement a centralized locking, you always
> have to account for the clients that requested locks disappearing, or the
> thing that is centralizing the locks goes away. This is usually solved
> with some sort of timeout, but that can be problematic if the only thing
> lost was the heart beat link. What happens if data you thought wasn't
> being processed all of a sudden shows up? Do you cluster your centralized
> locking? At some point the complexity kills you more than anything.
>
> I'd say I'm generally against adding the locking to the DSL, since I think
> one of the goals should be to keep things easy for users by being
> defensive with really complicated concepts, like locking. I think the
> number of users that will mis-use locking will greatly out number the
> users that will use it correctly-- read: make Camel "look" broken and/or
> too hard to use. Also, I think that the benefit of making it "easy" for
> the users that know they need locking is very small, since they will
> probably know how to properly implement locking anyway. (aka the Ben
> O'Days of the world). I see this today with transactions.
>
> My $0.02
>
> Matt Pavlovich
>
> On Sep 7, 2011, at 11:20 AM, Hadrian Zbarcea wrote:
>
>> Ben, no issue with the term lock(), I get the semantics. What I don't get
>> is this: what happens in your scenario if one of the boxes crashes (say
>> physically, burnt memory chip, power supply explodes) with the lock
>> acquired. What do the other camel processes do?
>>
>> Why not just queue the requests?
>>
>> Hadrian
>>
>>
>> On 09/07/2011 12:10 PM, boday wrote:
>>> Christian, my use case is that I have multiple apps that update the same
>>> data
>>> (PurchaseOrders) and we periodically see some stale writes. We have a
>>> combination of Camel/CXF web services (load balanced across 2 machines)
>>> and
>>> batch processing in Camel routes (in a separate app) and are evaluating
>>> using Hazelcast distributed locking to make sure only one thread works
>>> on a
>>> PO at any given time.
>>>
>>> Its simple enough to just manually add the Hazelcast locking in as
>>> pre/post
>>> processors in routes, it just got me thinking about how it could fit
>>> into
>>> Camel natively (since we already have a Hazelcast component, etc). As
>>> suggested by others, maybe the term "lock" is confusing and we should
>>> term
>>> it "synchronized" or "exclusive" or something...
>>>
>>>
>>> Christian Schneider wrote:
>>>>
>>>> I am not sure if this is the same use case that I had some years ago.
>>>>
>>>> We wanted to have several instances of an integration running but only
>>>> one of them should be active at any time.
>>>> At the time there was no easy solution for this problem.
>>>>
>>>> So in that use case you would have several instances of camel each on
>>>> its own machine.
>>>> They could have the same route but only one should be active.
>>>>
>>>> In the dsl this could also be expressed with a lock or perhaps
>>>> exclusive
>>>> element.
>>>>
>>>> from("some source ").exclusive("some id")....
>>>>
>>>> So the question in this case is: What lib or backend would be suitable
>>>> to impement this and what parameters would we need?
>>>> Does Hazelcast support this scenario?
>>>>
>>>> Would we start and stop the route when it gets or looses the lock?
>>>>
>>>> Christian
>>>>
>>>> Am 06.09.2011 22:16, schrieb boday:
>>>>> hey guys, while working on a solution for a client, I ran into the
>>>>> need
>>>>> to
>>>>> "synchronize" multiple routes that modify the same data (users,
>>>>> orders,
>>>>> etc)
>>>>> to prevent collisions (stale writes, etc). Is there an existing way
>>>>> to
>>>>> do
>>>>> this that I've overlooked?
>>>>>
>>>>> In the past, I've relied on
>>>>> http://activemq.apache.org/message-groups.html
>>>>> AMQ message groups for JMS based routes and Hazelcast to span
>>>>> routes/containers. I feel this would be a good fit for the Camel DSL.
>>>>> Has
>>>>> anyone looked into this in the past?
>>>>>
>>>>> After doing some quick research, it seems like Java
>>>>> http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock.html
>>>>> Lock seems to be the way to go. Also, Hazelcast can extend this to
>>>>> be
>>>>> distributed across VMs.
>>>>>
>>>>> So, I've been playing around with adding distributed locking support
>>>>> with
>>>>> Hazelcast (see https://issues.apache.org/jira/browse/CAMEL-4397
>>>>> CAMEL-4397
>>>>> ) and wanted to get some feedback on doing this. In particular, I'm
>>>>> using a
>>>>> Lock instance stored in a ThreadLocal variable (to ensure that the
>>>>> same
>>>>> thread releases the lock). Does anyone see any issue with this
>>>>> approach?
>>>>>
>>>>> If all goes well with this, I was planning on also adding a DSL API to
>>>>> provide a basic support for (non distributed)
>>>>> http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantLock.html
>>>>> ReentrantLocks .
>>>>>
>>>>> something like this...
>>>>>
>>>>> from(route1).lock(userId).process(processor1).unlock();
>>>>> from(route2).lock(userId).process(processor2).unlock();
>>>>>
>>>>> Any advice/comments are welcome...thanks
>>>>>
>>>>>
>>>>> -----
>>>>> Ben O'Day
>>>>> IT Consultant -http://consulting-notes.com
>>>>>
>>>>> --
>>>>> View this message in context:
>>>>> http://camel.465427.n5.nabble.com/discuss-implementing-Locks-in-Camel-tp4775904p4775904.html
>>>>> Sent from the Camel Development mailing list archive at Nabble.com.
>>>>>
>>>>
>>>> --
>>>> Christian Schneider
>>>> http://www.liquid-reality.de
>>>>
>>>> Open Source Architect
>>>> http://www.talend.com
>>>>
>>>
>>>
>>> -----
>>> Ben O'Day
>>> IT Consultant -http://consulting-notes.com
>>>
>>> --
>>> View this message in context:
>>> http://camel.465427.n5.nabble.com/discuss-implementing-Locks-in-Camel-tp4775904p4779134.html
>>> Sent from the Camel Development mailing list archive at Nabble.com.
>
-----
Ben O'Day
IT Consultant -http://consulting-notes.com
--
View this message in context:
http://camel.465427.n5.nabble.com/discuss-implementing-Locks-in-Camel-tp4775904p4779876.html
Sent from the Camel Development mailing list archive at Nabble.com.