其他分享
首页 > 其他分享> > 【项目经验】实现一个对外调用功能

【项目经验】实现一个对外调用功能

作者:互联网

业务场景:

开发一个模块,接收rpc计算请求,转发请求给外部,然后同步返回结果给调用方。本地调用是同步的,外部调用是异步的。

 

设计:调用方C(lient,客户端),本模块S(erver,服务端),外部接口应用 E(xternal,外部)

出现问题:

和架构设计冲突,架构基于事件驱动,每次收到事件,分配一个线程进行处理。如果请求事件Req分配给A线程,阻塞等待结果;收到结果Resp后,又分配给A线程,则造成伪死锁,请求必定超时,且在超时后打印日志,“开始处理结果”。由于分配是根据hash码随机分配的,并不能保证请求和返回事件不会分配给同一事件

解决思路 =》关键是请求和返回的事件不能分配给同一线程处理

  1. 请求事件,另起一线程处理 =》 不行,rpc的请求线程必须阻塞
  2. 返回事件,另起一线程处理 =》需要弃用架构,并自行mq的消费逻辑,该实现需放在C端接口jar中,导致C应用本身不能再添加自身逻辑(可以理解为一个mq消费实现一个bean,这个bean由mq实例调用,要么调用计算功能实现的bean,要么调用应用本身实现的bean,这是冲突的)。或者再加一个mq实例,都不太可取。
  3. 弃用MQ模拟rpc的方式,引入rpc组件,解决

引入rpc组件后,产生新的问题:原先是支持分布式的,而rpc组件要求,请求给S1,结果就也得S1处理,如果S2处理,已经没有队列可以放了

总结:

问题的产生是,因为mq模拟rpc实现与架构设计的冲突。另外,接口只支持单个计算请求,和返回结果的方式可能是组播或者群播,这两个设计的不合理,导致增加了很多工作量。

标签:返回,经验,请求,结果,rpc,调用,超时,对外
来源: https://blog.csdn.net/u014542626/article/details/117115592