Yes. Then it loses the most important reason to use Ratis, lol. And I noticed that my original purpose is not missing change events. This can be implemented with a revision in each watch request.
Thank you! Best, tison. Tsz Wo Sze <[email protected]> 于2022年10月1日周六 18:36写道: > > ... 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. >>>>>>>> >>>>>>>
