2011-08-15 3 views
6

내가 서버에서 실시간으로 알림을 가져와야 할 곳에 애플리케이션을 작성하고 있다고 가정 해 봅시다. mysql 데이터베이스에서. 내가 그들을 얻으려면 나는 (내가 실제로 결과를 얻을 때까지 같은 쿼리를 반복해서 계속) mysql 서버를 계속 폴링해야만 할 것이다. 그러나 나는 선택이 돌아올 시간이 대부분이기 때문에 그것을하는 것이 매우 불확실한 방법이라고 생각한다. 빈. 만약 내가 자주 그렇게하면 서버에 무리한 부담이됩니다. 드물게 알림이 매우 늦게 올 것입니다. 그래서 조건과 일치하는 결과가 나타날 때까지 차단하는 mysql 쿼리에 대한 방법이 있는지 궁금 해서요.MySQL이 삽입 할 조건과 일치하는 행을 기다리는 방법이 있습니까

list = query ("SELECT * FROM `notifications` WHERE `unread`=1") ; 

대신 읽지 않은 통지가없는 경우 빈 목록을 반환하는 실제로 같은 새 테이블로 구현 나는 producer consumer 패턴을 사용하는 것이 좋습니다

답변

8

를 반환 읽지 않은 알림, 거기까지, 대신 기다릴 것 "작업 대기열". 방아쇠가 너무 간단하기 때문에 저장 프로 시저가 필요 없습니다.

  1. 트리거는 작업 큐를 작업 큐 테이블을 폴링 것
  2. 코드를 채울 것입니다. 테이블이 매우 작기 때문에 쿼리가 빠르고로드가 적습니다.
  3. 코드는 당신이 필요로하고 완료되면 테이블에서 행을 삭제대로 할 것 -
  4. 가능

처리 할 수있는 notification의 ID와 "처리 상태"열이있는 테이블을 작성 작게 그것을 유지, 예를 들면 :

delimiter $ 
create trigger producer after insert on notifications 
for each row begin 
    insert into work_queue (notification_id, status) 
    select new.id, 'ready' 
    where new.unread; 
end; $ 
delimiter ; 

귀하의 대구 :

create table work_queue (
    id int not null auto_increment, 
    notification_id int references notifications, 
    status enum ('ready', 'processing', 'failed') 
); 

는 작업 큐 테이블을 채우는 간단한 트리거 만들기

  1. select * from work_queue where status = 'ready' order by id limit 1
  2. update work_queue set status = 'processing' where id = <row.id>
  3. 당신이 (당신이 실패 항목으로 무엇을 알아낼해야합니다) notifications where id = <row.notification_id>
  4. 중 하나 delete from work_queue where id = <row.id> 또는 update work_queue set status = 'failed' where id = <row.id>에 무엇을해야
  5. : 전자는 의사 코드를 할 것이다
  6. 잠자기 1 초 (이 일시 중지는 최대 도착 알림 비율과 거의 같아야합니다. work_queue 크기와 서버로드 간의 균형을 조정해야합니다)
  7. goto 1.

프로세스 폴링이 하나 인 경우 걱정할 필요가 없습니다. 여러 프로세스가 폴링하는 경우 경쟁 조건을 처리해야합니다.

+0

흥미로운 아이디어인데 폴링 외에도 다른 방법이 없습니다. 감사합니다. ancwer : –

+0

다른 방법이 없으므로 최대한 빨리 폴링을 만들고 싶습니다.내가 말했듯이, 내가 얻은 평판의 가장 힘든 10 포인트이다. :) – Bohemian

+0

메모리 테이블을 사용하면 여기에 좋은 부스트가 될 수 있다고 생각한다. –

관련 문제