2014-07-25 50 views
1

我正在尝试使用java实现与客户端一样的服务。我正在使用Apache thrift进行RPC调用。该服务使用键值存储。我试图在键值存储中提供服务容错以及一致性和数据复制。Apache Thrift:具有同步和异步方法的服务器,有可能吗?

对于例如:假设在同一时间,有id为运行10台服务器 S1,S2,S3等,以及一个客户端调用放(键,值)对S1,S1现在保存 这个值和通话在所有其余服务器 上放置一个RPC(键值)用于数据复制。我希望服务器方法保存并将 成功返回给客户端,并在其余9台服务器上启动带有异步调用的线程,以便 复制期间不会阻止客户端。

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

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

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

有人可以帮我一个例子,我怎么能做到这一点。

而且,如果你认为我的设计是有缺陷的,也有在 更好的方法,我可以使用Apache节俭请不要 点出实现数据复制。

谢谢。

+0

http://stackoverflow.com/questions/18911972/how-to-handle-requests-using-different-thread-pools-in-thrift看来此人有做了同样的事情,但我不知道如何 – user3427096

+0

Multiplex是不同的。它允许在同一传输栈上运行多个服务。这可能不是你正在寻找这个问题。但是,如果你想结合公共服务和内部通信服务,但是(a)你不会被强迫这样做,并且(b)你可能想要为公共和内部服务使用不同的协议/传输。 – JensG

回答

2

A 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