# 服务网格的组件

> 检查不同的Grid组件以了解如何使用它们.

URL: https://deploy-preview-2974--selenium-dev.netlify.app/zh-cn/documentation/grid/components/

---

Selenium Grid 4 是对以前版本的彻底重写。除了对性能和标准合规性进行全面改进外，还分解了 `Grid` 的不同功能以反映更现代的计算和软件开发时代。 Selenium Grid 4 专为容器化和云分布式可扩展性而构建，是现代时代的全新解决方案。

![Selenium Grid 4 Components](/images/documentation/grid/components.png)

## 路由器（Router）

**路由器** 是 Grid 的入口点，接收所有外部请求，并将它们转发给正确的组件。

如果**路由器**收到新的会话请求，它将被转发到**新会话队列**。

如果请求属于一个已经存在的session，**路由器**会查询**Session Map**得到session运行所在的**Node** ID，然后将请求直接转发给**Node**。

**路由器**通过将请求发送到能够更好地处理它们的组件来平衡网格中的负载，而不会使过程中不需要的任何组件过载。

## 分发器（Distributor）

**分发器**有两个主要职责：

#### 注册并跟踪所有Node及其功能

**Node**通过**事件总线**发送**Node**注册事件来注册到**分发器**。**分发器**读取它，然后尝试通过 HTTP 到达**Node**以确认它的存在。如果请求成功，**Distributor**注册节点并通过 **GridModel** 跟踪所有**Node**功能。

#### 查询新会话队列并处理任何未决的新会话请求

当一个新的会话请求被发送到**路由器**时，它被转发到**新会话队列**，它将在队列中等待。 **Distributor** 将轮询**新会话队列**以查找未决的新会话请求，然后找到可以创建会话的合适**Node**。会话创建后，**分发器**将会话 ID 与正在执行会话的**Node**之间的关系存储在**会话映射**中。

## 会话映射（Session Map）

**会话映射** 是一个数据存储，用于保存会话 ID 和运行会话的**Node**之间的关系。它支持**路由器**在将请求转发到**Node**的过程中进行查询。**路由器**将向**会话映射**询问与会话 ID 关联的**Node**。

## 新会话队列（New Session Queue）

**新会话队列**按先进先出的顺序保存所有新会话请求。它具有可配置的参数，用于设置请求超时和请求重试间隔（检查超时的频率）。

**路由器**将**新会话请求**添加到**新会话队列**中并等待响应。**新会话队列**定期检查队列中是否有任何请求超时，如果是，则立即拒绝并将其删除。

**分发器**定期检查是否有可用的插槽。如果有可用的插槽，则**分发器**会轮询**新会话队列**以查找第一个匹配的请求。然后，**分发器**尝试创建**新会话**。

一旦请求的功能与任何空闲**Node**插槽的功能匹配，**分发器**将尝试获取可用插槽。如果所有插槽都已忙碌，则**分发器**将将请求发送回队列。如果请求在重试或添加到队列的前面时超时，则会被拒绝。

成功创建会话后，**分发器**将会话信息发送到**新会话队列**，该信息然后被发送回**路由器**，最终发送给客户端。

## 节点（Node）

一个`Grid`可以包含多个**Node**。每个**Node**管理它所在机器上可用浏览器的插槽。

**Node**通过**事件总线**向**分发器**注册自己，并将其配置作为注册消息发送。

默认情况下，**Node**会自动注册其所在机器上路径中可用的所有浏览器驱动程序。它还为基于Chromium的浏览器和Firefox创建每个可用CPU一个插槽。对于Safari，只创建一个插槽。通过特定的[配置](https://deploy-preview-2974--selenium-dev.netlify.app/zh-cn/documentation/grid/configuration/index.md)，它可以在Docker容器中运行会话或转发命令。

**Node**仅执行接收到的命令，不评估、不做出判断或控制任何除命令和响应流之外的东西。**Node**所在的机器不需要与其他组件具有相同的操作系统。例如，Windows节点可能具有在Edge上提供IE模式作为浏览器选项的能力，而在Linux或Mac上则不可能，网格可以配置多个具有Windows、Mac或Linux的**Node**。

## 事件总线（Event Bus）

**事件总线**作为**节点**、**分发器**、**新会话队列**和**会话映射**之间的通信路径。`Grid` 的大部分内部通信都通过消息进行，避免了频繁的HTTP调用。在完全分布式模式下启动`Grid` 时，**事件总线**应该是第一个组件。

> **运行自己的Grid**
>
> 想要使用所有这些组件并运行自己的网格？请前往["入门"](https://deploy-preview-2974--selenium-dev.netlify.app/zh-cn/documentation/grid/getting_started/index.md)部分了解如何将所有这些部分组合在一起。
