代码改变世界

【代码分享】写一个RPC批量调用支持(支持串行和并行模式)

2010-08-26 13:45  GUO Xingwang  阅读(1619)  评论(0编辑  收藏  举报

      我在做项目过程中遇到这方面的问题,于是自己封装了一个组件来解决RPC的批量调用问题(需要获取每个RPC的返回结果),批量中的量最好也别太大,否则不是等待时间很长就是耗费很多线程。

      问题描述:对外需要提供一个异步RPC接口,但是对方要求是可以批量查询某些数据,内部也有类似的异步RPC接口,但是是单条查询。我这里需要做一个转换,需要将批量的拆分路由给单条的。而且类似这种需求的接口还挺多。所以为了代码简洁,控制上通用和规范些。

 

难点:
1.代码控制上,由于涉及很多异步回调+批量增加代码难度。
2.需要考虑各种异常和不hang住线程。
3.更好考虑到性能问题,批量的也许会对内部单条的接口造成压力。

 

本类库支持两种方案,也就是两种运行模式:
1.串行处理,也就是对于收到的批量的调用之后,一条一条处理,在第一条回调返回结果时再去执行第二条处理,依次类推指导所有调用处理完成为止。中间如果出现异常可以选择继续执行或中断返回整个处理结果。
2.串行处理,利用.net4.0提供的并行能力,使用任务处理批量的异步调用,并行库完成了一些同步机制,可以在全部单条调用结果返回时执行返回批量调用的结果。

 

串行方式可能执行时间比较长(与批量的条数有关),而串行方式可能需要很多线程并行参与,需要线程切换和同步比较多。对于一些性能要求比较高的推荐使用串行方式,对于一些要求返回结果比较快的推荐并行方式。一般RPC都属于IO密集型操作,而且每条之间比较独立,所以很适合任务处理。

运行结果:

 流水线开始...
Proc:0 OK
Proc:1 OK
Proc:2 OK
Proc:3 OK
Proc:4 OK
Proc:5 OK
Proc:6 OK
Proc:7 OK
Proc:8 OK
Proc:9 OK
Proc:10 OK
Proc:11 OK
Proc:12 OK
Proc:13 OK
Proc:14 OK
Proc:15 OK
Proc:16 OK
Proc:17 OK
Proc:18 OK
Proc:19 OK
Proc:20 OK
Proc:21 OK
Proc:22 OK
Proc:23 OK
Proc:24 OK
Proc:25 OK
Proc:26 OK
Proc:27 OK
Proc:28 OK
Proc:29 OK
返回最终结果:100
返回最终结果:101
返回最终结果:102
返回最终结果:103
返回最终结果:104
返回最终结果:105
返回最终结果:106
返回最终结果:107
返回最终结果:108
返回最终结果:109
返回最终结果:110
返回最终结果:111
返回最终结果:112
返回最终结果:113
返回最终结果:114
返回最终结果:115
返回最终结果:116
返回最终结果:117
返回最终结果:118
返回最终结果:119
返回最终结果:120
返回最终结果:121
返回最终结果:122
返回最终结果:123
返回最终结果:124
返回最终结果:125
返回最终结果:126
返回最终结果:127
返回最终结果:128
返回最终结果:129
00:00:00.51

源代码提供下载