设置Netty客户端并将其拆除是多么昂贵

时间:2014-08-13 13:41:26

标签: client netty

我正在构建一个应用程序,允许多个并发客户端针对分散在多个数据节点上的数据提交查询。

架构有三层:客户端(例如基于浏览器的客户端,命令行客户端,Java客户端)向中间层查询引擎提交请求。中间层查询引擎执行查询解析,查询计划并负责查询执行。查询执行涉及从数据层(在集群中运行的一组数据节点)中检索数据。

我使用Google Protocol Buffers来序列化查询请求以及中间层和数据层之间的结果集。我使用Netty NIO通过TCP套接字在中间层上运行的Netty客户端和运行在数据层上的Netty服务器(每个数据节点一个Netty服务器)之间发送GPB。

每个数据节点都有一个Netty服务器,用于接收来自中间层的请求并以结果进行响应。

在中间层中运行的每个查询并行地与每个数据节点对话。我可以执行N个同时查询,每个查询与M个数据节点通信。

我试图了解设置和拆除Netty客户端的成本是多少。这将帮助我决定在中间层组织Netty客户端时考虑的几种不同的架构选项。

选项1:每个查询都有自己的一组Netty客户端与数据节点通信。在此选项中,当我为给定查询设置查询执行时,我将实例化M Netty客户端(每个客户端代表该查询在与其中一个数据节点上运行的Netty服务器通信)。这意味着我已经设置了MxN Netty客户端实例,并在提交和完成查询时将其拆除。虽然这是概念上最简单的方法,但如果实例化Netty客户端的成本相当昂贵,那么这是不可行的。我担心通过设置M Netty客户端产生太多垃圾以及有点担心增加查询延迟。

选项2:在每个数据节点的中间层一个Netty客户端,并在查询之间共享该客户端。这意味着当中间层启动时,M Netty客户端将在中间层创建。在提交查询时,他们将共享该Netty客户端池,每个Netty客户端都需要在不同客户端之间复用请求和响应。对于Netty客户端来说,这是一个更复杂的设计(跟踪哪个响应对应于哪个查询),但会产生更少的垃圾,并且会给查询带来额外的延迟。

有没有人对选项1的价格有多大感觉?

2 个答案:

答案 0 :(得分:1)

只要您共享NioEventLoopGroup,设置和拆除客户端就非常便宜。这就是你应该记住的一切

答案 1 :(得分:0)

要创建Netty频道并建立连接,您需要以下内容:

  1. 创建一个事件循环
  2. 创建引导程序并对其进行配置
  3. 进行实际连接尝试
  4. 关闭频道
  5. 关闭事件循环
  6. 最昂贵的步骤是1和5.其他步骤非常便宜或非常接近使用原始NIO API。

    一个好消息是,每次连接尝试都不需要执行步骤1和步骤5。您可以创建一个事件循环,然后重复使用它,直到您的应用程序终止。您可以在应用程序终止时运行第5步。