异步调用

基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。 [1]

/user-guide/images/future.jpg

在 consumer.xml 中配置:

  1. <dubbo:reference id="fooService" interface="com.alibaba.foo.FooService">
  2. <dubbo:method name="findFoo" async="true" />
  3. </dubbo:reference>
  4. <dubbo:reference id="barService" interface="com.alibaba.bar.BarService">
  5. <dubbo:method name="findBar" async="true" />
  6. </dubbo:reference>

调用代码:

  1. // 此调用会立即返回null
  2. fooService.findFoo(fooId);
  3. // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future
  4. Future<Foo> fooFuture = RpcContext.getContext().getFuture();
  5. // 此调用会立即返回null
  6. barService.findBar(barId);
  7. // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future
  8. Future<Bar> barFuture = RpcContext.getContext().getFuture();
  9. // 此时findFoo和findBar的请求同时在执行,客户端不需要启动多线程来支持并行,而是借助NIO的非阻塞完成
  10. // 如果foo已返回,直接拿到返回值,否则线程wait住,等待foo返回后,线程会被notify唤醒
  11. Foo foo = fooFuture.get();
  12. // 同理等待bar返回
  13. Bar bar = barFuture.get();
  14. // 如果foo需要5秒返回,bar需要6秒返回,实际只需等6秒,即可获取到foo和bar,进行接下来的处理。

你也可以设置是否等待消息发出: [2]

  • sent="true" 等待消息发出,消息发送失败将抛出异常。
  • sent="false" 不等待消息发出,将消息放入 IO 队列,即刻返回。
    1. <dubbo:method name="findFoo" async="true" sent="true" />

如果你只是想异步,完全忽略返回值,可以配置 return="false",以减少 Future 对象的创建和管理成本:

  1. <dubbo:method name="findFoo" async="true" return="false" />

  • 2.0.6 及其以上版本支持 ↩︎

  • 异步总是不等待返回 ↩︎

原文: http://dubbo.apache.org/#!/docs/user/demos/async-call.md?lang=zh-cn