こんにちは。2019年入社(新卒)エンジニアの加藤快です。
ヤフーのインフラの1つであるMessage Queueを運用・開発しているチームに配属となりました。
私のチームで提供しているMessage Queueには日々膨大なトラフィックが流れており、さまざまなヤフーのサービスの基盤を支えています。また、このシステムにはOSSであるApache Pulsarが用いられており、OSSへの貢献も積極的に行っています。
今回は、ヤフー社内でのMessage Queue利用事例やOSSとの関わり方についてお話ししていきます。
Message Queueとは
Message Queue(以下、MQ)とは、言葉の通り「システム間で流れるデータ(メッセージ)をためておくキュー」です。 ログや通知などのさまざまなメッセージをシステム間でやりとりする際に使用されます。
MQを利用することでシステム間のメッセージのやりとりにどのような変化が生じるか見ていきましょう。
MQを実装しない場合
送信側システムからのメッセージをそのまま受信側システムが取得して処理を行っています。 そのため、メッセージのやりとりを行う際に相手側システムの状況を確認するといった実装が必要になり、システムの独立性は低いと言えます。
このようにMQを実装しない場合はシステム間が密結合となり、
- 互いのインターフェースや処理時間などを意識した実装をする必要がある
- サーバーの増設などのシステム構成の変更が互いに影響を与えてしまう
といった制約が発生します。
MQを実装した場合
送信側システムからのメッセージはMQにためられます。 受信側システムは任意のタイミングでMQからメッセージを取得し、それを使った処理を行います。
間にMQが挟まれたことで、各システムはMQに対してメッセージの送受信を行うだけでよく、相手のシステムの状況を知る必要はありません。このため、システムの独立性が高くなります。
MQを実装した場合はシステム間が疎結合となり、上記の制約を気にすることなくメッセージの伝達が行えます。
なぜ社内向けMQが必要となったか
社内プラットフォームとしてのMQが提供される前から、ヤフー社内のプロダクトによってバラバラのMQは利用されていました。 各プロダクトがそれぞれ個別にMQを管理・運用している状態は、プロダクトのリソースを使ってしまいます。 それにより、プロダクトが本来行うべきサービスやそれに伴うユーザー価値の創造に専念することの妨げになっていました。
そのため、サービス横断で利用できるMQが必要となり、社内向けMQ(以下、社内MQ)を管理するチームが発足することとなりました。 それに伴い、サービスを横断して利用できるMQとはどんなものか、要件定義がなされ技術選定が行われました。
その際に挙がった要件には以下がありました:
マルチテナント(1つのシステムを複数のサービスが利用する形態)
大量の異なるサービスを共通のクラスタで扱うため
大量のトピックを扱える(トピックはメッセージの送信先)
大量のサービスがさまざまな用途で使うのでトピック数が膨大となるため
認証/認可機構
適切なアクセス制御を行うため
低レイテンシーと耐久性の両方を満たす
システムのパフォーマンスと信頼性に直結するため
ジオレプリケーション(地理的に離れた別のデータセンターに同じデータを複製・格納し、可用性を担保する仕組み)
冗長化構成による障害や災害に強いシステムを構築するため
チーム発足当時の他のMQ(Apache KafkaやRabbitMQなど)ではこれら全てを満たすことができず、Verizon Media(旧 Yahoo Inc.)で開発中だったApache Pulsarを採用することになりました。
他のMQと比べて、ジオレプリケーションの機能やスケーラビリティの高さがPulsarの大きな強みとなっています。
PulsarとKafkaとの比較についてはこちらに詳しく記載されています。
オープンソースソフトウェア Apache Pulsar
Apache Pulsar(以下 Pulsar)は、2016年9月にOSSとして公開され、2018年9月に OSSコミュニティ支援団体「The Apache Software Foundation」のトップレベルプロジェクトに認定されました。
2019年12月現在、OSSとして公開されてから3年がたち、2.4.2が安定バージョンとして利用可能です。 3年間で便利な機能やクライアント言語の追加などが行われています。
詳しくはこちらの資料をご覧ください。
- Pulsar Wiki
- ハイパフォーマンスでスケーラブルなメッセージングシステム:Pulsarの紹介 - Yahoo! JAPAN Tech Blog
- ヤフー発のメッセージキュー「Pulsar」のご紹介
社内MQ
ヤフーでは、内外からさまざまデータをやりとりしているため、社内MQが処理をするメッセージの数は膨大です。
これらのデータを処理する社内MQのアーキテクチャと実際の利用例について見ていきましょう。
Pulsarクラスタのアーキテクチャ
ヤフーの社内MQ利用者は、MQへメッセージを送信するProducerとMQからのメッセージを受信するConsumerを使って、社内MQであるPulsarクラスタを使用しています。
Pulsarクラスタを構築する各コンポーネントの定義について簡単に解説していきます。
Broker
メッセージ送受信を仲介するコンポーネントです。主に3つの機能を提供しています。
- メッセージの配信
- 他クラスタのレプリケーション
- 設定管理API
Bookie
Pulsarクラスタに送信されたメッセージを保存するストレージです。Apache BookKeeperを使用しています。
Producerから送信されたメッセージはBookieに保存されます。 保存されたメッセージはすべてのConsumerからACKが返されるまで削除されません。 これにより、メッセージの欠損をなくすことができます。 また、Consumerがメッセージを受け取れなかった場合は再送することが可能です。
ZooKeeper
Pulsarクラスタの設定情報の保持をしています。 Apache ZooKeeperを使用しています。
- Configuration Store:全てのクラスタで共通の設定情報を保持
- Local ZooKeeper:個々のクラスタ特有の設定情報(Broker,BookKeeperのメタ情報など)を保持
ヤフーのPulsarクラスタは、各コンポーネントごとに複数のインスタンスを用意して構築しており、社内MQを利用するサービスが増加するのに合わせてインスタンスの追加によるクラスタの拡張を随時行っています。
2019年12月現在、社内MQとして本番環境を支えているPulsarクラスタのインスタンス数は100台を超えました。
社内MQ活用事例
ヤフーでは多くのサービスを展開しており、それぞれのサービス間のデータ連携やログの監視に多数のデータがやりとりされています。それらのサービスのバックエンドで社内MQが利用されています。
ここでは社内MQの典型的な3つ利用方法について触れていきたいと思います。
Queuing
利用サービス例: Yahoo!メールのBEシステムProducerは時間のかかるジョブなどをメッセージとしてPulsarにQueuingしており、ConsumerはPulsarからジョブを取り出して順番に処理を行っています。
複数のConsumerを用意することで、PulsarにQueueされたジョブを分散して処理しています。
また、メッセージ再送の仕組みを備えているため、メッセージの取得に失敗した際には再送が行われます。
Pub-Sub(Publish and Subscribe)
利用サービス例: ヤフオク!のオークションアラートProducerが決められたトピック対してメッセージを送信すると、そのトピックを購読している全てのConsumerに対して同じメッセージが送信されます。そのため、各Consumerのシステムが異なっていても同一のメッセージが送信可能です。
ヤフオク!のオークションアラートの場合、ユーザー設定や出品イベントが更新された際にPulsarに更新通知が送信されます。 通知が送信されたのち、マッチング処理システムが空き次第、設定値などのデータを取得して処理が実行される構成になっています。
Streaming
利用サービス例:ログ・メトリクス転送システムStreamingで構築されたシステムとして、社内向けログ・メトリクス転送システムの開発が行われています。
Producerは、ストリームとしてログなどのメッセージをPulsarに継続して送信します。
ログの解析はPulsarからConsumerを利用してデータを逐次取得することで処理行います。
間にPulsarを挟んでいるため、障害時などのログ流量が増加した際でもPulsarによるバッファリングを行うことが可能なため、ログの解析を行うシステムへの負荷を気にする必要がありません。
これらのスライドは9月に行われたPulsar Meetupでの登壇者のものです。
ユーザーサポート
社内MQを管理・運用しているMQチームでは、より多くのサービスで簡単・安全に社内MQを使ってもらえるようにさまざまなサポートや取り組みを行っています。
また、サービス向上のため社内アンケートなどを通して社内MQ利用者や利用検討中ユーザーの声を取り入れています。 例えば、Node.js Clientは社内の要望がきっかけで追加されました。
社内MQ利用者向けWebツールの提供
利用者が詳細なコマンドなどを学ぶ必要なく社内MQを導入するためのWebツールを提供しています。
利用者の負担軽減だけでなく、利用者自身が社内MQの設定作業を行うことでMQチームの作業削減にも一役かっています。
こちらのツールは社内で独自に実装したものですが、OSSにもPulsarのWeb UIツールがすでにリリースされています。 ヤフーの社内ツールとしてこちらを利用するかについては現在検討中です。
東西冗長構成(ジオレプリケーション)
ヤフーのサービスの中には災害時にこそ止めてはいけないサービスも存在します。 それらの基盤にも社内MQは使われており、複数のデータセンター間のレプリケーションを行っています。
このため、データセンターの1つが災害に見舞われて使えなくなっても他のデータセンターによってサービスを継続できます。
クライアント言語のサポート
サービスによって開発言語も異なるため、ユーザーが利用しやすいように多くのクライアント言語をサポートしています。
現在MQチームとしてサポートしている言語は以下の5つです:
- Java
- C++
- Python
- Node.js
- Golang
上記以外の言語でも対応できるようにWebsocketの提供も行っています。
Pulsarコミュニティ
業務として社内インフラを整備すると同時にOSSへの貢献も行っています。
OSS貢献として行っていることは下記の通りです。
社内環境で運用した際に発生したバグの修正や新規機能開発
ユーザーアンケートや運用で発見されたバグや不便さを社内で修正・開発して終わるのではなく、OSSへの反映も行います。
社内MQで利用しているPulsarは、基本的にOSSとして公開されているものをほとんどそのまま提供しています。
最新版がリリースされた際には、ヤフーの開発環境で検証を行っており、その際に発覚したバグなどは随時OSSへPull Requestとして投げています。 修正版リリースまでにどうじてもタイムラグが発生してしまうため、その間は社内版のみバグ修正のパッチを追加しています。
チーム内にPulsarのCommitterが複数人いるため、事前の確認も行いやすく、小さな修正ですが私も初めてOSSに貢献することができました。
Meetupイベントの主催やカンファレンスの参加
Pulsarの日本ユーザー会を主導しており、Meetupイベントを企画・運営しています。 また、海外のカンファレンスに参加もしています。
今年参加したカンファレンスの一覧は以下の通りです:
ヤフーのOSSの取り組みはこちらもご覧ください。
ヤフーにおけるOSS開発・貢献がどのように行われているか
最後に
この記事では、ヤフーのサービスを支えるMQ、Apache Pulsarについてお話ししてきました。
Apache Pulsarは、ヤフー以外の企業でも活用されています。来年には、各国のOSSコミッターが集まって開催するPulsar Summitが企画されています。
また、PulsarのMeetupイベントなどを不定期に開催しています。興味がある方はぜひご参加ください。 もちろんOSS開発の参加も大歓迎です。
最後までお読みいただきありがとうございました。
こちらの記事のご感想を聞かせください。
- 学びがある
- わかりやすい
- 新しい視点
ご感想ありがとうございました