Вероятно, в десятый раз я реализую что-то подобное, и я никогда не был на 100% доволен решениями, которые я придумал.
Причина использования таблицы mysql вместо "правильной" системы обмена сообщениями привлекательна прежде всего тем, что большинство приложений уже используют некоторую реляционную базу данных для других вещей (которая, как правило, является mysql для большей части того, что я делал), в то время как очень мало приложений используют систему обмена сообщениями. Кроме того, реляционные базы данных имеют очень сильные свойства ACID, в то время как системы обмена сообщениями часто не работают.
Первой идеей является использование:
create table jobs( id auto_increment not null primary key, message text not null, process_id varbinary(255) null default null, key jobs_key(process_id) );
И затем enqueue выглядит так:
insert into jobs(message) values('blah blah');
И dequeue выглядит так:
begin; select * from jobs where process_id is null order by id asc limit 1; update jobs set process_id = ? where id = ?; -- whatever i just got commit; -- return (id, message) to application, cleanup after done
Таблица и enqueue выглядят красиво, но dequeue kinda меня беспокоит. Насколько вероятно откат? Или заблокировать? Какие ключи я должен использовать, чтобы сделать это O (1) -ish?
Или есть ли лучшее решение, что я делаю?