我正在尝试使用java实现与客户端类似的Twitter服务。我正在使用Apache thrift进行RPC调用。该服务使用键值存储。我正在尝试使服务容错以及键值存储中的一致性和数据复制。
例如:假设一次有10个服务器以id运行 S1,S2,S3等和一个客户端在S1上调用put(key,value),现在S1保存 此值并在所有剩余服务器上调用RPC put(键,值) 用于数据复制。我希望服务器方法保存并返回 成功到客户端,并启动一个带有异步调用的线程 剩余9台服务器,以便客户端在此期间不被阻止 复制。
自动生成的代码有Iface和AsyncIface,我目前在ServerHandler类中实现了Iface。
我的目标是将后端服务器暴露给客户端,并在客户端和服务器之间进行正常(阻塞)调用,并在服务器之间进行异步调用。一次会运行多个客户端 - 服务器对。
据我所知,数据复制模型很粗糙,但我正在尝试学习分布式系统。
有人可以帮我举一个关于如何实现这个目标的例子。
另外,如果您认为我的设计存在缺陷并且有更好的方法 我可以使用Apache Thrift实现数据复制 指出。
谢谢。
答案 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),典型的解决方法是轮询或长时间运行的调用,但这两种技术都有一些缺点。