技术文章 > 服务端 > pomelo 内置组件 

Pomelo 内置组件(builtin components)

Pomelo 的应用程序执行过程,就是对其相应组件生命周期的管理,而实际上所有的逻辑功能均由 Pomelo 组件提供。Pomelo 框架内建并提供了十多个组件,这些组件用于不同的负载服务器,并提供了各种功能,包括:
  1. Master
  2. Monitor
  3. Connector
  4. Session
  5. Connection
  6. Server
  7. PushScheduler
  8. Proxy
  9. Remote
  10. Dictionary
  11. Protobuf
  12. Channel
  13. BackendSession

1. Master

Master 组件仅由主服务器加载,其主要功能包括:启动所有应用服务器、管理和监控所有应用服务器、接收管理客户的请求并进行响应。
在 Master 的 start 方法中,会根据用户提供的服务器配置信息,启动具体的应用服务器。
当 Master 的 start 方法调用完成后,它会在所配置的端口上启动用户连接监听。还会注册、收集应用服务上报的监控信息,向应用服务器发送控制命令,及处理管理客户的请求。管理客户端(如 Pomelo-cli)可能会发一些管理请求,包括查看某个服务器的进程状态、增加或停用服务器等。这时,管理客户端会发送请求命令,而 Master 会根据请求参数做出处理,并广播通知已启动的服务器。
配置选项:无
回顶部

2. Monitor

Monitor 会被所有服务器加载,包括主服务器。其主要功能是,建立一个与主服务器的连接,并对整个应用服务器集群进行管理和监控。
Master 服务器也会加载 Monitor,因为它也会收集其自身的监控信息。可以认为 Master 和 Monitor 是对等组件,Monitor 会接收 Master 的命令,并收集一些周期性的监控信息。
Pomelo 提供了两种信息收集方式:pull 和 push。pull 方式要求 Master 定期与 Monitor 通讯,以拉取对应的监控信息;push 方式则是由 Monitor 主动的定期向 Master 上报监控信息。
配置选项:无
回顶部

3. Connector

Connector 组件是一个重量级的组件,它依赖于 session 组件、server 组件、pushScheduler 组件、和 connection。connector 组件只会被前端服务器加载,主要用于管理客户端连接。connector 组件会创建底层传输连接器,监听前端服务器所配置的 clientPort 端口,绑定相关事件到客户端请求及与之相关的处理器(Handler)。
当客户端建立连接或发送请求时,connector 组件会接收,并需要 session 组件来创建并维护 session 信息。然后,connector 组件还会使用 connection 组件来统计连接信息。最后,将拿到的 session 及客户端请求一起发送给 server 组件。
当 server 组件处理完成请求后,又会通过 connector 组件将响应信息返回给客户端。在返回响应的时候,connector 组件会做一个缓存选择,这个缓存实现依赖于 pushScheduler 组件,也就是说 connector 组件并不直接向客户端返回信息,而是将响应交给 pushScheduler 组件。
pushScheduler 组件会根据相应的调度策略处理响应信息。当不使用缓存时,会通过 session 组件所维护的连接,直接将响应发送给客户;当使用缓存时,pushScheduler 组件会缓存响应并按时冲刷(flush)响应信息。

配置选项
Connector 组件的配置方式如下:
app.set('connectorConfig', opts);
回顶部

4. Session

Session 组件与 Connector 组件相关,仅会被前端服务器加载,它是对 sessionService 封装。
Session 组件加载后,会添加一个 sessionService 到当前应用,可以通过 app.get ('sessionService') 来获取它。其主要用于维护客户端连接,及创建和维护 session。与经典的 TCP 会话相比,session 中维护的会话可以认为是“服务端访问后所返回的 socket ”。
一个 session 会与一个连接相对应。同时,Session 组件还会维护用户与连接的绑定,即用户登录后绑定用户与 session。用户可能会通过多个客户端登录,并对应多个 session,当需要给客户端发送消息或返回响应时,就必须通过 session 组件获取与之对应的客户端连接。

配置选项
  Session 组件的配置方式如下:
app.set('sessionConfig', opts);
回顶部

5. Connection

Connection 组件是一个相对简单的组件,它同样只会被前端服务器加载,它是对 connectionService 组件的封装,其主要用于连接信息的统计。Connector 组件在接收到用于连接,或用户下线时,都会 Connection 组件汇报。
配置选项:无
回顶部

6. Server

Server 组件也是一个功能较为复杂的组件,它会被除主服务器外的所有服务加载。Server 组件加载后,会创建并维护其自身的 Handler 及 Filter。
Server 组件有两种请求处理方式:对于来自前端服务器的请求,Server 组件会从 connector 组件的回调中获取相应的客户端请求或通知,然后使用自已的 beforeFilter 对消息进行过滤,再调用自已的 Handler 对请示进行逻辑处理,再将响应通过回调的方式发送给 connector 处理,最后调用 afterFilter 进行一些清理工作;当请求是发向后端服务器时,请示也会通过前端服务器接收,但前端服务器不会处理,而是通过 RPC 调用将请求发送到后端服务器。
对于后端服务器来说,请求信息并不是直接来自于客户端,而是来自于前端服务器的 sys rpc 调用。这个 RPC 调用就是 Pomelo 内建的 "msgRemote",在 msgRemote 的实现中,会将来自前端服务器的 sys rpc 分发到后端服务器的 server 组件,然后后端服务器会使用“请求处理链”进行处理。处理完成后,再通过 rpc 调用将响应信息返回给前端服务器。
前端服务器向后端服务器分发请求时,一般会有多个同类型的后端服务器,因此会需要一个路由策略 router。用户可以能过 Application.route 配置到后端服务器的 router。

配置选项:无
回顶部

7. PushScheduler

PushScheduler 也是一个功能相对简单的组件,它只会被前端服务器加载,它与 Connecter 组件紧密相关。当 connecter 组件收到 server 组件的响应或推送的消息时后,connecter 组件并不会直接将消息返回给客户端,而是将其发送给 pushScheduler 组件。pushScheduler 组件再通过 session 组件获取客户端连接,再将响应发送给客户端。

配置选项 pushScheduler 配置方式如下:
app.set('pushSchedulerConfig', opts);
如果要使用缓冲 scheduler,可以在 app.js 中做如下配置:
app.set('pushSchedulerConfig', {
	scheduler: pomelo.pushSchedulers.buffer, 
	flushInterval: 20
  });
其中 flushInterval 是刷新周期,默认为 20 毫秒。
回顶部

8. Proxy

Proxy 是一个重量级组件,它会被除主服务器外的所有服务器所加载。Proxy 组件会扫描服务器的目录,并提取其中的 remote 部分,由于 JavaScript 语言的动态性,可以很简单的获取到 remote 中关于远程调用的元素,然后生成 stub 并将这些调用都挂到 app.rpc 下。当用户发起 rpc 调用时,proxy 组件会检查其扫描到的 stub 信息,以此判断调用是否合法。
同时,Proxy 组件还会创建一个 RpcClient,当发起远程调用时,其负责与 remote 进行通讯,并得到远程调用结果供调用者使用。
当进行远程调用时,由于同类型的远程服务器可能有多个,所以这里同样需要配置相应的 router。

配置选项 Proxy组件配置方式如下:
app.set('proxyConfig', opts);
还可以通过以下方式开启 rpc 调用日志:
app.enable('rpcDebugLog');
回顶部

9. Remote

Remote 组件是 Proxy 的一个对等组件,它会被除主服务器外的所有服务器所加载,它用于提供 RPC 远程服务。Remote 组件会载入当前服务器中所有的远程 handler,并在所配置的端口上启动监听,然后等待 RPC 客户端的 RPC 调用。
当收到调用时,会根据调用请求中的描述信息调用 remote 中相应的方法。调用完成后,将处理结果返回给 RPC 客户端。
RPC 服务端还支持对调用请求的过滤,和 server 组件处理客户端请求一样,RPC 服务端也会使用 filter-remote 链进行处理。

配置选项 Remote 组件配置方式如下:
app.set ('remoteConfig', opts);
回顶部

10. Dictionary

Dictionary 组件是一个可选组件,它默认不会被加载,只有当 connetor 组件配置并启用了 useDict 时才会被加载。Dictionary 会遍历所有 handler 的 route 字符串,还会从 config/dictionary.json 中读取所有客户端的 route 字符串,然后对这些字符串编码并分配一个唯一的整数,以实现 route 的压缩。压缩后,客户端与服务端通讯时,路由将不再是那长字符串,而是所分配的小整数。

配置选项
Dictionary组件配置方式如下:
app.set('dictionaryConfig', opts);
回顶部

11. Protobuf

Protobuf 组件也是一个可选组件,默认不会加载,只有当 useProtobuf 组件配置并启用了 useDict 时才会被加载。该组件会加载对应的 proto 文件,并对消息基于 protobuf 进行编解码。默认的 proto 文件的配置信息在 config/serverProtos.json 和 config/clientProtos.json 中。

配置选项:无
回顶部

12. Channel

Channel 组件用于维护 channel 信息,它会被除主服务器外的所有服务器加载,该组件是对 channelService 的一个包装,在 Channel 加载后,可以通过 app.get('channelService') 来获取 channelService。
channel 可以认为一个用户的集合,每个用户会对应前端服务器的一个或多个 session。可以通过 Channel 组件向 channel 中的所有用户推送消息。由于前端服务器并不直接与客户端相连,所以后端服务器会发起一个 sys rpc 调用,接收这个远程调用的是 Pomelo 中的 ChannelRemote。

配置选项 Channel组件配置方式如下:
app.set('channelConfig', opts);
回顶部

13. BackendSession

BackendSession 组件会被除主服务器外的所有服务器加载,它是对 BackendSessionService 组件的封装。该组件加载后,会在应用的上下文中加入 backendSessionService,可以通过 app.get('backendSessionService') 来获取、调用组件。它通常是为后端服务器提供和维护 BackendSession 信息,并通过前端服务器的 RPC 调用,完成一些对原始 session 的操作,如绑定 uid 等。
回顶部


来源:摘自 https://github.com/NetEase/pomelo/wiki/%E7%BB%84%E4%BB%B6%E6%A6%82%E8%BF%B0,本站 行痴 整理