所有你说知道的工具相当于手里的卡牌,在写项目的时候你了解更多的卡牌就能更快的解决项目中遇到的问题。
实际项目需求:同步更新多家亚马逊店铺的订单信息。保证1分钟更新一次。
解决方案这里我分版本介绍.
解决方案 v1.0
店铺少的时候 便于项目快速上线 .采用了直接liunx 定时 执行PHP脚本. 每一分钟轮训所有店铺信息去查询。
优点:
速度快,直接调用数据库轮询店铺信息即可完成订单同步
缺点:
如果一个店铺调用失败,后续任务终止,导致后面剩余更新的店铺订单信息始终无法同步
解决方案 v2.0
使用PHP多进程方案解决。例如10个店铺,查询出来。创建10个不同进程分别更新店铺订单信息。完美解决因为单个店铺失败导致的程序终止。
优点:
速度快,可同时处理多个店铺。保证数据同步。
缺点:
店铺数量不多的时候,能够正常执行。如果有成千上万个店铺。那将会产生成千上万个进程。会导致系统崩溃。
解决方案 v3.0
使用rabbitmq消息中间件。 每一分钟添加需要更新的店铺信息进入队列。调度消费者进行订单同步。
优点:
速度快,可同时处理多个店铺。同时保证每个店铺都能更新,保证数据同步。同时前端用户可异步调用。
缺点:
如果单个店铺更新出现问题,会导致消费者进程终止。
(解决办法:创建liunx守护进程。这里写了一个shell脚本 每一分钟执行一次,判断当前工作运转的消费者进程数量,如果数量达不到预定的数量,马上开启新进程.)
其实PHP也能写出守护进程的脚本
结合上面实例,我们由PHP来创建进程,并保存pid。然后每隔一段时间来轮训判断这些pid是否还存在,如果异常终止了 我们就重新创建一个新的进程来代替挂掉的进程。
下面贴出守护shell脚本
#!/bin/bash
time=$(date "+%Y-%m-%d %H:%M:%S")
echo -e "${time}\n";
alive=`ps aux|grep 任务名称|grep -v grep|wc -l` #判断当前任务的进程数量
if [ $alive -le 1 ] #当消费者数量小于1时
then
int=1;
while(( $int<=5 )) #运行5个新消费者
do
nohup 需要执行的脚本路径
let "int++"
done
fi