S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

突发奇想 之 远程调用

Posted on 2013-05-19 11:04 S.l.e!ep.¢% 阅读(2155) 评论(6)  编辑 收藏 引用 所属分类: Other

在写网络服务器的逻辑时,常常避免不了需要向 另一个服务器 发送协议, 直到等待返回成功, 再继续下一步的操作
这时候, 代码可能是这样的

RemoteObj.call( PROTOCOL_A,  param, callBackFun );

注:
PROTOCOL_A 是协议号
param 是参数
callBackFun 是回调函数

甚至有时还需要写  onError / onTimeout 之类的回调
这样,   一个业务逻辑被"分割"在两个甚至多个函数内去写

再假设,  

向 服务器A  请求,  需要等待 服务器A 返回成功后,  取到数据, 再向 服务器B 请求, 需要等待 服务器B 返回成功后, ...... (后面省略10000字)

这样的话, 
在写业务逻辑时,  思路常常被中断,  :) 有时写完一个回调函数, 前面考虑的异常已经忘记了 
在看业务逻辑时,  思绪在不同的函数间 跳来跳去,  容易看错或看漏东西.

我还假设,   如果代码只需要这样写

Response resp = RemoteObj.call( PROTOCOL_A,  param);
if ( resp.RetCode == SUCCESS )
......

call 函数内部其实是一个远程调用, 发协议到其它服务器, 等其返回协议后, 直接在 Response 就可以取 对方返回的协议内容, 当然 timeout
Response 也应该返回错误码

再简单一点说, 就是写 远程调用不需要 callback, 不需要实现  onError / onTimeout 之类的东西
写法就跟调用一个函数一样方便

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

现阶段, 似乎对 "远程调用 同步的写法" 并没有很好的解决方案,
网上看了些远程调用框架, 也避免不了要写 callback

需要实现也可以, 但并不是优雅的实现方案

例如:
可以在 call() 里面等待一个信号, 另一个线程等待接受协议返回后, 再激活这个信号, 但总不能一个 call() 调用就阻塞一条线程吧?
还可以 用 throw expcetion / long jump / goto 来实现调用 call() 发完协议后先 return , 等协议返回后, 再继续 goto到  call() 之后的代码, 这是最不优雅的做法了
再可以 用 一堆宏把 callback / ontimeout / onerror 之类的函数"屏蔽"掉, 也不是优雅的做法, 用宏实现, 有时一个简单的语法错, 可能都要找半天
甚至可以 弄自己的一套语法解析,  自己写一个语法解析的工具,  写完代码后, 再运行去 解析代码里的所有  callback , 再换成  callback / ontimeout / onerror 的函数

无论哪种实现, 都要注意, 在调用  callback 时, 要缓存当前所有的临时变量, 在对方服务器返回协议后, 再恢复这些临时变量, 这样才可以真正做到
"远程调用 同步的写法"

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

说了大半天, 还是没有解决方案, 只是一时突发的一个想法, 记录之
 

Feedback

# re: 突发奇想 之 远程调用  回复  更多评论   

2013-05-19 12:32 by Lo
Lambda 表达式 可以缓解 用起来感觉不错的

# re: 突发奇想 之 远程调用  回复  更多评论   

2013-05-19 12:47 by 会飞的导弹猪
楼主可以试试协程

# re: 突发奇想 之 远程调用  回复  更多评论   

2013-05-19 19:46 by S.l.e!ep.¢%
楼上的,我看了,系统API都有现成的,灰常不错,我喜欢.

# re: 突发奇想 之 远程调用  回复  更多评论   

2013-05-19 20:49 by 漂漂
函数式编程,参考一下jquery的数据请求。

# re: 突发奇想 之 远程调用  回复  更多评论   

2013-05-20 00:13 by Richard Wei
rpc

# re: 突发奇想 之 远程调用  回复  更多评论   

2013-05-20 12:12 by 三断笛
wcf

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理