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つの処理が複数のシステムにまたがる場合に、一部の障害や変更があっても影響を小さくでき、システム間を疎結合にできます。マイクロサービスなどで使われることが多いです。

messaging system

Google PubSub

Google PubSubはGCPのメッセージングサービスです。特徴としてはackが用意されていてPublishされたメッセージをSubscriberが受信し、ackしたら初めて配信完了となります。このackが来ない場合はリトライをしたり、ackされなかったメッセージを別のPublisherに送信(Dead Letter Topic)に送信することができます。

messaging system

Google PubSubでは扱うメッセージはTopicというものでまとめられていて、TopicにしてSubscriptionし、そのSubscriptionにSubscriberを用意することでメッセージをSubscribeできます。

messaging system

Google PubSub: Use Case: 決済完了通知

決済完了後にユーザにメールを配信する必要がある場合に、決済処理の最後にメッセージングサービスにPublishして処理を終了し、非同期でメッセージを受け取ったメール配信システムがメールの送信を実行するという仕組みが考えられます。あとからpush通知が必要になってもSubscriberを追加するだけなので変更箇所も小さくできます。

messaging system

そのほかにもStreaming機能などがありますが、こちらについては割愛します。

Redis PubSub

Redis PubSubにはackがありません。その代わり、Subscriberすべてに同じメッセージを配信する、いわゆるbroadcastすることができます。

reids pubsub

Redis PubSub: Use Case: WebSocket

Subscriber全てが同じメッセージを受け取り、何か処理を実行する場合に便利です。 例えば、WebSocketを使ったChatサービスの場合、誰かが送ったメッセージを他のユーザの画面にも送信したいということがあると思います。 バックエンドサービスがDockerコンテナで複数台立ち上げている場合、他コンテナと通信しているクライアントにもメッセージを届けるにはRedisPubSubを通して全てのコンテナに同じメッセージをbroadcastすることができます。

reids pubsub

まとめ

Google PubSubもRedisPubSubもメッセージシステムを実現できますが、

Google PubSubは

  • 1回、または1回以上のメッセージの配信が可能
  • subscriber全部が同じメッセージを受け取ることができない

Redis PubSub

  • subscriberすべてに同じメッセージを配信できる
  • 全てのSubscriberがメッセージを受信したかを保証することはできない

という違いがあります。 また、Google PubSubの場合クラウドサービスの一つなので一定以上の可用性を目標に運用されていますが、Redis PubSubの場合は自分でRedisを立ち上げてpublish, subscriberの実装をする必要があります。