baidu / sofa-pbrpc

A light-weight RPC implement of google protobuf RPC framework.
Other
2.13k stars 655 forks source link

请教问题:Server底层是多个Service,Service下多线程? #126

Closed LazyPlanet closed 8 years ago

LazyPlanet commented 8 years ago

Server底层是多个Service,Service下多线程? 作者如何保证大家都服务与一个io_service?并且如何保证多线程条件下,io_service不退出的? 多谢。

qinzuoyan commented 8 years ago

我刚刚传了一个介绍sofa-pbrpc实现的PPT:doc/inside-sofa-pbrpc.pptx https://github.com/baidu/sofa-pbrpc/blob/master/doc/inside-sofa-pbrpc.pptx

每个RpcServer都维护了一个ServicePool,里面注册了各种service。你可以认为ServicePool是一个线程安全的service容器。 每个RpcServer还维护了一个ThreadGroup,其线程数可以通过work_thread_num配置来指定。每个ThreadGroup会关联一个boost asio的io_service(参见ThreadGroupImpl类的实现),以处理该io_service分派的各种事件。同时,io_service也作为构造参数传给RpcServerStream,这样网络连接与处理该连接上请求的ThreadGroup就关联起来了(线程模型图参见PPT第20页)。 需注意:原来的实现包括PPT中,每个RpcServer都只有一个ThreadGroup,即所有连接的请求处理共享一个ThreadGroup;而现在的实现通过IOServicePool维护了多个ThreadGroup,每个连接会选择与其中的一个ThreadGroup进行关联,选择策略采用round robin方式。这个不是我加的,不过我猜目的是为了提高性能。

所以:

如何保证大家都服务与一个io_service?在创建连接RpcServerStream的时候,构造函数参数传入同一个io_service。

如何保证多线程条件下,io_service不退出的?使用IOServiceWork(即boost::asio::io_service::work http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference/io_service__work.html ),具体参见ThreadGroupImpl::start()函数的实现。

希望我说明白了。

On Wed, Oct 19, 2016 at 10:39 AM, LazyPlanet notifications@github.com wrote:

Server底层是多个Service,Service下多线程? 作者如何保证大家都服务与一个io_service?并且如何保证多线程条件下,io_service不退出的? 多谢。

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/baidu/sofa-pbrpc/issues/126, or mute the thread https://github.com/notifications/unsubscribe-auth/AAgQPUNImR32bR5V_QtN4M-3cpohyeaUks5q1YLwgaJpZM4KagEF .

CaesarTang commented 8 years ago

@qinzuoyan 这个附件的链接不对。https://github.com/baidu/sofa-pbrpc/blob/master/doc/inside-sofa-pbrpc.pptx

LazyPlanet commented 8 years ago

好的,非常感谢,我看到了。

梦想,是注定孤独的旅行……

在2016年10月19日 11:56,Zuoyan Qin 写道: 我刚刚传了一个介绍sofa-pbrpc实现的PPT:doc/inside-sofa-pbrpc.pptx https://github.com/baidu/sofa-pbrpc/blob/master/doc/inside-sofa-pbrpc.pptx

每个RpcServer都维护了一个ServicePool,里面注册了各种service。你可以认为ServicePool是一个线程安全的service容器。 每个RpcServer还维护了一个ThreadGroup,其线程数可以通过work_thread_num配置来指定。每个ThreadGroup会关联一个boost asio的io_service(参见ThreadGroupImpl类的实现),以处理该io_service分派的各种事件。同时,io_service也作为构造参数传给RpcServerStream,这样网络连接与处理该连接上请求的ThreadGroup就关联起来了(线程模型图参见PPT第20页)。 需注意:原来的实现包括PPT中,每个RpcServer都只有一个ThreadGroup,即所有连接的请求处理共享一个ThreadGroup;而现在的实现通过IOServicePool维护了多个ThreadGroup,每个连接会选择与其中的一个ThreadGroup进行关联,选择策略采用round robin方式。这个不是我加的,不过我猜目的是为了提高性能。

所以:

如何保证大家都服务与一个io_service?在创建连接RpcServerStream的时候,构造函数参数传入同一个io_service。

如何保证多线程条件下,io_service不退出的?使用IOServiceWork(即boost::asio::io_service::work http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference/io_service__work.html ),具体参见ThreadGroupImpl::start()函数的实现。

希望我说明白了。

On Wed, Oct 19, 2016 at 10:39 AM, LazyPlanet notifications@github.com wrote:

Server底层是多个Service,Service下多线程? 作者如何保证大家都服务与一个io_service?并且如何保证多线程条件下,io_service不退出的? 多谢。

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/baidu/sofa-pbrpc/issues/126, or mute the thread https://github.com/notifications/unsubscribe-auth/AAgQPUNImR32bR5V_QtN4M-3cpohyeaUks5q1YLwgaJpZM4KagEF .

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

qinzuoyan commented 8 years ago

已经被改成md格式了: https://github.com/baidu/sofa-pbrpc/blob/master/doc/sofa-pbrpc-document.md PPT我直接附件传给你。

On Mon, Oct 24, 2016 at 10:06 AM, CaesarTang notifications@github.com wrote:

@qinzuoyan https://github.com/qinzuoyan 这个附件的链接不对。https://github.com/ baidu/sofa-pbrpc/blob/master/doc/inside-sofa-pbrpc.pptx

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/baidu/sofa-pbrpc/issues/126#issuecomment-255632922, or mute the thread https://github.com/notifications/unsubscribe-auth/AAgQPadgzpvgB7G751fYnGBIwVRDw3qSks5q3BKpgaJpZM4KagEF .