この記事は、RAKSUL Advent Calendar 2021 6日目の記事です。
まえがき
はじめまして、今年の4月にラクスルへ新卒のエンジニアとして入社しました喜屋武です。
入社以降、ラクスル事業本部のエンタープライズ事業部で法人向けのサービスをサーバサイドエンジニアとして開発しています。
私が所属しているエンタープライズ事業部が提供するサービスは、企業内のアカウントや注文の管理を行うことができる法人利用をラクにするラクスルの印刷サービスです。このサービスが提供している機能の1つとして、最近リリースしたデザイン管理という機能があります。
この機能の開発でデータ同期の手段として Kakfa を使ったため、このことについて書いていきたいと思います。
デザイン管理とは
ラクスルには、オンラインデザイン というサービスが存在します。このサービスはラクスルで印刷したい物のデザインを web 上で作ることが出来るサービスです。このサービス上で作ったデザインを他の人へ共有する場合は、共有設定をデザインごとにおこない、生成されたURLの受け渡しを行うことでデザインの共有ができます。ですが、このサービスを企業で利用しようとするとURLの管理を行わなければならず煩雑になってしまいます。
デザイン管理はこの課題を解決し、企業内でよりラクにデザインを共有できるようにした機能です。詳しい機能は、https://enterprise.raksul.com/features のデザイン管理の項目をご覧ください。
[caption id="attachment_5212" align="aligncenter" width="1024"] ラクスルのオンラインデザイン[/caption]
実現するための課題
この機能を実現するためにエンタープライズのサービスだけではなく、別サービスとしてラクスルが提供しているオンラインデザインのサービスと連携しなければなりませんでした。具体的に言うと、エンタープライズが持っている企業とユーザの関係性のマッピングのデータをオンラインデザイン側に提供する必要がありました。
また、オンラインデザイン上で企業が管理できるデザイン数を企業ごとにエンタープライズ側から制御したいという要望があり、エンタープライズで設定された情報をオンラインデザイン側に大きな遅延を発生させず同期を行う必要がありました。
実装した方法について
上記の課題を実現するために、Kafka というミドルウェアを一部に用いて連携を行いました。
Kafka とは
Kafka とは、分散メッセージキューのシステム間のデータの受け渡しを仲介しデータを一時的に保持するミドルウェアです。データの送り側を Producer、受け取り側をConsumerと呼びます。
メッセージキューを介してシステム間の通信を行うことで、システム間の接続経路を簡略化し、システムを疎結合に保つことができるようになります。
どのように連携を行ったか
エンタープライズ側では企業の登録や企業情報の更新を行うタイミングで Kafka に Produce するようにしました。このように Produce することで、Consume しているサービス(今回はオンラインデザイン)が自身に関係のある変更であれば、適切なタイミングでデータの更新を行うことが出来るようになります。
また、同期する必要が無いデータやログインしているユーザが初めてアクセスした時などオンラインデザイン側がデータを持っていない場合に関しては、RPCを使ってデータの受け渡しを行うようにしました。ここでいうデータを同期する必要が無いものとは、オンラインデザイン上にエンタープライズ側の情報を保存していないデータです。
上記のフローを図に表すと以下のようになります。
なぜ Kafka を使ったのか
データを同期する手段としては、 Kafka 以外にも Webhook や API などが他の方法として挙げられると思います。
仮に Webhook や API を使うとするとエンタープライズはオンラインデザインの URL やオンラインデザインから返ってくる HTTP ステータスコードなどに依存してしまうことになります。今回のように Kafka を使うことでエンタープライズは、オンラインデザインのシステムに関心を持たずデータを提供するだけのシステムとして存在することができます。
また、 Kafka を使うことで今後オンラインデザイン以外のシステムがエンタープライズの企業情報を同期しつつデータを使いたいというケースが発生したとしても Kafka を見に行くだけで情報が取れるようになります。
また、メッセージキューのミドルウェアはいくつかありますがその中でも Kafka を選んだ理由としては、ラクスル内で Kafka を使った実績が他にもあり社内の知見を活かすことができたからです。
まとめ
今回はサブドメインのサービス間のデータの同期に Kafka を使った内容について書きました。
今回のケースでは、Kafka を使うことでシステム間を疎結合にすることができました。このように関心があるサービスをできるだけ少なくすることで保守性もあがり今後の拡張も容易になると思うので、今後も有効なケースがあれば積極的に使っていきたいと思います。