Rob*_*loi 20 php asynchronous thrift callback
在Thrift中,可以使用oneway修饰符将调用指定为异步.
显然,不可能定义一个回调,但是在完成函数的执行时执行.
似乎我唯一的可能性是给我的Thrift客户端(PHP)一些"服务器"功能,这样,当在服务器端完成繁重的计算时,我可以向它发送通知.这意味着我应该有一个新的.thrift文件,新的定义,新的服务和所有其余的,我应该用Thrift生成php-server端代码.
即使这是可行的,对我来说这看起来有点过分,我想知道是否有更聪明的方法来实现回调.
期待你的一些反馈,伙计们.
vla*_*adr 19
不幸的是,Roberto,Thrift框架没有这样的内置功能.有可能是一些替代品,不过,这取决于你希望你的PHP客户端会话期间,您通常都等计算密集节俭服务器响应的时间做什么(你有没有使用oneway.)
我现在只能想象,在编写一个Web应用程序的情况下,用户(或多个并行用户)可以分别触发计算密集型任务,您希望向所述用户提供一些反馈而所说的任务一直在流淌.
从一开始,您就完全正确地试图避免您试图避免的解决方案.您的PHP客户端会话无法在不阻塞的情况下为回调接口提供服务(除非您通过尝试使用pcntl_fork或其他一些PHP线程创可贴来深入挖掘漏洞.)
最简单的IMHO最好的方法是从事件驱动模型(我希望在服务器完成时得到通知)到轮询模型的两次切换(我会定期询问服务器是否完成.)有几种实现轮询模型的方法,在服务器和客户端都有多个实现选项,例如:
在调用阶段:
job_id值; 然后会话对计算密集型Thrift服务器进行异步oneway调用void compute(..., job_id),- 要么 -
job_id start_compute(...); 服务器分配唯一job_id值,然后在单独的线程/进程中生成实际的计算密集型任务,立即返回到已分配的PHP客户端会话job_id在计算阶段:
status get_status(job_id)调用计算密集型Thrift服务器,定期检查计算密集型作业的状态,- 要么 -
job_id到浏览器并指示浏览器定期检查计算密集型作业的状态job_id(例如,通过META REFRESH或通过XHR(AJAX)请求来自Javascript等); 浏览器检查产生一个简短的PHP客户端会话,该会话执行对计算密集型Thrift服务器的同步 status get_status(job_id)调用,在将状态(无论哪个)转发到浏览器后立即终止我收到了与Stack Overflow不同的频道的答案.由于作者允许我在这里发布他的答案,我认为这对社区中的其他人有用.
嘿罗伯特,
是的,之前已经出现在Apache列表中.用Thrift做你想要的东西没有优雅的方法.它基本上不是为双向消息传递而设计的.
围绕这个有黑客攻击,例如: - 客户端轮询 - 调用send_method(),在客户端等待,然后recv_method(),而不仅仅是方法() - 使客户端也实现Thrift服务器
但显然这些都不是真正的双向消息传递.我们试图让Thrift接口尽可能简单,并专注于核心RPC用例,这意味着要留下这样的东西.
可能不是你希望的答案.
干杯,mcslee
| 归档时间: |
|
| 查看次数: |
9522 次 |
| 最近记录: |