를 반환 읽지 않은 알림, 거기까지, 대신 기다릴 것 "작업 대기열". 방아쇠가 너무 간단하기 때문에 저장 프로 시저가 필요 없습니다.
- 트리거는 작업 큐를 작업 큐 테이블을 폴링 것
- 코드를 채울 것입니다. 테이블이 매우 작기 때문에 쿼리가 빠르고로드가 적습니다.
- 코드는 당신이 필요로하고 완료되면 테이블에서 행을 삭제대로 할 것 -
가능
처리 할 수있는 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')
);
는 작업 큐 테이블을 채우는 간단한 트리거 만들기
select * from work_queue where status = 'ready' order by id limit 1
update work_queue set status = 'processing' where id = <row.id>
- 당신이 (당신이 실패 항목으로 무엇을 알아낼해야합니다)
notifications where id = <row.notification_id>
- 중 하나
delete from work_queue where id = <row.id>
또는 update work_queue set status = 'failed' where id = <row.id>
에 무엇을해야 : 전자는 의사 코드를 할 것이다
- 잠자기 1 초 (이 일시 중지는 최대 도착 알림 비율과 거의 같아야합니다. work_queue 크기와 서버로드 간의 균형을 조정해야합니다)
- goto 1.
프로세스 폴링이 하나 인 경우 걱정할 필요가 없습니다. 여러 프로세스가 폴링하는 경우 경쟁 조건을 처리해야합니다.
흥미로운 아이디어인데 폴링 외에도 다른 방법이 없습니다. 감사합니다. ancwer : –
다른 방법이 없으므로 최대한 빨리 폴링을 만들고 싶습니다.내가 말했듯이, 내가 얻은 평판의 가장 힘든 10 포인트이다. :) – Bohemian
메모리 테이블을 사용하면 여기에 좋은 부스트가 될 수 있다고 생각한다. –