Apache Thrift:服务器采用同步和异步方法,有可能吗?

时间:2014-07-25 06:22:34

标签: java thrift

我正在尝试使用java实现与客户端类似的Twitter服务。我正在使用Apache thrift进行RPC调用。该服务使用键值存储。我正在尝试使服务容错以及键值存储中的一致性和数据复制。

  

例如:假设一次有10个服务器以id运行   S1,S2,S3等和一个客户端在S1上调用put(key,value),现在S1保存   此值并在所有剩余服务器上调用RPC put(键,值)   用于数据复制。我希望服务器方法保存并返回   成功到客户端,并启动一个带有异步调用的线程   剩余9台服务器,以便客户端在此期间不被阻止   复制。

自动生成的代码有Iface和AsyncIface,我目前在ServerHandler类中实现了Iface。

我的目标是将后端服务器暴露给客户端,并在客户端和服务器之间进行正常(阻塞)调用,并在服务器之间进行异步调用。一次会运行多个客户端 - 服务器对。

据我所知,数据复制模型很粗糙,但我正在尝试学习分布式系统。

有人可以帮我举一个关于如何实现这个目标的例子。

  

另外,如果您认为我的设计存在缺陷并且有更好的方法   我可以使用Apache Thrift实现数据复制   指出。

谢谢。

1 个答案:

答案 0 :(得分:3)

oneway方法是异步的,未标记为oneway的任何其他方法都是同步的。

exception OhMyGosh {
    1: string msg
}

service TwelfthNightOrWhatYouWill {

    // A oneway method is a "one shot" method. The server may execute
    // it asynchronously, depending on the server implementation
    // Oneways can be very useful when used with messaging systems
    // A oneway does NOT return anything, including exceptions
    oneway void ImAsync(1: i32 foo, 2: string bar, 3: double baz)

    // Any method not marked with oneway is synchronous. Even if the call does
    // not return anything, it will be still a blocking call for the client.
    void ImSynchronous(1: i32 foo, 2: string bar) throws (1: OhMyGosh omg)
    i32  ImAsWell(1: double baz) throws (1: OhMyGosh omg)
    void MeToo()
}

服务器是否以连接方式异步执行oneway取决于您使用的服务器实现。 Threaded或Threadpool服务器似乎是一个不错的选择。

客户端发送了oneway请求后,它不会等待服务器的回复,只是继续执行他的执行流程。从技术上讲,对于oneway,没有生成recv_Xxxx()函数,只有send_Xxx()部分。

如果您需要将数据发送回客户端,最好的选择是在客户端进程中设置服务器,这似乎是您特定用例中的最佳选择。在无法做到这一点的情况下(想想HTTP),典型的解决方法是轮询或长时间运行的调用,但这两种技术都有一些缺点。


<子> With apolagies to W.Shakespeare