我有一个使用赛璐珞的 JRuby 应用程序。它通过 Zeromq 套接字接收请求并以 JSON 字符串响应。
因此,我的应用程序中有 2 个参与者,一个用于处理请求,另一个用于发送响应(Zeromq 中的推送套接字)。应用程序以大约 30 个请求/秒的速度接收请求,未来会更多,例如 1000 个/秒。但是随着每秒请求数量的增加,处理需要更多时间。它开始使用更多的 CPU。
对于每个收到的请求,我都在 defer 块内处理它。
defer {
response = ResponseHandler.new(socket,message).start
send_response(response)
}
对于 20 个请求/秒,它可以正常工作,没有任何延迟。该服务器具有 15Gb RAM 和 4 个内核的配置。它还连接到 Postgres DB 和 Redis DB。但这似乎不是问题。
这是我的基本结构,有主要参与者服务,
supervisor = Service.supervise
这在内部创建了带有 10 个池的 PushSock Actor 实例。
@pushsocket_actor = PushSock.pool(size: 10)
上面 defer 块中的 send_response 方法调用 pushsocket actor。在延迟块 ResponseHandler 不是一个演员。
因此,对于 Service Actor,我没有使用池。