2009-04-24 1 views
5

다음과 같이 작동하는 응용 프로그램이 있습니다. Linux 컴퓨터는 고객에게 28 가지의 다른 유형의 문자를 생성합니다. 편지는 .docx (Microsoft Word 형식)로 보내야합니다. 비서는 필요에 따라 자동으로 사용되는 MS Word 템플릿을 유지 관리합니다. MS Word 사용을 변경하는 것은 옵션이 아닙니다.폴링 데이터베이스 대신 사용 하시겠습니까?

이 모든 것을 조정하기 위해 문서 작업은 데이터베이스 테이블에 배치되고 각 Windows 컴퓨터에서 실행되는 Python 프로그램은 데이터베이스를 자주 폴링하여 작업을 잠그고 필요에 따라 실행합니다.

정확한 상태 정보를 제공하기 위해 다른 상태 ("신규", "처리 중", "완료 됨", "인쇄 됨")를 조정하기 위해 작업 정보를 중앙 데이터베이스 테이블을 사용합니다.

어쨌든 대부분의 경우 클라이언트가 데이터베이스를 폴링하는 것을 싫어합니다. 고객은 5 초마다 hpoll을 사용합니다.

폴링을 피하려면 "할 일이 있습니다"또는 "일부 작업을 수행 할 데이터베이스를 확인하십시오"라는 메시지가 모든 클라이언트 컴퓨터에 전송되기를 바란다.

게시/구독 메시지 대기열은 일종의 일이라고 생각하지만 엄청난 복잡성을 원하지 않습니다.

이것을 달성 할 수있는 설정/유지 보수 소프트웨어가 거의 없습니까? 옵션은 무엇입니까? X

+0

사용중인 데이터베이스 시스템 ? SQL 서버? –

+0

그것은 MySQL 데이터베이스입니다. –

+3

괜찮습니다. SQL Server 2005에는 SQL Server 메시지 브로커가 있습니다. 그것은 당신의 클라이언트 프로세스가 할 일 (q 안에 메시지)이있을 때까지 0 % cpu를 차단하고 소비하는 것을 허용합니다. 각 메시지는 트랜잭션입니다. 그러나, ofc, 당신은 이런 종류의 처리를하기 위해 SQl 서버가 필요하지 않습니다. 내가 그들을 사용하지 않았으므로 또 다른 것을 추천 할 수는 없다. –

답변

3

이 달성 할 소프트웨어의 제로 또는 거의 제로 설정/유지 보수가 있나요? 옵션은 무엇입니까?

아마도 구성 및 구현 시간을 줄이면 폴링 서비스보다 성능이 저하 될 수 있습니다. SQL Server는 실제로 푸시를하지 않습니다 (어쨌든 쉽지 않음). 데이터를 푸시하는 데 사용할 수있는 것들이 있습니다 (복제 서비스, 로그 전달 - 장난스런 것들). 그러나 이들은 더 복잡하고 간단한 폴링 서비스보다 많은 리소스가 필요합니다. 일부 옵션은 다음과 같습니다

  1. 명령 줄을 사용하여 실행 열고 사용

  2. 를 실행할 수있는 SQL 서버 COM 개체를 사용하여 (sp_cmdshell)

  3. 호출 실행 트리거의 일종 VBScript를 실행하는 SQL 에이전트 작업 (다시 "폴링"으로 간주 됨)

이러한 옵션은 다소 우스꽝 스럽습니다 이미 완료했을 때 훨씬 간단합니다.

너무 많은 사이클 또는 무언가를 사용하는 폴링 서비스가 걱정된다면 언제든지 다시 폴링 할 수 있습니다. 매분, 매 10 분 또는 하루에 한 번 폴링하는 것이 더 적절할 수 있습니다. 결정, 그래서 비즈니스에 누군가가 얼마나 빨리해야하는지 물어보십시오.

간단한 폴링 서비스는 매우 일반적입니다. 간단하고 간단하기 때문에 ... 간단합니다. 또한 오버 헤드가 적고 원격으로 안정적이며 오류를 허용하지 않습니다. 아래쪽면은 신중하게 통제하지 않으면 데이터베이스를 먼지로 망칠 수 있다는 것입니다.

3

메시지 대기열은 리소스를 낭비하지 않고 보통 잠시 동안 차단할 수 있도록 설정되므로 일반적으로 잘 작동합니다. 그러나 MySQL을 사용하면 옵션이라고 생각하지 않습니다.

DB의로드를 줄이려면 단일 작업 테이블 인 최신 작업 ID를 만들 수 있습니다. 그런 다음 클라이언트는 실제 테이블에 대해 전체 폴링을 실행해야하는지 확인하기 위해 마지막 ID와 비교해야합니다. 문제가 발생하면 오버 헤드를 크게 줄여야합니다.

+1

폴링은 'SHOW TABLE STATUS'를 사용하여 테이블이 마지막으로 업데이트 된시기를 감지하고 새 테이블을 만들지 않게 할 수 있습니다. –

5

서버에 상당한 부하가 걸리고 있다는 객관적인 증거가 있습니까? 작동하는 경우 여기에서 해결할 문제가 있는지 확인해야합니다.

모든 것이 원활하게 실행되어 개선되었을 가능성이있는 것을보고 계셔야합니다.

+0

좋은 방법. 그것 Upvote :) – Jasmine

1

Postgres와 SQL Server (또는 CouchDb와 같은 객체 저장소)와 달리 MySQL은 데이터베이스 이벤트를 방출하지 않습니다. 그러나 이것을 시뮬레이트하는 데 사용할 수있는 코딩 패턴이 있습니다.

모니터 할 테이블이 하나 이상있는 경우 처리 할 이벤트 큐를 기록하는 "변경 사항"테이블에 행을 추가하는 트리거를 이러한 테이블에 만들 수 있습니다. 트리거는 관심있는 데이터 변경의 하위 집합을 필터링하고 수행하려는 각 이벤트에 대한 변경 테이블의 레코드를 만듭니다. 이 패턴 이벤트를 처리하므로이 이벤트를 처리하는 작업자가 작동을 멈추더라도 제대로 작동합니다.

대부분의 경우 쓰기 작업을하기 때문에 MyISAM이 변경 테이블을위한 최선의 선택이라고 생각할 수도 있습니다 (또는 데이터베이스 서버 중단 사이에 이벤트를 유지할 필요가없는 경우에도 MEMORY). 그러나 Memory와 MEMORY 및 MyISAM은 전체 테이블 잠금 만 가지고 있으므로 MEMORY 및 MyISAM 테이블에 삽입 할 때 InnoDB 테이블의 트리거가 병 목에 걸릴 수 있습니다. ON DELETE CASCADE를 다른 InnoDB 테이블과 함께 사용하는 경우 (두 테이블 모두 동일한 엔진을 사용해야 함) 변경 테이블에 InnoDB가 필요할 수도 있습니다.

수행 할 작업이 있는지 확인하기 위해 변경 테이블의 마지막 업데이트 시간을 확인하려면 SHOW TABLE STATUS을 사용할 수도 있습니다. 이 기능은 InnoDB 테이블의 경우 wont work입니다.

이 기사에서는 MySQL에서 대기열을 구현하고 폴링을 피할 수있는 몇 가지 대안 방법에 대해 자세히 설명합니다.