背景

公司要做给支付宝对接物流轨迹推送,现有订单量为3000万,轨迹为3亿。

实现逻辑与思路

不停调用php脚本,抓取物流轨迹信息并发送给支付宝
设置文件存储抓取时间,根据时间点查库。根据时间点查询为排他性资源,无法同时运行多个进程。并且查询到到数据与支付宝所需数据之间还需要调用其他数据接口,顺序执行在2秒左右

  • 思路
    使用消息队列,将创建消息与发送消息拆分

    1. 抓取轨迹信息,并存入redis(rpush)速度极快,实测并发量过千。生产者满足并发量需求
    2. 消费者读取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
Scroll to Top