2017-05-05 8 views
3

나는 PHP 응용 프로그램 용 작곡가 패키지를 만들고 있습니다. 목표는 요청, 대기열 작업, 취해진 다른 작업 후에 일부 데이터를 보내는 것입니다. 나의 초기 (그리고 일하는) 아이디어는 register_shutdown_function을 사용하는 것이다. 이 접근 방식에는 두 가지 문제가 있습니다. 첫째, 페이지 응답 시간이 늘어납니다. 즉, 요청을 계산하고 API를 통해 데이터를 전송하는 오버 헤드가 발생합니다. 또 다른 문제는 대기열 작업자와 같이 장기간 실행되는 프로세스가이 메서드를 오랫동안 실행하지 않기 때문에 데이터를 만든 시간과 보내고 처리 할 때 사이에 막대한 차이가있을 수 있다는 것입니다.보내기 전에 데이터를 수집하기위한 임시 저장소

내 생각에 임시 저장 장치를 사용하여 데이터를 저장하고 매 분마다 보내도록 cronjob을 사용할 수 있습니다. 이 접근법에서 볼 수있는 유일한 문제는 hight IO에서 동시성을 관리하는 것입니다. 많은 프로세스가 매 (n) ms마다 파일에 쓰기 때문에 파일을 읽고 이미 보낸 줄을 제거하는 데 문제가 있습니다.

필자가 피하려고하는 또 다른 옵션은 클라이언트 데이터베이스를 사용하는 것입니다. 이로 인해 잠재적으로 성능 문제가 발생할 수 있습니다.

이렇게하는 것이 바람직한 방법은 무엇입니까?

편집 : 패키지는 본질적으로 모니터링 에이전트입니다.

+0

이입니다. – Pete

+0

그렇지 않습니다. 이것은 클라이언트 인프라에 의존해서는 안되는 작곡가 패키지입니다. – Ignas

+0

흠. 괜찮아. 그런 다음 모든 요청이 동일한 파일에 쓰여지는 요구 사항입니까? 그렇지 않다면 각 파일을 고유 한 파일로 만들고 cronjob과 함께 일괄 처리하십시오. 이렇게하면 동시성 문제가 발생하지 않습니다. – Pete

답변

1

이 방법에 문제가 몇 가지 있는데, 첫째,이

아니에요 요청을 계산, 플러스 내 API를 통해 데이터를 전송하는 오버 헤드가 있다는 것을 의미하는 페이지 응답 시간을 증가 이 문제를 해결할 수 있으려면 웹 요청 컨텍스트 내에서 더 많은 작업을 수행하는 데 추가 오버 헤드가 있어야합니다. 나는 작업 대기열 기반/비동기 시스템을 사용하는 것이 클라이언트에 대해 최소화하는 것처럼 느낀다. 로컬 파일 시스템 쓰기 또는 소켓 쓰기를 선택하면 추가 오버 헤드가 발생하지만 클라이언트로 즉시 돌아갈 수 있고 해당 요청 처리를 차단하지 않을 수 있습니다.

또 다른 문제는 큐 작업자와 같이 장기간 실행되는 프로세스가이 메서드를 오랫동안 실행하지 않기 때문에 데이터를 만든 시간과 보내고 처리 할 때 사이에 막대한 차이가있을 수 있다는 것입니다.

전체적인 부분이 아닙니까? : p 클라이언트로 즉시 돌아가고 나중에 어느 시점에서 비동기 적으로 작업을 완료하려면? 작업 대기열을 사용하면 작업자 풀과 웹 서버를 분리하고 확장 할 수 있습니다. 무거운 물건을 들어 올리는 작업이 근로자에게 연기되므로 웹 서버가 꽤 가늘어 질 수 있습니다.

내 생각에 나는 임시 저장 장치를 사용하여 데이터를 저장하고 매분마다 cronjob을 보낼 수 있다고 생각했습니다.

나는 자신의 롤링에 반대하는 작업 대기열을 살펴 보는 것이 좋습니다. 이것은 거의 해결되었고 이것을 처리 할 수있는 많은 인기있는 오픈 소스 프로젝트가 있습니다 (MQ 중 하나) 분 cron 작업이 클라이언트에 대한 계산을 수행합니까? 어떻게 확장합니까? 파일에 1000 개의 항목이 있거나 10x로 축척되고 10000이 있으면 1 분 안에 모든 계산을 수행 할 수 있습니까? 서버가 죽으면 어떻게됩니까? 어떻게 회복합니까? 프로세스 간 동시성? 각 프로세스에 대한 잠금을 관리해야합니까? 각 프로세스와 매분마다 별도의 파일을 사용합니까? 버켓 이벤트? 1 분 미만의 달리기를 원하면 어떻게됩니까?

내구성은 당신이 당신의 클라이언트를 제공하고 있습니다 보장 어떤 종류의

을 보장? 요청이 반환되면 클라이언트는 작업이 지속되고 나중에 언젠가 완료 될 것이라고 확신 할 수 있습니까?


작업자 큐를 선택하고 웹 서버 프로세스에서 쓰기를 권장합니다. 크기 조정 방법에 대한 많은 자원과 명확한 내구성 및 성능 보장으로 극도로 보편적 인 문제입니다. RabbitMQ 등이 아주 우아하게이 문제를 해결할 경우

enter image description here

+0

기본적으로 내 패키지는 모니터링 에이전트입니다. 내 고객이 응용 프로그램과 아무 관련이없는 MQ 소프트웨어를 설치, 관리 및 유지하는 것을 어떻게 보지 않을지는 모르겠다. 여기가 가장 중요한 문제입니다. 귀하의 답변을 주셔서 감사하지만 내 문제를 해결하지 않습니다 :/ – Ignas

+0

귀하의 고객은 cron을 등록하고 그것을 유지/모니터합니까? 그들이 배경 직업 수, 성공, 자원을 모니터링 할 것인가? 이미 만들어진 모니터링 에이전트를 활용할 수있는 방법이 있습니까? statsd, collectd, fluentd 등? 당신은 선호하는 방법을 물어 보았고, 나는 아주 잘 연구 된 매우 대중적인 아키텍처를 활용할 것을 권장 할 것입니다. 번성하는 공동체와 함께 훌륭한 전투를 테스트하고 잘 문서화 된 서비스가 많으며 자생적인 솔루션에 반대합니다. – dm03514

+1

cron은 클라이언트 응용 프로그램이며 대상인 프레임 워크에 내장 된 기본 CLI 스크립트에 의해 하위 프로세스로 시작됩니다 (laravel). 필자는 사용자가 선택할 수있는 4 개의 스토리지 엔진을 구현하기로 결정했습니다 : 메모리 (사용 가능한 경우 'fastcgi_finish_request'를 통해 요청이 클라이언트에 제공 된 후 데이터 전송), 데이터베이스, 파일 및 제안 된 에이전트 중 하나. 언급 한 3 가지 중 어느 것이 JSON 컬렉션에 가장 좋을까요? 나는 단지 성능을 희생하더라도 통합의 복잡성을 피하려고 노력하고있다. MVP를 구축하고 있으므로 아이디어를 먼저 테스트해야합니다. :) – Ignas