服务中void方法与oneway void方法的差异及相关疑问咨询
void方法与oneway void方法的核心差异 先看你给出的这段服务定义:
service MyService { void test1(); oneway void test2(); }
你抓的点很准——两者都没有业务返回值,但它们在调用行为、客户端逻辑、错误处理上的区别可大了,咱们拆开来聊:
同步vs发后即忘的本质差异
普通的void test1()是标准的同步RPC调用:客户端把请求发出去后,会原地等着服务器端把整个方法的逻辑跑完——哪怕这个方法啥也不返回,客户端也得等服务器传回一个「我执行完了」的确认信号,才会继续往下执行自己的代码。
而oneway void test2()是纯单向调用:客户端把请求一发送,直接就返回继续自己的流程了,完全不管服务器有没有收到请求、有没有开始执行、执行完没——相当于"我把消息扔出去了,剩下的跟我没关系"。错误处理天差地别
用普通void方法时,如果服务器执行出错(比如抛出异常、网络断了),客户端会立刻收到对应的RPC错误,因为它一直在等服务器的响应;
但oneway方法就没这个机制了:客户端发完就溜了,所以永远不会收到任何执行失败的通知——哪怕请求半路丢了,或者服务器执行时崩溃了,客户端都一无所知。为啥要有
oneway?
这完全是为了特定场景设计的:
比如日志上报、用户行为打点这类操作,我们根本不需要确认服务器有没有成功接收数据——只要发出去就行,用oneway能避免客户端被同步等待阻塞,大幅提升响应速度;
而普通void方法适合那些必须确保服务器完成处理的场景,比如删除用户的缓存资源,哪怕没有返回值,客户端也需要等服务器确认处理完毕,才敢进行后续操作。
另外要提一句语法约束:oneway方法必须是void类型,这很好理解——它本来就不会返回任何东西,包括执行状态;但反过来,void方法不一定要加oneway,因为void只是表示没有业务返回值,不代表不需要同步确认执行结果。
内容的提问来源于stack exchange,提问作者Anton Shchyrov

