[jbosscache-dev] Re: Non Blocking State Transfer Status (& Integration with JGroups)
Jason T. Greene
jason.greene at redhat.com
Tue Jan 6 17:58:04 EST 2009
Jason T. Greene wrote:
> Brian Stansberry wrote:
>> Jason T. Greene wrote:
>>> Brian Stansberry wrote:
>>>> Jason T. Greene wrote:
>>>>> Hi All,
>>>>>
>>>>> I wanted to summarize my initial research into NBST. The planned
>>>>> design (outlined in the wiki:
>>>>> http://www.jboss.org/community/docs/DOC-10275) only needs to block
>>>>> transactional activity once, at the end of the process when sending
>>>>> the tx log. Unfortunately it appears that flush and partial flush
>>>>> can not be used for this, since the application needs the ability
>>>>> to send state (tx log) during the flush. I.e. transactions need to
>>>>> be paused by only 2 nodes, while the transfer state. This however
>>>>> is not a big deal because we can just do this in JBoss Cache using
>>>>> a normal RPC message that flips a gate.
>>>>>
>>>>> In addition, the state transfer and streaming state transfer
>>>>> facilities in jgroups can not be used (since they are designed
>>>>> around blocking the entire group). This means JBoss Cache needs to
>>>>> stream state itself. Ideally this would be a separate
>>>>> point-to-point connection, since we don't want to pollute multicast
>>>>> traffic with potentially huge volumes of noise. Currently jgroups
>>>>> does not yet support a streaming API like this:
>>>>> https://jira.jboss.org/jira/browse/JGRP-653
>>>>>
>>>>> IMO This leaves us with 3 options:
>>>>>
>>>>> 1. Wait on JGRP-653 (upping its priority), also add requirements
>>>>> for a p2p connection.
>>>>> 2. Implement our own p2p connection using tcp (probably using xnio).
>>>>> 3. Somehow enhance state transfer / partial flush to meet our needs
>>>>>
>>>>> Option 1 seems to be a useful feature for other applications.
>>>>> Although we need feedback from Bela and Vladimir about that.
>>>>>
>>>>> Option 2 would give us more flexibility in the implementation,
>>>>> however care has to be taken to ensure that communication can only
>>>>> happen between group members (for security reasons), and that the
>>>>> network address configurations are somehow reused.
>>>>>
>>>>> Option 3 I am less found of, since we would likely end up adding a
>>>>> bunch of JBoss Cache specific code to JGroups that no one else
>>>>> would use.
>>>>>
>>>>
>>>> Option 2 makes me nervous. Two separate communication frameworks,
>>>> added dependencies, opening new sockets etc. Sounds like integration
>>>> hassles for sure.
>>>>
>>>
>>> Yes there are definitely integration hassles that make this option
>>> less desirable than the first.
>>>
>>> From a dependency perspective, we are already using non-jgroups p2p
>>> with TCPCacheServer (currently Java sockets based), although I
>>> believe Manik was evaluating xnio for it since it would simplify
>>> development. While it is an added dep for JBC, it will eventually be
>>> part of AS, since Remoting 3 depends on it.
>>
>> Yeah, that's part of the concern. Two otherwise independent projects
>> using an underlying library for a critical function and both have to
>> play nice in the AS. In my self-centered viewpoint TcpCacheServer
>> isn't a critical function since I don't use it. ;) (Mostly kidding
>> here; I recognize that AS users may use it so it would need to work in
>> the AS.)
>>
>> BTW, is a *JGroups* streaming API necessary here? The old AS Farm
>> service passed arbitrary sized files by sending byte[] chunks via
>> RpcDispatcher calls. Worked fine. That's not quite what JBC would
>> need, since FarmService read a chunk from a FileInputStream and passed
>> it to JGroups; you'd want an OutputStream impl that would pass a chunk
>> to JGroups when it's internal buffer reached size X.
>
> Their could be an abstraction in JBC that does this, however we are
> still missing the piece that says this message needs to go across a
> separate p2p tcp connection. Otherwise state transfer traffic will
> compete with live standard operations. This problem is amplified when we
> have multiple state transfers going on.
>
> I suppose we could dynamically create a new JGroups channel for this,
> but it seems like a lot of overhead for a single p2p connection.
>
Thinking again, building this over JGroups would probably better with
two static channels. One would be TCP + MPING, the other whatever the
user defines.
--
Jason T. Greene
JBoss, a division of Red Hat
More information about the jbosscache-dev
mailing list