Thrift异步函数中的回调?

时间:2010-03-31 17:13:08

标签: php asynchronous callback thrift

Thrift中,可以use the oneway modifier将呼叫指定为异步

显然,不可能定义一个回调,但是,当函数执行完成时执行。

似乎我唯一的可能性是给我的Thrift客户端( PHP )一些“服务器”功能,这样,当在服务器端完成繁重的计算时,我可以发送通知它。这意味着我应该有一个新的.thrift文件,包含新定义,新服务以及所有其他文件,我应该使用Thrift生成php-server端代码。

即使这是可行的,对我来说这看起来有点过分,我想知道是否有更聪明的方法来实现回调。

期待你的一些反馈,伙计。

4 个答案:

答案 0 :(得分:19)

Roberto,遗憾的是Thrift框架没有这样的内置功能。但是,可能有很多替代方案,这取决于您希望PHP客户端会话在您通常等待计算密集型Thrift服务器回答的时间内做什么(如果您没有使用过oneway。)

我现在只能想象,您所处的情况是,编写了一个用户(或多个并行用户)可以分别触发计算密集型任务的Web应用程序,您希望提供一些反馈当所述任务流失时,对所述用户说。

从一开始,您就完全正确地试图避免您试图避免的解决方案。您的PHP客户端会话无法阻止回调界面(除非您通过尝试使用pcntl_fork或其他PHP threading band-aid来深入挖洞。)

最简单的恕我直言,最好的方法是从事件驱动模型中选择两个 我希望在服务器完成时收到通知到轮询模型我将定期询问服务器是否已完成。)有多种方法可以实现轮询模型,服务器上还有多个实现选项在客户方面,例如:

    调用阶段期间
    • PHP客户端会话分配唯一​​的job_id值;会话然后将异步oneway调用void compute(..., job_id)发送到计算密集型Thrift服务器,

    - 或 -

    • PHP客户端会话向计算密集型Thrift服务器发出同步调用job_id start_compute(...);服务器分配唯一的job_id值,然后在单独的线程/进程中生成实际的计算密集型任务,立即返回到具有分配的job_id
    • 的PHP客户端会话
  1. 计算阶段期间
    • PHP客户端会话通过对计算密集型Thrift服务器的同步 status get_status(job_id)调用来定期检查计算密集型作业的状态,

    - 或 -

    • 在将job_id传递给浏览器并指示浏览器定期检查计算密集型作业的状态时,PHP客户端会话立即终止以释放宝贵的资源{{1} (例如通过META REFRESH,或通过Javascript的XHR(AJAX)请求等);浏览器检查产生一个简短的PHP客户端会话,该会话执行对计算密集型Thrift服务器的同步 job_id调用,在将状态(无论哪个)转发到浏览器后立即终止

答案 1 :(得分:8)

我收到了与Stack Overflow不同的频道的答案。由于作者允许我在这里发布他的回答,我认为它对社区中的其他人有用。

  嘿罗伯特,

     

是的,Apache已经出现了这个问题   之前列出。没有优雅的方式   做你想要的   节约。它根本不是   专为双向消息传递而设计。

     

周围有黑客攻击,例如:    - 客户端轮询    - 调用send_method(),在客户端等待,然后recv_method(),   而不只是方法()    - 使客户端也实现Thrift服务器

     

但显然这些都不是真的   双向消息传递。我们试过了   保持Thrift接口为   尽可能简单,专注于   核心RPC用例,这意味着   留下这样的东西。

     

可能不是你的答案   希望。

     

干杯,mcslee

答案 2 :(得分:3)

我没有尝试使用Thrift实现回调(这会使协议变得更重,我猜),我使用轻量级消息传递服务(STOMP - http://stomp.github.com)来通知客户端异步事件。

我的方法是Thrift客户端订阅特定的STOMP通道,并且Thrift服务器将在异步事件发生时在同一通道上发布。然后,客户端可以向服务器查询有关该事件的其他信息。

答案 3 :(得分:0)

Java通过Future Object引用进行异步消息调用。这可以使用Message Pack在RPC模型中实现。我不确定PHP是否有类似的东西。