php和redis之间的高流量连接

Posted

技术标签:

【中文标题】php和redis之间的高流量连接【英文标题】:High traffic connection between Php and Redis 【发布时间】:2016-06-20 15:40:29 【问题描述】:

我有 php 后端,可与 Redis 一起使用。

但是当请求增加并且每秒超过 2000 个请求时,我收到一个错误:

99 - Cannot assign requested address

TIME_WAIT 中的所有套接字。


连接示例:

$this->_socket = @stream_socket_client(
    'tcp://' . $this->hostname . ':' . $this->port,
    $errorNumber,
    $errorDescription,
    ini_get('default_socket_timeout'),
    STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT
);

我找到了解决方案:http://redis4you.com/articles.php?id=012&name=redis

但是 /proc/sys/net/ipv4/tcp_tw_recycle 我不能在 1 中设置。 不想在应用程序和redis之间的网络上丢包。

根据 API 的新请求,PHP 创建一个新套接字。

有什么想法吗?

【问题讨论】:

你可以使用同一个套接字发送多个请求吗? 如何使用同一个套接字发送多个请求? redis.io/topics/pipelining 这个PHP页面是被不同的客户端调用的吗? 是和不是。它可以调用不同的客户端。 【参考方案1】:

我不知道你的整个设计,但在这里你可以做点什么:

创建一个始终运行的 PHP 页面(带有 while(true) 循环) 此页面将等待您的初始页面中的内容(之前的套接字代码) 使用流水线技术,您可以使用同一个套接字发送所有请求。 唯一缺少的是如何将数据从初始页面传递到这个新页面。

对于最后一部分,我看到了多种解决方案(但不确定它们是否都有效):

使用 APC 存储来自初始页面的数据,并仍然使用它从新页面获取数据。 在新页面中创建一个会话,该页面将具有两种模式:处理、提交。然后,您应该在初始页面中使用本地服务器调用此页面。

在这两种解决方案中,此新页面的一个实例应在本地执行,以便激活“处理/等待”。

【讨论】:

【参考方案2】:

已解决问题。 在 10 秒内对套接字集使用 tcp reuce 和 time waite。 php 在持久模式下使用套接字

STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT

因此,即使每秒 2 000 个请求,它也使用不超过 61 个套接字。

【讨论】:

以上是关于php和redis之间的高流量连接的主要内容,如果未能解决你的问题,请参考以下文章

在高流量环境中使用 kafka producer 时的连接管理

报告老板,微服务高可用神器已祭出,您花巨资营销的高流量来了没?

面向大规模流量活动的高可用架构实践

php高并发,大流量

面向大规模流量活动的高可用架构实践

面向大规模流量活动的高可用架构实践