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