2010-03-31 121 views
19

Thrift有可能use the oneway modifier指定呼叫为异步节俭异步函数中的回调?

显然,不可能定义一个回调,虽然在函数执行完成时要执行。

看来,我唯一的可能性就是给我的储蓄客户端(PHP)一些“服务器”功能,这样,当大量的计算完成后在服务器端,我可以发送通知给它。这意味着我应该有一个新的.thrift文件,其中包含新的定义,新的服务和其他所有内容,并且我应该使用Thrift生成php-server端代码。

即使这是可行的,它看起来对我来说是一种矫枉过正,我想知道是否有更聪明的方式来实现回调。

期待您的反馈,伙计们。

回答

19

Roberto,不幸的是Thrift框架没有这样的内置功能。有可能是的一些替代方案,但这取决于您希望您的PHP客户端会话在通常等待计算密集型Thrift服务器回答的时间内执行的操作(如果您没有使用oneway。)

现在我只能想象,您处于这样一种情况:在编写Web应用程序时,用户(或多个并行用户)每个人都可以触发计算密集型任务,但您想提供一些反馈给表示用户同时表示任务流失。

从一开始,您绝对正确地试图避免您尝试避免的解决方案。你的PHP客户端会话不会阻塞不能服务回调接口(除非你试图使用pcntl_fork或其他一些PHP threading band-aid甚至更​​深的挖掘你的洞。)

出这个最简单,恕我直言,最好的办法是从两个开关一个事件驱动的模型我希望在服务器完成时得到通知到轮询模型我会定期询问服务器是否完成。)有实现轮询模式,与服务器上的多个实施方案在客户侧以及几种方法,如:

  • 的:

    1. 调用阶段

      PHP客户端会话分配一个唯一的job_id值;会议则使得异步调用onewayvoid compute(..., job_id)计算密集节俭服务器,

- 或 -

  • PHP客户端会话使得同步呼叫job_id start_compute(...)到计算密集型的Thrift服务器;服务器分配的唯一job_id值,那么将在一个单独的线程/进程的实际计算密集的任务,在计算阶段回国马上与分配job_id
  • PHP客户端会话:

    • PHP客户端会话进入经同步status get_status(job_id)调用定期检查计算密集型作业的状态来计算密集节俭服务器,

    - 或 -

    • PHP客户端会话立即终止以腾出宝贵的资源,通过对job_id浏览器,并指示浏览器后,定期检查计算密集型作业job_id的状态(例如,通过META REFRESH,或通过Javascript的XHR(AJAX)请求等);浏览器检查派生这执行同步status get_status(job_id)调用计算密集型节俭服务器上转发的状态(无论它可能是)浏览器
  • +2

    这种方法似乎也是C++客户端/服务器所必需的 – Ghita 2013-11-26 16:22:53

    8

    后立即终止简短的PHP客户端会话我收到了与Stack Overflow不同的频道的答案。由于作者允许我在这里张贴他的答案,我认为这可能对社区中的其他人有用。

    嘿罗伯特,

    呀,这又拿出了在Apache之前 名单。有没有优雅的方式 做你要求与 节俭。它基本上不是 设计用于双向消息。

    有解决此黑客,如: - )调用send_method(),等待在客户端侧,然后recv_method(),的 而不只是方法( - - 客户端轮询 使得客户端还实施一个Thrift服务器

    但是,显然这些都不是真正的 双向消息。我们试过 以尽可能简化Thrift接口为 ,并专注于 核心RPC用例,这意味着 留下了一些类似的东西。

    可能不是你想要的 希望的答案。

    干杯,mcslee

    0

    那么Java有Asynchronus消息称通过今后的对象引用。这可以使用Message Pack在RPC模型中实现。我不确定PHP是否有类似的东西。

    3

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

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