> ... is it possible to submit a request to RaftServer locally, ...?

When the Leader is local, then you can call the RaftServer directly.  But
what if the Leader is changed?  Without using a Ratis client, your own
client has to handle leader change, which is not very easy to do.

Tsz-Wo


On Sat, Oct 1, 2022 at 5:45 PM tison <[email protected]> wrote:

> 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