SubscriptionからSubscriberへのメッセージ伝達の方法は2つ
- Push方式
- Pull方式
ほとんどのメッセージキューでは、メッセージの取得に、プッシュオプションおよびプルオプションの両方を利用できます。
例えば、AWSのSQSやGCPのCloud Pub/Subとかがそうですね。
こういった、メッセージング方式をPub/Sub Messaging
といいます。
参考:https://aws.amazon.com/jp/pub-sub-messaging/
Push方式
- PublisherがMessageをPublishします。
- Message QueueがPOSTリクエストをSubscriberに対して送ります。
というのが、Push方式で、SubscriberはHTTPエンドポイントを提供するのが一般的です。
Pull方式
- PublisherがMessageをPublishします。
- SubscriberがGETリクエストをSubscriptionに対して送ります。
というのが、Pull方式で、Subscriberはwokerプロセスとして、メッセージキューに対してリクエストを定期的に送るというのが一般的です。
どっちがいいの?
どちらがいいかは要件によりますが、キーワードは「時間的疎結合」だと思っています。
そもそも、非同期の処理を使っているということは、アプリケーションコードが論理的には、直接別のプロセスに依存しないようになっていると思います。
ところが、Push方式の場合は、時間的密結合になります。
Pull方式の場合は時間的疎結合になります。
時間的密結合というのは、PublisherがMessageをPublishする瞬間にSubscriberがActiveであることに依存するかどうかです。
Push方式であれば、受け取り手がいなくなり、メッセージは棄却されます。(不整合を防ぐために幾つかの工夫は可能。例えば、リトライ。または、デッドレターキューを利用する方法)
Pull方式であれば、SubscriberがActiveになった時にMessageは Consumeされるので、時間的に疎結合にすることができます。
その分、時間効率がいいのは、Push方式です。