Workerman的弹性伸缩依赖外部编排,通过单机垂直扩缩容(调整进程数)和多机水平扩缩容(增减服务器)实现,结合配置管理、负载均衡、监控与自动化工具(如Supervisor、Kubernetes HPA),在容器化环境下利用Docker和Kubernetes可高效实现动态扩缩容,核心挑战包括状态管理、连接优雅处理与资源瓶颈判断。

Workerman的弹性伸缩和动态扩缩容,本质上不是它自身内部的“魔法”,而更多是依赖于外部的编排和管理策略。在我看来,Workerman作为一个高性能的PHP socket框架,它提供了稳定运行的基础,而真正的“弹性”则需要我们结合系统架构、监控和自动化工具去实现。核心思想就是根据业务负载的变化,灵活地调整Workerman进程的数量,或者增减承载Workerman实例的服务器资源。
要实现Workerman的弹性伸缩,我们通常会从两个层面入手:单机内的垂直扩缩容和多机间的水平扩缩容,并最终通过自动化手段实现动态管理。
1. 单机垂直扩缩容: 这主要是指在单个服务器上调整Workerman进程的数量。Workerman的
Worker
count
$worker = new Worker('websocket://0.0.0.0:2346');
$worker->count = 4; // 初始设定4个进程要实现动态调整,我们不能直接修改代码然后重启。常见的做法是:
count
reload
restart
reload
2. 多机水平扩缩容: 这是更具弹性的方式,通过增加或减少运行Workerman实例的服务器数量来应对负载。
upstream workerman_backend {
server 192.168.1.101:2346;
server 192.168.1.102:2346;
# server 192.168.1.103:2346 down; # 动态增减
}
server {
listen 80;
location / {
proxy_pass http://workerman_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}3. 动态扩缩容的自动化实现: 这是将上述手动操作自动化、智能化,使其能够根据实际负载自动调整。
supervisorctl reload
systemctl restart
在我多年的实践中,Workerman的扩缩容,尤其是动态扩缩容,并非没有门槛。它有几个核心挑战,是我们设计和实施时必须深思熟虑的:
onWorkerStop
在我看来,容器化技术,尤其是Kubernetes,是实现Workerman弹性伸缩和动态扩缩容的“最佳实践”。它提供了一套完整的生态系统,极大地简化了部署、管理和伸缩的复杂性。
Docker化Workerman应用: 第一步是将你的Workerman应用打包成Docker镜像。这确保了应用及其运行环境的一致性,无论部署在哪里,都能以相同的方式运行。一个典型的
Dockerfile
# 使用官方PHP镜像作为基础
FROM php:8.1-fpm-alpine
# 安装必要的扩展和依赖
RUN apk add --no-cache git \
&& docker-php-ext-install pcntl pdo_mysql sockets \
&& rm -rf /var/cache/apk/*
# 设置工作目录
WORKDIR /app
# 复制Workerman应用代码
COPY . /app
# 安装Composer依赖
RUN composer install --no-dev --optimize-autoloader
# 暴露Workerman监听的端口(例如WebSocket端口)
EXPOSE 2346
# 定义容器启动时执行的命令
# 这里我们直接启动Workerman的start.php,并让它在前台运行
# 注意:Workerman的进程数可以在start.php中通过环境变量或配置文件动态设置
CMD ["php", "start.php", "start", "-d"]通过Docker,你的Workerman应用变成了一个可移植的单元,可以在任何支持Docker的环境中运行。
Kubernetes部署策略: Kubernetes提供了强大的编排能力,让Workerman的弹性伸缩变得非常简单。
apiVersion: apps/v1
kind: Deployment
metadata:
name: workerman-app
spec:
replicas: 3 # 初始启动3个Workerman Pod
selector:
matchLabels:
app: workerman
template:
metadata:
labels:
app: workerman
spec:
containers:
- name: workerman-container
image: your-repo/workerman-image:latest # 你的Docker镜像
ports:
- containerPort: 2346
resources: # 定义资源请求和限制,对HPA很重要
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
lifecycle:
preStop: # 优雅关闭hook
exec:
command: ["/bin/sh", "-c", "sleep 10 && kill -TERM 1"] # 给予Workerman 10秒处理现有连接LoadBalancer
NodePort
apiVersion: v1
kind: Service
metadata:
name: workerman-service
spec:
selector:
app: workerman
ports:
- protocol: TCP
port: 80 # 外部访问端口
targetPort: 2346 # Workerman容器内部端口
type: LoadBalancer # 或者 NodePortapiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: workerman-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: workerman-app
minReplicas: 2 # 最少2个Pod
maxReplicas: 10 # 最多10个Pod
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # 当CPU利用率超过70%时扩容
# - type: Resource # 也可以基于内存
# resource:
# name: memory
# target:
# type: AverageValue
# averageValue: 200Mi
# - type: Pods # 或者基于自定义指标,如消息队列长度
# pods:
# metric:
# name: messages_in_queue # 自定义指标名称
# target:
# type: AverageValue
# averageValue: 100 # 当每个Pod平均消息队列长度超过100时扩容通过HPA,Kubernetes能够根据Workerman应用的实际负载,自动增加或减少Pod数量,从而实现真正的弹性伸缩。此外,Kubernetes的滚动更新、服务发现、健康检查等功能也为Workerman的稳定运行提供了坚实保障。
preStop
即使没有Docker和Kubernetes,我们依然可以采用一些传统但有效的方法来实现Workerman的动态扩缩容,但这通常需要更多的手动配置和脚本编写。
多服务器部署与负载均衡: 这是最基本的水平扩容方式。你需要在多台物理机或虚拟机上分别部署Workerman应用。
部署Workerman实例: 在每台服务器上,按照常规方式安装PHP环境、Workerman依赖,并启动你的Workerman应用。确保每台服务器上的Workerman都监听相同的端口。
配置负载均衡器: 使用Nginx、HAProxy或其他专业的硬件/软件负载均衡器作为入口。这些负载均衡器负责将客户端请求分发到后端多台Workerman服务器上。
Nginx作为反向代理:
# Nginx upstream 配置
upstream workerman_servers {
server 192.168.1.101:2346 weight=1; # 后端Workerman服务器1
server 192.168.1.102:2346 weight=1; # 后端Workerman服务器2
# server 192.168.1.103:2346 down; # 需要扩容时,手动或脚本添加
# server 192.168.1.104:2346 backup; # 备份服务器
keepalive 64; # 保持与后端服务器的连接
}
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://workerman_servers;
proxy_http_version 1.1; # 对于WebSocket,需要HTTP/1.1
proxy_set_header Upgrade $http_upgrade; # 升级协议头
proxy_set_header Connection "Upgrade"; # 保持长连接
proxy_set_header Host $host;
proxy_read_timeout 300s; # 长连接超时时间
}
}在需要扩容时,你可以通过修改Nginx配置文件,添加新的
server
nginx -s reload
HAProxy配置: HAProxy在长连接和TCP层负载均衡方面表现出色。
frontend workerman_frontend
bind *:80
mode http # 或 tcp
default_backend workerman_backend
backend workerman_backend
mode http # 或 tcp
balance roundrobin # 负载均衡算法
server workerman_server_1 192.168.1.101:2346 check # 健康检查
server workerman_server_2 192.168.1.102:2346 check
# server workerman_server_3 192.168.1.103:2346 check disabled # 扩容时启用HAProxy同样可以通过修改配置文件并重启或重新加载来实现后端服务器的动态调整。
进程管理工具与脚本自动化: 在单机或多机环境下,你可以结合进程管理工具和自定义脚本来实现一定程度的自动化。
numprocs
[program:workerman] command=php /path/to/workerman/start.php start -d numprocs=4 # 初始进程数 autostart=true autorestart=true redirect_stderr=true stdout_logfile=/var/log/workerman.log
numprocs
supervisorctl update
supervisorctl reload workerman
以上就是Workerman怎么进行弹性伸缩?Workerman动态扩缩容?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号