Google PubSub Redis PubSubの違い
Ko Yamaura
概要
こんにちは。Google PubSubとRedis PubSubは仕組みが違うのでユースケースによっては使えないということを知りました。それについてまとめます。
ChatGPTによるこの記事の要約
Google PubSubとRedis PubSubは仕組みが違うため、使い分けが必要であることが記事でまとめられている。Google PubSubはGCPのメッセージングサービスで、ackがあり、複数回配信可能だが、全Subscriberが同じメッセージを受け取れない。一方、Redis PubSubはackがなく、全Subscriberが同じメッセージを受け取れるが、全員がメッセージを受信したかの保証はできない。それぞれのシステムのユースケースとして、Google PubSubでは決済完了通知、Redis PubSubではWebSocketが挙げられている。
前提知識: メッセージングシステム
Producer/Publisherからメッセージを受け取り、Consumer/Subscriberに配信するシステムです。1つの処理が複数のシステムにまたがる場合に、一部の障害や変更があっても影響を小さくでき、システム間を疎結合にできます。マイクロサービスなどで使われることが多いです。
Google PubSub
Google PubSubはGCPのメッセージングサービスです。特徴としてはackが用意されていてPublishされたメッセージをSubscriberが受信し、ackしたら初めて配信完了となります。このackが来ない場合はリトライをしたり、ackされなかったメッセージを別のPublisherに送信(Dead Letter Topic)に送信することができます。
Google PubSubでは扱うメッセージはTopicというものでまとめられていて、TopicにしてSubscriptionし、そのSubscriptionにSubscriberを用意することでメッセージをSubscribeできます。
Google PubSub: Use Case: 決済完了通知
決済完了後にユーザにメールを配信する必要がある場合に、決済処理の最後にメッセージングサービスにPublishして処理を終了し、非同期でメッセージを受け取ったメール配信システムがメールの送信を実行するという仕組みが考えられます。あとからpush通知が必要になってもSubscriberを追加するだけなので変更箇所も小さくできます。
そのほかにもStreaming機能などがありますが、こちらについては割愛します。
Redis PubSub
Redis PubSubにはackがありません。その代わり、Subscriberすべてに同じメッセージを配信する、いわゆるbroadcastすることができます。
Redis PubSub: Use Case: WebSocket
Subscriber全てが同じメッセージを受け取り、何か処理を実行する場合に便利です。 例えば、WebSocketを使ったChatサービスの場合、誰かが送ったメッセージを他のユーザの画面にも送信したいということがあると思います。 バックエンドサービスがDockerコンテナで複数台立ち上げている場合、他コンテナと通信しているクライアントにもメッセージを届けるにはRedisPubSubを通して全てのコンテナに同じメッセージをbroadcastすることができます。
まとめ
Google PubSubもRedisPubSubもメッセージシステムを実現できますが、
Google PubSubは
- 1回、または1回以上のメッセージの配信が可能
- subscriber全部が同じメッセージを受け取ることができない
Redis PubSub
- subscriberすべてに同じメッセージを配信できる
- 全てのSubscriberがメッセージを受信したかを保証することはできない
という違いがあります。 また、Google PubSubの場合クラウドサービスの一つなので一定以上の可用性を目標に運用されていますが、Redis PubSubの場合は自分でRedisを立ち上げてpublish, subscriberの実装をする必要があります。