That is, I know the map's server and RatisServer run on the same process,
and try to bypass the serde and network process but locally submit a
request with Message.

Best,
tison.


tison <[email protected]> 于2022年10月1日周六 17:41写道:

> Another direction can be, is it possible to submit a request to RaftServer
> locally, and thus not need to pipe a request from replicated map's client,
> map's server (i.e. RatisClient), and RatisServer?
>
> Best,
> tison.
>
>
> tison <[email protected]> 于2022年9月30日周五 19:03写道:
>
>> Thank you. I'll check the technical details.
>>
>> For the application framework, I find a possible way to add an external
>> watch manager who gets notified from callbacks registered to the state
>> machine. Although, this way asks the client to establish one more
>> connection to the watch manager (even if in the same process, different
>> port).
>>
>> Best,
>> tison.
>>
>>
>> Tsz Wo Sze <[email protected]> 于2022年9月30日周五 18:30写道:
>>
>>> > However, still I don't know what "watch an index" actually means. How
>>> can I obtain the index in the first place? What condition I will receive a
>>> one-shot response from?
>>>
>>> A log index can be obtained by RaftClientReply.getLogIndex(), which
>>> returns the raft log index corresponding to a write request.  The work flow
>>> is like below:
>>>
>>> 1. A client sends a (write) request and then gets back a RaftClientReply
>>> r -- at that moment the request may only have been replicated to a MAJORITY
>>> of servers as specified by the Raft Algorithm.
>>>
>>> 2. A user application may have a more strict replication requirement.
>>> For example, it may want the request to be replicated to ALL the servers,
>>> instead of a MAJORITY.  It may call
>>> watch(r.getLogIndex(), ReplicationLevel.ALL) in order to watch for the
>>> replication ALL condition.
>>>
>>> We also have MAJORITY_COMMITTED and ALL_COMMITTED replication levels.
>>> COMMITTED means that the server's commit-index has been increased at least
>>> the watched index.
>>>
>>> Hope it helps.
>>> Tsz-Wo
>>>
>>> On Fri, Sep 30, 2022 at 5:43 PM tison <[email protected]> wrote:
>>>
>>>> Hi Tsz-Wo,
>>>>
>>>> Thanks for your reply!
>>>>
>>>> I think in this way I can implement a one-shot watcher.
>>>>
>>>> The similar functionality in etcd defines as:
>>>>
>>>>     rpc Watch(stream WatchRequest) returns (stream WatchResponse);
>>>>
>>>> ... and this is why I use "full-duplex server-client communication" in
>>>> the subject - Is it possible for a Ratis client opens a connection to do
>>>> something like this?
>>>>
>>>> > AsyncApi.watch
>>>>
>>>> Yes. IIRC I asked questions about this "watch" function years ago and
>>>> understand it's not "watch a key" :)
>>>>
>>>> However, still I don't know what "watch an index" actually means. How
>>>> can I obtain the index in the first place? What condition I will receive a
>>>> one-shot response from?
>>>>
>>>> Best,
>>>> tison.
>>>>
>>>>
>>>> Tsz Wo Sze <[email protected]> 于2022年9月30日周五 15:17写道:
>>>>
>>>>> Hi tison,
>>>>>
>>>>> Since Ratis server is asynchronous event-driven.  We may implement "watch
>>>>> a key" using the AsyncApi [1]:
>>>>> 1. Client sends a "watch a key" request by client.a
>>>>> sync().sendReadOnly(..).
>>>>> 2. StateMachine won't complete the future until the key satisfies the
>>>>> watch condition.
>>>>>
>>>>> One problem is that the async read calls in Ratis are ordered.  Thus,
>>>>> the other ordered async calls sent by the same client would not be
>>>>> completed before the "watch a key" request is completed.  Of course,
>>>>> we may work around it by creating a new client.  A better solution is to
>>>>> support unordered async read (a new feature) in Ratis.
>>>>>
>>>>> Note that Ratis already supports unordered AsyncApi.watch(..), which
>>>>> can watch for the replication level of the given log index.  Therefore, it
>>>>> is easy to add the new feature for supporting unordered async read.
>>>>>
>>>>> What do you think?
>>>>>
>>>>> Tsz-Wo
>>>>>
>>>>> [1]
>>>>> https://github.com/apache/ratis/blob/master/ratis-client/src/main/java/org/apache/ratis/client/api/AdminApi.java
>>>>>
>>>>>
>>>>> On Fri, Sep 30, 2022 at 2:21 PM tison <[email protected]> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I'm trying to write a replicated map based on Ratis.
>>>>>>
>>>>>> One thing that blocks me here is that I'm trying to implement
>>>>>> something like "watch a key". While Ratis support basic RPC between 
>>>>>> server
>>>>>> and client, it's a one-shot RPC call. I have two ideas here but both 
>>>>>> seems
>>>>>> not easy to implement:
>>>>>>
>>>>>> 1. Take the client connection and send back key changes even if the
>>>>>> client doesn't round-robin query it. However, the Rpc details in under
>>>>>> encapsulation and never intend to be used.
>>>>>> 2. Wrapper an RMap server over the Ratis server. However, in this
>>>>>> case, It's the RMap server that should be responsible for initiating and
>>>>>> managing the connection. Ratis server encapsulates this detail and the 
>>>>>> only
>>>>>> way I can imagine is the RMap server as a proxy, but it's quite clumsy to
>>>>>> have one more hop.
>>>>>>
>>>>>> Looking forward to your ideas.
>>>>>>
>>>>>> Best,
>>>>>> tison.
>>>>>>
>>>>>

Reply via email to