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