【Azure Redis】PHPRedis遇见SSL Connection Timeout问题

问题描述

PHP Redis客户端遇见使用SSL Connection timeout,遇见问题后,切换回去Non-SSL没有出现问题。但是切换回SSL后,还是偶尔遇见Connection timeout问题。

目前timeout设置时间为5秒,并且为例重用连接,启用了持久化 redis.pconnect.pooling_enabled为1.

是否有办法来缓解Timeout问题呢?

 

问题解答

因为Redis推荐尽可能使用TLS V1.2加密通信,所以为例应用安全,还是需要使用SSL Connection,不能使用non-SSL。

焦距在PHP Redis的客户端配置上,根据如下情景发生的可能性,在解释发生Timeout的情况后,增大 Timeout 的设置为一个有效的解决方案。

请求/响应过大可能导致超时。

  1. 假设客户端上配置的超时值为 5 秒。
  2. 应用程序(使用相同的物理网络连接)的同时请求两个键 (例如,A 和 B)。
  3. 大多数客户端支持对请求进行“管道操作”,使得请求“A”和“B”可以逐个发送,而无需等待响应。
  4. 服务器会按相同顺序将响应发送回来。
  5. 如果响应“A”较大,可能会消耗掉后续请求的大部分超时时间。

 

在以下示例中,请求“A”和“B”快速发送到服务器。 服务器开始快速发送响应“A”和“B”。 由于数据传输需要时间,即使服务器的响应速度很快,响应“B”也必须等到响应“A”超时。

|-------- 5 秒超时时间(A) -----------|
|- A 请求 -|
~~~~~|-------- 5 秒超时时间(B) -----------|
~~~~~|- B 请求 -|
~~~~~~~~~~|- 读取A请求的响应 ---|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|- 读取 B 请求的响应 -| (**超时**)

 

所以,当发生Timeou的情况后,最有效的解决办法就是适当增加Timeout时间。

 

参考资料

Connection Parameters :https://github.com/predis/predis/wiki/Connection-Parameters

重用连接

在 PHP 客户端中遇到的最常见问题是它们要么不支持持久连接,要么默认禁用重用连接的能力。

当不重用连接时,意味着每次发送请求时都要支付建立新连接的成本,包括 SSL/TLS 握手。这会给请求时间增加大量延迟,并且会在应用程序中表现为性能问题.

此外,如果您的请求速率很高,这会在 Redis 客户端和服务器端都产生大量的 CPU 消耗,从而导致其他问题。 例如,Predis Redis 客户端有一个默认为 false 的“persistent”连接属性。将“persistent”属性设置为 true 将大大改善超时或性能问题。

开发最佳实践:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-best-practices-development#large-request-or-response-size

 

/end/

posted @ 2024-01-22 21:27  路边两盏灯  阅读(65)  评论(0编辑  收藏  举报