2017-12-14 17 views
2

제품 및 주문 업데이트를 처리하고 이벤트 및 작업이 혼합 된 응용 프로그램을 사용하여 변경 사항에 응답합니다.Laravel 이벤트/작업 중복 제거

거의 2 년간이 작업을 해본 결과, Ive는 중복 이벤트 (중복 작업 등을 유발할 수있는)가 다른 상호 연결된 시스템에서 전송 될 때 가장 큰 병목 현상을 발견했습니다.

정상적으로 작동하면 스파이크를 수용 할 수있는 충분한 여유 시간을 갖지만 실제로 사용량이 많아지면 눈덩이처럼 불며 이벤트 나 작업이 처리되지 않을 수 있습니다.

설치 Im은 MySQL (mariadb)을 사용하여 Laravel 4.2를 표준 설치 한 것으로, 여러 종류의 이벤트 (제품 재고 업데이트, 주문 발송 등)를 처리 할 수있는 대기열이있는 작업 및 이벤트를 지원합니다.

laravel이 동일한 작업과 관련된 작업 및/또는 작업을 추가하는 것을 방지 할 수있는 방법이 있는지 궁금합니다.

작업의 예는 다음과 같습니다

{ 
"job": "Illuminate\\Queue\\[email protected]", 
"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 
} 

그리고 (이벤트)에서 이벤트 리스너

{ 
"job": "Illuminate\\Events\\[email protected]", 
"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 
} 

나는 내가 predis/predis 패키지를 사용 레디 스를 검색 할 수 있음을 알고 있어요을하지만, 이건 정말 성가신 것 같아요, 내 자신의 대기열을 만드는 것을 고려했습니다/아마도 DB에 물건의 더 많은 제어권을 가지고 있지만 이것은 큰 일처럼 보입니다. 그리고 내가 얻을 수있는 몇 가지 기능을 놓치고 있다고 느낄 것입니다. stock photography Laravel 설정 재고를 사용 하여.

답변

1

해결 방법은 응용 프로그램 구조가 변경되었을 수 있습니다. 대기열에 넣기 전에 작업 ID, 작업 이름, 작업 데이터 등과 같은 작업 정보를 기록하는 테이블을 만들어야합니다. 큐 작업자가 작업을 처리 할 때 작업 처리기는 테이블을 검색하여 복제 작업이 있는지 확인해야합니다. 그렇다면 즉시 작업을 종료하십시오. 이벤트와 동일하게 처리해야합니다. 로그 및 조회이 tuple($job, $data)이 이미 존재하는 경우 것으로,

  1. Laravel 4, 모든 작업 처리기의 fire 이벤트를 수정 또는 추상 클래스를 상속 :

    은 수많은 구현이 있습니다. 이미 존재하는 경우 즉시 작업을 종료하십시오.

  2. laravel 5의 경우 구현이 편리합니다. Queues Job Events, Queue::before을 사용하여 작업을 기록 할 수 있습니다. 중복 작업이 이미 있으면 조회하도록 각 작업 처리기를 수정하십시오. 이미 존재하는 경우 즉시 작업을 종료하십시오.