sofastack / sofa-rpc

SOFARPC is a high-performance, high-extensibility, production-level Java RPC framework.
https://www.sofastack.tech/sofa-rpc/docs/Home
Apache License 2.0
3.82k stars 1.17k forks source link

消费端如何自定义业务线程池? #1186

Closed loongs-zhang closed 2 years ago

loongs-zhang commented 2 years ago

Your question

消费端如何自定义业务线程池?

Your scenes

网关中间件做协议兼容时,对所有RPC框架想用同一个自定义的共享线程池,以提高线程池资源利用率。

Your advice

提供一个类似dubbo的线程池SPI扩展

Environment

MingJunDuan commented 2 years ago

Service provider interface with customed thread pool, is it? https://www.sofastack.tech/projects/sofa-rpc/custom-threadpool/

loongs-zhang commented 2 years ago

额,主要关心消费方

发自我的iPhone

------------------ 原始邮件 ------------------ 发件人: Duan @.> 发送时间: 2022年3月28日 13:02 收件人: sofastack/sofa-rpc @.> 抄送: dragon-zhang @.>, Author @.> 主题: Re: [sofastack/sofa-rpc] 消费端如何自定义业务线程池? (Issue #1186)

这个是服务提供方的自定义线程池: https://www.sofastack.tech/projects/sofa-rpc/custom-threadpool/

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

JervyShi commented 2 years ago

@dragon-zhang 消费方使用的是业务当前线程,不存在自定义线程池的概念

loongs-zhang commented 2 years ago

了解了,感谢

发自我的iPhone

------------------ 原始邮件 ------------------ 发件人: JervyShi @.> 发送时间: 2022年3月28日 19:27 收件人: sofastack/sofa-rpc @.> 抄送: dragon-zhang @.>, Mention @.> 主题: Re: [sofastack/sofa-rpc] 消费端如何自定义业务线程池? (Issue #1186)

@dragon-zhang 消费方使用的是业务当前线程,不存在自定义线程池的概念

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

loongs-zhang commented 2 years ago

在问个问题,如果是异步调用,走的哪个线程?

发自我的iPhone

------------------ 原始邮件 ------------------ 发件人: JervyShi @.> 发送时间: 2022年3月28日 19:27 收件人: sofastack/sofa-rpc @.> 抄送: dragon-zhang @.>, Mention @.> 主题: Re: [sofastack/sofa-rpc] 消费端如何自定义业务线程池? (Issue #1186)

@dragon-zhang 消费方使用的是业务当前线程,不存在自定义线程池的概念

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

JervyShi commented 2 years ago

这个要看你指的是哪种异步了,如果是指的 SOFA-RPC 的 Async 调用模式,类似 https://github.com/sofastack/sofa-rpc/blob/master/example/src/test/java/com/alipay/sofa/rpc/invoke/future/FutureClientMain.java 依然可以在当前线程中获取 Async 的响应结果。 如果指的是自己通过线程池异步触发 RPC 调用,那么发起方是你的自定义线程池的线程。 当然这里指的是调用端视角,RPC 本身的工作机制其实是纯异步的,请求发起后,response 返回的时候其实是有另外一个线程池在负责接受请求并和请求发起线程交互返回结果,这个在 sofa-rpc 这里目前暂不支持自定义。

loongs-zhang commented 2 years ago

您好,我指的是INVOKER_TYPE_CALLBACK这种异步,比如https://github.com/sofastack/sofa-rpc/blob/master/example/src/test/java/com/alipay/sofa/rpc/invoke/callback/CallbackClientMain.java,这个应该是借助了netty的io线程吧

------------------ 原始邮件 ------------------ 发件人: "sofastack/sofa-rpc" @.>; 发送时间: 2022年3月31日(星期四) 中午11:32 @.>; @.**@.>; 主题: Re: [sofastack/sofa-rpc] 消费端如何自定义业务线程池? (Issue #1186)

这个要看你指的是哪种异步了,如果是指的 SOFA-RPC 的 Async 调用模式,类似 https://github.com/sofastack/sofa-rpc/blob/master/example/src/test/java/com/alipay/sofa/rpc/invoke/future/FutureClientMain.java 依然可以在当前线程中获取 Async 的响应结果。 如果指的是自己通过线程池异步触发 RPC 调用,那么发起方是你的自定义线程池的线程。 当然这里指的是调用端视角,RPC 本身的工作机制其实是纯异步的,请求发起后,response 返回的时候其实是有另外一个线程池在负责接受请求并和请求发起线程交互返回结果,这个在 sofa-rpc 这里目前暂不支持自定义。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

MingJunDuan commented 2 years ago

不是Netty的io线程,INVOKER_TYPE_CALLBACK异步使用了SOFA-RPC定义的callBack线程池,见AsyncRuntime和RpcInvokerCallbackListener.onResponse()

loongs-zhang commented 2 years ago

十分感谢

发自我的iPhone

------------------ 原始邮件 ------------------ 发件人: MingJunDuan @.> 发送时间: 2022年3月31日 18:45 收件人: sofastack/sofa-rpc @.> 抄送: dragon-zhang @.>, Mention @.> 主题: Re: [sofastack/sofa-rpc] 消费端如何自定义业务线程池? (Issue #1186)

不是Netty的io线程,INVOKER_TYPE_CALLBACK异步使用了SOFA-RPC定义的callBack线程池,见AsyncRuntime和RpcInvokerCallbackListener.onResponse()

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

loongs-zhang commented 2 years ago

不是Netty的io线程,INVOKER_TYPE_CALLBACK异步使用了SOFA-RPC定义的callBack线程池,见AsyncRuntime和RpcInvokerCallbackListener.onResponse()

看了下com.alipay.sofa.rpc.context.AsyncRuntime没有提供setAsyncThreadPool方法,虽然可以通过反射的方式来强行设置,但还是想了解下,出于什么考虑,不提供setAsyncThreadPool方法。

MingJunDuan commented 2 years ago

可以自行设置线程池core、max、队列大小参数,目前没有setAsyncThreadPool方法

loongs-zhang commented 2 years ago

可以自行设置线程池core、max、队列大小参数,目前没有setAsyncThreadPool方法

是否可以提个PR,来提供setAsyncThreadPool方法呢? 让用户自定义线程池类型,应该是个合理的需求吧?

期待您的回复。

MingJunDuan commented 2 years ago

目前AsyncThreadPool除了callBack有用到,EventBus、ConnectionHolder也使用到,改动需要仔细斟酌。

loongs-zhang commented 2 years ago

收到,谢谢

dajitui commented 1 year ago

我觉得异步回调线程池参数可配置化已经够用了,如果采用自定义共享线程池会存在其他问题的,比如说资源争抢,优先级混乱