21

Thrift中,可以使用oneway修饰符将调用指定为异步

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

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

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

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

4

4 回答 4

19

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

我现在只能想象,您处于这样一种情况,在编写了一个用户(或多个并行用户)可以分别触发计算密集型任务的 Web 应用程序后,您想向所述用户提供一些反馈虽然说任务随着时间的推移而变化。

从一开始,你试图避免你试图避免的解决方案是绝对正确的。您的 PHP 客户端会话无法在不阻塞的情况下为回调接口提供服务(除非您通过尝试使用pcntl_fork或其他一些PHP 线程创可贴来更深入地挖掘漏洞。)

最简单和恕我直言最好的方法是从事件驱动模型我希望在服务器完成时收到通知切换到轮询模型我会定期询问服务器是否完成。)有几种实现轮询模型的方法,在服务器端和客户端都有多种实现选项,例如:

  1. 调用阶段

    • PHP 客户端会话分配一个唯一job_id值;然后会话对计算密集型 Thrift 服务器进行异步oneway调用,void compute(..., job_id)

    - 或者 -

    • PHP 客户端会话对计算密集型 Thrift 服务器进行同步调用;job_id start_compute(...)服务器分配唯一job_id值,然后在单独的线程/进程中生成实际的计算密集型任务,立即返回到分配的 PHP 客户端会话job_id
  2. 计算阶段

    • PHP 客户端会话通过对计算密集型 Thrift 服务器的同步 调用,定期检查计算密集型作业的状态,status get_status(job_id)

    - 或者 -

    • PHP客户端会话立即终止以释放宝贵的资源,在传递job_id给浏览器并指示浏览器定期检查计算密集型作业的状态job_id(例如,通过META REFRESH,或通过XHR(AJAX)请求来自Javascript等);浏览器检查生成一个简短的 PHP 客户端会话,该会话执行对计算密集型 Thrift 服务器的同步调用,在将状态(无论它可能是什么)转发到浏览器后立即终止 status get_status(job_id)
于 2010-04-10T07:19:42.700 回答
8

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

嘿罗伯特,

是的,这已经出现在 Apache 列表中。Thrift 没有优雅的方式来满足您的要求。它基本上不是为双向消息传递而设计的。

对此有一些技巧,例如: - 客户端轮询 - 调用 send_method(),在客户端等待,然后是 recv_method(),而不仅仅是 method() - 使客户端也实现 Thrift 服务器

但显然这些都不是真正的双向消息传递。我们试图让 Thrift 接口尽可能简单,并专注于核心 RPC 用例,这意味着要保留一些类似的东西。

可能不是您希望的答案。

干杯,麦克斯利

于 2010-04-13T13:54:27.387 回答
3

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

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

于 2012-02-04T16:57:35.677 回答
0

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

于 2010-09-02T15:47:48.203 回答