Php 重复数据消除Laravel事件/作业

Php 重复数据消除Laravel事件/作业,php,mysql,laravel,redis,laravel-4.2,Php,Mysql,Laravel,Redis,Laravel 4.2,我有一个应用程序,可以处理产品和订单更新,并混合使用事件和作业来响应其中任何一项的更改 经过近2年的研究和观察,我发现最大的瓶颈是任何其他互联系统发送重复事件(从而导致重复作业等)的时间 在正常操作下,这很好,我们有足够的空闲时间来适应峰值,但当它变得非常繁忙时,它可能会滚雪球,并导致未处理事件和作业的积压 Im使用的安装程序是Laravel 4.2和MySQL(mariadb)的标准安装。MySQL是一个redis支持的队列,用于处理作业和事件,具有多个队列,用于处理不同类型的事件(产品库存更

我有一个应用程序,可以处理产品和订单更新,并混合使用事件和作业来响应其中任何一项的更改

经过近2年的研究和观察,我发现最大的瓶颈是任何其他互联系统发送重复事件(从而导致重复作业等)的时间

在正常操作下,这很好,我们有足够的空闲时间来适应峰值,但当它变得非常繁忙时,它可能会滚雪球,并导致未处理事件和作业的积压

Im使用的安装程序是Laravel 4.2和MySQL(mariadb)的标准安装。MySQL是一个redis支持的队列,用于处理作业和事件,具有多个队列,用于处理不同类型的事件(产品库存更新、订单调度等)

我想知道是否有人可以建议一种方法来防止laravel添加与同一动作相关的事件和/或作业

工作的一个例子是:

{
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"data": {
    "commandName": "Staw\\Magento\\Jobs\\AddTrackingNumber",
    "command": "O:40:\"Staw\\Magento\\Jobs\\AddTrackingNumber\":6:{s:17:\"\u0000*\u0000trackingNumber\";s:14:\"[Tracking Number]\";s:14:\"\u0000*\u0000orderNumber\";s:19:\"[Order NUmber]\";s:10:\"connection\";N;s:5:\"queue\";s:8:\"despatch\";s:5:\"delay\";N;s:6:\"\u0000*\u0000job\";N;}"
},
"id": "xGmsi6vo458cYGeJHDfpGCZG8QuAJXB7",
"attempts": 1
}
和事件侦听器(来自事件)


我知道我可以使用predis/predis软件包搜索redis,但这似乎很麻烦,我考虑过在DB上创建自己的队列/堆栈,以便更好地控制事情,但这似乎是一项艰巨的任务,我觉得我会错过使用stock Laravel设置时获得的一些功能。

解决方法是,它可能涉及应用程序结构的更改。在放入队列之前,您应该创建一个表来记录作业信息,例如作业id、作业名称、作业数据等。当队列工作者处理作业时,作业处理程序应查找表,查看是否存在重复作业。如果是,请立即终止作业。它对事件也应该如此

有许多实现:

  • 对于Laravel 4,修改所有作业处理程序的
    fire
    事件,或者继承一个抽象类,如果该
    元组($job,$data)
    已经存在,则记录并查找该类。如果已经存在,请立即终止作业

  • 对于Laravel5,有一种简便的实现方法。我们可以使用,
    Queue::before
    记录作业。如果复制作业已存在,请修改每个作业处理程序以进行查找。如果已经存在,请立即终止作业

  • {
    "job": "Illuminate\\Events\\CallQueuedHandler@call",
    "data": {
        "class": "Staw\\Magento\\Listeners\\OrderEventListener",
        "method": "onOrderChangeAlert",
        "data": "a:1:{i:0;O:49:\"Staw\\HiveEvent\\Events\\Order\\OrderChangeAlert\":6:{s:10:\"eventstart\";O:13:\"Carbon\\Carbon\":3:{s:4:\"date\";s:26:\"2017-12-14 11:20:04.000000\";s:13:\"timezone_type\";i:3;s:8:\"timezone\";s:13:\"Europe/London\";}s:8:\"chain_id\";s:13:\"5a325e64510ce\";s:10:\"channel_id\";i:1;s:11:\"channel_key\";N;s:9:\"entity_id\";s:19:\"[Order Number]\";s:5:\"queue\";s:5:\"event\";}}"
    },
    "id": "0GLUt1O9y6jaZ56yHKA8Vn9si1QNnmlf",
    "attempts": 1
    }