这可能是我第十次实施这样的事情,而且我从未对我提出的解决方案百分百满意.
使用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) );
然后入队看起来像这样:
insert into jobs(message) values('blah blah');
出列似乎是这样的:
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
表和入队看起来不错,但出队有点困扰我.回滚的可能性有多大?还是被封锁了?我应该用什么键来制作O(1)-ish?
或者,我正在做什么更好的解决方案?
我一直在体验真实生产环境中消息传递系统的优点和缺点,我必须承认,每次任何其他形式的消息传递队列时,组织良好的表或表模式都会跳动,因为:
您对每种方法有何看法?
我使用SQL Server 2008 R2作为排队机制.我将项添加到表中,外部服务读取并处理这些项.这很好用,但缺少一件事 - 我需要机制,我可以尝试从表中选择一行,如果没有,则阻塞直到有(优选在特定的时间段内).
任何人都可以建议我如何实现这一目标?