Laavel의 대기열에서 병렬 처리하기

사용 환경

  • Laravel8.x
  • PHP 8.0
  • Docker(Laavel Sail로 구축된 환경)
  • 안부를 묻다


    이 글은 2021년 Qita Advent Calendar PHP의 4일째 기사다.
    어제는 @yoshikyoto씨의 PHP8입니다.08.1에 관한 기사입니다.최근 PHP도 8.1을 발표해 진화가 빠르다.
    @yoshikyoto 기사는 여기서부터 시작하겠습니다.

    글의 목적


    이 글은 내가 라벨 병행 처리에서 논의한 옵션을 소개하면서 현재 비슷한 실행을 목표로 하는 사람들을 돕기 위해 그것을 어떻게 구현했는지 보여준다.

    전제 조건


    Laavel의 대기열 기능에서는 다양한 처리를 작업의 함수로 잘라낸 다음 백그라운드에서 비동기적으로 실행할 수 있습니다.대열에 관해서는 사전에 공식 문서를 붙인다.
    Laravel 8.대열
    라벨을 만진 지 반년 정도 된 나는 이미 대열로 구축된 메시지 리시버 서비스를 이용한 프로젝트에서 이런 요구를 받았다.
    사장: "메시지 발송 속도를 높일 수 있습니까?"
    문제 프로젝트에서 외부 API를 사용하여 메시지를 보냅니다.그런 다음 작업 중에 API를 두드리는 처리를 미리 작성하고 필요한 시간에 대기열에 발행함으로써 정보 발송 기능을 실현했다.

    API 구속조건 보내기


    API를 보내는 경우 1초에 5번만 호출할 수 있습니다.이른바 속도 제한이다.물론 이걸 넘으면 속도 제한을 넘어 API 호출이 실패하기 때문에 발송 속도를 높이면 초내 5통만 겨우 걸 수 있다.다음 내용은 이 속도 제한에 따라 진행될 것이다.

    편지 전송 속도를 높여야 하는데...?


    세 개 정도 소개할게요.결론만 알고 싶은 사람은 맨 아래로 건너가세요.

    Golang으로 병렬 처리


    라벨에 지친 나는 신기술을 사용할 기회가 있다면 병행 처리를 잘하는 골랑의 사용을 고려했다.처리 기구로서의 인상은 이렇다.

    크론과 라벨에서 그걸 실행했던 임무 스케줄러가 가장 빈번하게 실행되더라도 1분에 한 번밖에 실행되지 않는다는 걸 자세한 분들은 아실 겁니다.그러나 문제의 항목에서 상술한 속도 제한에 도달하기 위해서는 1초에 한 번씩 실행해야 하기 때문에 이 방법을 사용할 수 없다.비애

    Guzzle HTTP 사용


    GuzzeleHTTP란 PHP를 병렬로 HTTP 호출을 하는 프로그램 라이브러리를 말한다.적어도 Laavel8 시스템은 기본적으로 포함됩니다.기술 조사에서는 메르카리가 적힌 슬라이드가 참고 가치가 있어 일단 붙여놨다.
    Guzzle Promise를 이용한 비동기 처리로 API 호출 속도 향상
    한 마디로 하면 외부 송신 API를 병렬로 두드리려면 Request Assync 또는 Pool을 사용하여 POST 요청을 API의 종점으로 보낼 수 있습니다.그러나 이것은 결국cron이나 작업 스케줄러를 통해 속도 제한을 제어해야 하기 때문에 Golang 때와 같이 사용할 수 없습니다.비애하지만 나 같은 속도 제한이 없는 개발자에게는 좋은 선택이다.PHP로 완성했으니까요.

    다중 대기열 프로세스 시작


    이것은 세 가지 방법 중 가장 촌스러운 방법이지만 결국 채택되었다.Laavel에서 작업을 발행할 때 발행 목표의 대기열을 임의로 지정할 수 있습니다.예: queueA 와queueB라는 두 큐피트 카프로세스가 시작되면 대열의 발행지에서 이 대열의 이름을 지정하면 작업의 발행지를 분리할 수 있다.
    나의 경우 이전에는 Cybercanceros를 하나만 시작했는데 지금은 두 개로 늘어나 API를 병렬 호출할 수 있어 메시지 발송 속도를 높일 수 있다.
    그러나 속도 제한 문제는 아직 해결되지 않았다.결론적으로 쿠바의 진행을 두 가지 기준으로 나눠 1초에 5번을 넘지 않고(평균 4번) 있어도 순식간에 넘을 수 있어 API 호출은 문제 없이 진행되기 때문에 일단 해결됐다.
    그러나 공식적인 환경에서 대열의 과정이 낮아질 위험에 대해서는 대책이 필요하다.그건 슈퍼바이저로 처리했어요.그때 필요한 슈퍼바이저.conf에 대한 쓰기 등은 보도의 목적에서 벗어났기 때문에 사랑을 끊어야 한다.내가 참고했던 신 기사를 붙여 보세요.
    Laavel에서 대기열 병렬 처리 사용

    좋은 웹페이지 즐겨찾기