33
44连接池是客户端内的一个对象,主要是维持现有节点的连接。理论上来讲,节点只有死节点与活节点。
55
6- 然而在现实世界中,事情绝不这么明确 。有时候节点是处在 _“可能挂了但还未确认”_ 、 _“连接超时但未知原因”_ 或 _“最近挂过但现在可用”_ 的灰色地带中。而连接池的工作就是管理这些无规则的连接,并为客户端提供最稳定的连接状态。
6+ 然而在现实世界中,事情绝不会这么明确 。有时候节点是处在 _“可能挂了但还未确认”_ 、 _“连接超时但未知原因”_ 或 _“最近挂过但现在可用”_ 的灰色地带中。而连接池的工作就是管理这些无规则的连接,并为客户端提供最稳定的连接状态。
77
88如果一个连接池找不到一个活节点来发送查询,那么就会返回一个 `NoNodesAvailableException` 异常给客户端。这里跟最大重连次数(retry)有所不同。假如有这么一个例子:你的集群中可能有 10 个节点。你发送一个请求,其中有 9 个节点因为连接超时而请求失败。而第 10 个节点发送请求成功并成功执行请求。在上述例子中,前 9 个节点会被标记为死节点(连接池处于使用状态才会被标记),且它们的“死亡”定时器会启动生效。
99
1313
1414=== staticNoPingConnectionPool(默认)
1515
16- 连接池维持一个静态的hosts清单,这些hosts在客户端初始化时都被假定为活节点 。如果一个节点处理请求失败,那么该节点会被标记为死节点并持续 60 秒,而请求会发送到下一个节点。60 秒过后,节点则会再生并加入请求轮询中。每增加一次请求失败次数都会导致死亡时间以指数级别增长。
16+ 连接池维持一个静态的 hosts 清单,这些 hosts 在客户端初始化时都被假定为活节点 。如果一个节点处理请求失败,那么该节点会被标记为死节点并持续 60 秒,而请求会发送到下一个节点。60 秒过后,节点则会再生并加入请求轮询中。每增加一次请求失败次数都会导致死亡时间以指数级别增长。
1717
18- 请求成功一次后会重置"failed ping timeout"计数器。
18+ 请求成功一次后会重置 "failed ping timeout" 计数器。
1919
2020如果你想明确的设置连接池为 `StaticNoPingConnectionPool` ,你可能要在ClientBuilder对象中使用 `setConnectionPool()` 方法:
2121
@@ -30,7 +30,7 @@ $client = ClientBuilder::create()
3030
3131=== StaticConnectionPool
3232
33- `StaticConnectionPool` 除了要在使用前ping节点来确定是否为活节点 ,其它的特性与 `StaticNoPingConnectionPool` 一致。这可能对于执行时间较长的脚本比较有用,但这往往会增加额外开销,因为对一般的PHP脚本来说这是不必要的。
33+ `StaticConnectionPool` 除了要在使用前 ping 节点来确定是否为活节点 ,其它的特性与 `StaticNoPingConnectionPool` 一致。这可能对于执行时间较长的脚本比较有用,但这往往会增加额外开销,因为对一般的PHP脚本来说这是不必要的。
3434
3535使用 `StaticConnectionPool` 的方法:
3636
@@ -45,7 +45,7 @@ $client = ClientBuilder::create()
4545
4646=== SimpleConnectionPool
4747
48- `SimpleConnectionPool` 仅仅返回选择器(Selector)指定的下个节点信息,它不监测节点的“生死状态”。不管节点是活节点还是死节点,这种连接池都会返回节点信息给客户端。它仅仅是个简单的静态host连接池 。
48+ `SimpleConnectionPool` 仅仅返回选择器(Selector)指定的下个节点信息,它不监测节点的“生死状态”。不管节点是活节点还是死节点,这种连接池都会返回节点信息给客户端。它仅仅是个简单的静态 host 连接池 。
4949
5050`SimpleConnectionPool` 不建议常规使用,但是它是个有用的调试工具。
5151
@@ -62,7 +62,7 @@ $client = ClientBuilder::create()
6262
6363=== SniffingConnectionPool
6464
65- `SniffingConnectionPool` 与前面的两个静态连接池有所不同,它是动态的。用户提供 hosts 种子,而客户端则会嗅探这些 hosts 并发现集群的其余节点。 `SniffingConnectionPool` 通过Cluster State API来实现嗅探 。当集群添加新节点或删除节点,客户端会更新连接池的活跃连接。
65+ `SniffingConnectionPool` 与前面的两个静态连接池有所不同,它是动态的。用户提供 hosts 种子,而客户端则会嗅探这些 hosts 并发现集群的其余节点。 `SniffingConnectionPool` 通过 Cluster State API 来实现嗅探 。当集群添加新节点或删除节点,客户端会更新连接池的活跃连接。
6666
6767使用 `SniffingConnectionPool` 的方法:
6868
@@ -159,13 +159,13 @@ $client = ClientBuilder::create()
159159 ->build();
160160--------------------------------------------------
161161
162- === 选择什么连接池?PHP 和连接池的关系
162+ === 选择什么连接池?PHP 和连接池的关系
163163
164164初看觉得 `sniffingConnectionPool` 似乎比较高级。对许多语言来说当然如此。但是 PHP 则有些不同。
165165
166- 因为PHP是无共享架构 (share-nothing architecture),php脚本实例化后无法维持一个连接池 。这意味着每个脚本在重新执行时都要负责创建、维持和销毁连接。
166+ 因为 PHP 是无共享架构 (share-nothing architecture),php 脚本实例化后无法维持一个连接池 。这意味着每个脚本在重新执行时都要负责创建、维持和销毁连接。
167167
168- 嗅探是相对轻量的操作(调用一次API到 `/_cluster/state` ,然后ping每个节点),但是对于某些PHP程序来说 ,这可能是一笔不可忽视的开销。一般的PHP脚本可能会加载客户端 ,执行一些请求然后关闭。想象一下这个脚本每秒调用 1000 次: `SniffingConnectionPool` 会每秒执行嗅探和ping所有节点 1000 次。嗅探程序则会增加大量的开销。
168+ 嗅探是相对轻量的操作(调用一次API到 `/_cluster/state` ,然后 ping 每个节点),但是对于某些 PHP 程序来说 ,这可能是一笔不可忽视的开销。一般的 PHP 脚本可能会加载客户端 ,执行一些请求然后关闭。想象一下这个脚本每秒调用 1000 次: `SniffingConnectionPool` 会每秒执行嗅探和 ping 所有节点 1000 次。嗅探程序则会增加大量的开销。
169169
170170在实际中,如果你的脚本只是执行一些请求,用嗅探就太粗暴了。嗅探对于常驻进程来说往往更加有用。
171171
0 commit comments