このようなものを実装するのはおそらく 10 回目ですが、思いついたソリューションに 100% 満足したことはありません。
「適切な」メッセージング システムの代わりに mysql テーブルを使用することが魅力的である主な理由は、ほとんどのアプリケーションがすでに他のものに何らかのリレーショナル データベースを使用しているからです (これは、私が行ってきたほとんどの作業で mysql を使用する傾向があります)。メッセージング システムを使用します。また、リレーショナル データベースには非常に強力な ACID プロパティがありますが、メッセージング システムにはありません。
最初のアイデアは、次を使用することです。
テーブルジョブを作成します( id auto_increment が null でない主キー、 メッセージ テキストは null ではありません。 process_id varbinary(255) null デフォルト null、 キーjobs_key(プロセスID) );
そして、エンキューは次のようになります。
ジョブ(メッセージ)値に挿入します(「何とか何とか」);
デキューは次のようになります。
始める; select * process_id が null のジョブから ID 順 asc limit 1; 更新ジョブ セット process_id = ? id = ?; -- 私が得たものは何でも 専念; -- (id、メッセージ) をアプリケーションに返し、完了後にクリーンアップします。
テーブルとエンキューは見栄えがしますが、デキューはちょっと気になります。ロールバックする可能性はどれくらいですか?それともブロックされる?O(1)風にするにはどのキーを使用すればよいですか?
または、私がやっていることよりも良い解決策はありますか?