なぜRDBMSでMQを実現するのにプラグインが必要か

自分でも忘れがちなので。

理由: 通常テーブルと LISTEN & NOTIFY_ONE では信頼性のあるメッセージの伝達が難しいから。

  • 欠落がないようにしようと思ったら、サブスクライバから ACK を飛ばしてもらう必要がある
  • サーバは、ACK を受信するまで、その行を他のサブスクライバに渡してはならない
  • サーバは、ACK が来ずに切断された場合は、その行を他のサブスクライバに渡さなければならない

これらの条件を満たそうと思うと、サブスクライバが LOCK TABLES FOR READ するしかないことになる。が、それだとパフォーマンスが出なさすぎ。という感じ。

SELECT FOR UPDATE で出来そうにも思えるけど、後から追加された行を第二第三のサブスクライバに渡すということができなさそう。

逆を言うと、複数個のサブスクライバが同時接続してこないのであれば、LISTEN & NOTIFY_ALL でも大丈夫。