这可能是我第十次实施这样的事情,而且我从未对自己提出的解决方案感到 100% 满意。
使用 mysql 表而不是“适当的”消息传递系统的原因很有吸引力,主要是因为大多数应用程序已经使用一些关系数据库来处理其他东西(对于我一直在做的大部分事情,这往往是 mysql),而很少有应用程序使用消息系统。此外 - 关系数据库具有非常强的 ACID 属性,而消息传递系统通常没有。
第一个想法是使用:
创建表作业( id auto_increment 不是 null 主键, 消息文本不为空, process_id varbinary(255) null 默认 null, 关键jobs_key(process_id) );
然后入队看起来像这样:
插入工作(消息)值('blah blah');
出队看起来像这样:
开始; select * from jobs where process_id is null order by id asc limit 1; 更新作业集 process_id = ? 其中 id = ?; ——无论我得到什么 犯罪; -- 返回 (id, message) 到应用程序,完成后清理
表和入队看起来不错,但出队有点困扰我。回滚的可能性有多大?还是被封杀?我应该使用什么键使它成为 O(1)-ish?
还是有比我正在做的更好的解决方案?