背景
公司要做给支付宝对接物流轨迹推送,现有订单量为3000万,轨迹为3亿。
实现逻辑与思路
不停调用php脚本,抓取物流轨迹信息并发送给支付宝
设置文件存储抓取时间,根据时间点查库。根据时间点查询为排他性资源,无法同时运行多个进程。并且查询到到数据与支付宝所需数据之间还需要调用其他数据接口,顺序执行在2秒左右
- 思路
使用消息队列,将创建消息与发送消息拆分- 抓取轨迹信息,并存入redis(rpush)速度极快,实测并发量过千。生产者满足并发量需求
- 消费者读取redis(lpop)队列,无排他性。可开启多个进程同时运行
sh不停调用php脚本,生产消息,消费消息。消费端运行多个进程,以提高并发量
- 生产者脚本
#!/bin/bash
exec_path=<code>pwd</code>
while true
do
for i in {1..1}
do
exec_command="ps -ef | grep '$exec_path/producer.php $i\$' | grep -v grep | wc -l"
count=$(eval $exec_command)
if [ $count -lt "1" ];then
nohup /usr/bin/php $exec_path/producer.php $i > /dev/null &
fi
done
sleep 1
done
# ps -ef | grep '$exec_path/producer.php $i\$' | grep -v grep | wc -l 查询运行中进程书
# if [ $count -lt "1" ]; 如果进程数小于1,则执行then
# sleep 1 1毫秒
# nohup linux命令,输出内容存储到nohup.out文件中
# /usr/bin/php $exec_path/producer.php $i $i给进程做标记
# > /dev/null 不输出内容
# & 并行shell命令
- 消费者脚本
#!/bin/bash
exec_path=<code>pwd</code>
while true
do
for i in {1..150}
do
exec_command="ps -ef | grep '$exec_path/mails_start.php $i\$' | grep -v grep | wc -l"
count=$(eval $exec_command)
current_cpu=0
let "current_cpu=i % 8"
if [ $count -lt "1" ];then
nohup taskset -c $current_cpu /usr/bin/php $exec_path/mails_start.php $i > /dev/null &
fi
done
sleep 1
done
# for i in {1..150} 运行150次,$i 为1-150
# taskset -c $current_cpu 指定cpu核心运行
批量杀死消费脚本
ps -ef | grep mails_start.php | awk '{print $2}'|xargs kill -9
- mac 查看cpu个数命令
sysctl hw.physicalcpu #物理cpu个数
sysctl hw.logicalcpu #逻辑cpu个数
system_profiler SPHardwareDataType #硬件信息总揽
- 对cpu使用率不超过30%对限制,防止支付宝接口故障导致对cpu暴涨
sudo atop # 各种系统资源的综合(cpu,memory,network,i/o...)
top