데이터베이스를 공유하는 서버가 여러 개 있습니다. 각 서버에서 텍스트 메시지 로그 항목이 없으면 cron 작업이 5 분간 확인되고 텍스트 메시지가 생성됩니다 로그 항목을 보내고 텍스트 메시지를 보냅니다. 나는 하나의 서버가 먼저 있어야하므로 텍스트 메시지가 여러 번 전송되는 상황이 결코 없을 것이라고 생각했다.여러 서버에서 Laravel cron/queue/workers 설치
음 - 내가 잘못했다, 그 시나리오는 일어나지 않았다
- A는 - 로그가 존재하는지 확인 - 그것은
- B하지 않습니다 - 로그가 존재하는지 확인 - 그것은
- 하지 않습니다 - 로그 생성
- B - 메시지
- B 보내 - - 보낼 메시지
이 문제는 대기열을 도입하기 위해 변경되었으며 문제를 완화시켜야합니다. crons가 여전히 발사하는 동안, 여러 작업이 대기열에 배치되며, 작업자는 다른 시간에 주어진 작업을 선택해야하므로 메시지를 두 번 보내는 것을 방지합니다. 그것뿐만 아니라 존재 끝날 수도 있지만 :
- 을 - 작업 1
- B를 선택 - 작업 2
- 를 데리러 - 로그가 존재하는지 확인 - 그것은
- B하지 않습니다 - 확인 로그가 존재하는 경우 - 그렇지 않습니다.
기타 또는 정확히 같은 시간에 동일한 작업을 픽업 할 수 있습니다.
해결 방법은 하나의 작업자 서버를 실행하는 것입니다. 그런데 여러 서버의 작업이 여러 번 대기하는 상황이 발생했습니다. 첫 번째 시나리오가 끝나면 대기열에 대기 중인지 확인할 수 없습니다.
여러 서버, 하나의 작업자 서버 설정이 작동하지만, 동일한 작업 (여러 서버에서 들어오는 인스턴스)을 여러 번 사용하고 싶지는 않습니다. 열.
어쩌면 해결책은 하나의 cron/queue/worker 서버를 사용하는 것이지만 Laravel/multiserver 환경을 설정하지 않은 경험이있을 것입니다.
나를 위해 다른 문제는 - 이것을 테스트하는 방법입니다. 서로 동기화 된 VM 인스턴스를 회전시킬 수있는 방법이 없으면 로컬로 테스트 할 수 없습니다.
주어진 현재의 설정은 "반드시"작동해야하는 여러 작업자를 갖는 것입니다. (대기열이없는 초기 설정은 "두 대의 컴퓨터가 절대적인 동시성을 가질 수있는 설정을 본 적이 없기 때문에"잘 작동해야하지만) - 내 생각을 확인하는 것이 좋다. 나는 5.4를 돌리고 있는데 현재 업그레이드가 불가능하다. 필자가 (Laravel이 아니더라도) 더 익숙한 해결책은 모든 서버의 memcache에 인덱스를 갖고 누가 현재 마스터인지를 파악하는 것입니다. 마스터가 죽으면 새로운 마스터가 임명되고 대기열에 마스터가 있는지 확인합니다. – eithed