SQSで処理を非同期化したらストレスフリーになった

f:id:cocoeyes02:20180725091923j:plain

こんにちは。サグーワークス開発チームに所属している大津です。

サグーワークス開発で Amazon Simple Queue Service (以下 SQS と呼ぶ)をサービスに導入したので、SQS の紹介と実際に導入した例を紹介したいと思います!

今回は他のメッセージキューイングサービスなどには触れず、あくまで SQS にテーマをしぼってお話ししていきます。

SQS とは?

SQS は AWS ( Amazon Web Services )が提供しているメッセージキューイングサービスです。

キューへメッセージを送信、あるいはキューからメッセージを受信・削除をすることができるシンプルなサービスになります。

キューを介してメッセージを送受信することで、異なるシステム同士でデータの送受信ができます。

メッセージキューイングサービスのメリット

メッセージキューイングサービスの最大のメリットは、システム同士が同期していなくてもメッセージのやりとりができることにあります。

それぞれシステムが好きなタイミングでメッセージを送受信することができます。

SQSを導入 -導入背景-

CRM からサグーワークスへ自動で情報を登録したい

サグーワークスには運営者用の管理機能があります。

それとは別に、CRMでも情報を管理しています。

サグーワークス上でも CRM で管理している顧客情報が必要だったので、CRM からサグーワークスへ手動で顧客情報を登録していました。

以下がその手順と図になります。

f:id:cocoeyes02:20180904095301p:plain

  1. CRM から サグーワークス DB に保存したい顧客情報を確認する
  2. 管理画面から手動で顧客情報をサグーワークス DB に登録する

手動で顧客情報をサグーワークス DB に登録するため、この方法では手間がかかるという問題がありました。

そこで、自動化も含めて運営者用の管理機能をリニューアルしようという話になりました。

仕様変更の影響を減らしたい

自動で顧客情報をサグーワークス DB へ登録するにあたって1つ問題がありました。

CRM でデータの持ち方に関する仕様変更があったとき、サグーワークスのシステムでもあわせて変更する必要がありました。

どう解決するか悩みましたが、「ロジック」と「タイミング」2つのアプローチで仕様変更の影響を減らすことに決めました。

ロジックを分けて疎結合にする

CRM 周りのロジックは「 CRM から顧客情報を取得するロジック」と「取得した情報を保存するロジック」の2つに分けて疎結合にします。

もし CRM 側で仕様変更があっても、「 CRM から顧客情報を取得するロジック」だけ修正すれば対応することができます。

タイミングを分けて処理を非同期にする

CRM への顧客情報を取得する処理とそれ以外のサグーワークスの処理を非同期にします。

そうすることで、CRM への顧客情報を取得する処理でエラーがあっても、それ以外のサグーワークスの処理は実行されます。

これで、他の処理まで実行できなくなるという事態を避けることができます。

条件を満たしたい

「ロジックを分けて疎結合にする」「タイミングを分けて処理を非同期にする」を満たす方法を調べました。

すると SQS を利用すれば上記の条件を満たせることがわかり、SQS を利用することに決めました!

SQSを導入 -利用例-

サグーワークスの運営者用の管理機能を使って顧客情報を登録するとき、手動で CRM に顧客情報を確認しなくても良いように、顧客情報を取り込むバッチを作成しました。

以下がその手順と図になります。

f:id:cocoeyes02:20180904095035p:plain

  1. 管理画面から顧客を指定し、メッセージ(顧客 ID )を SQS に送る
  2. バッチが SQS からメッセージ(顧客 ID )を取得する
  3. バッチが顧客 ID を使って顧客情報を CRM から取得する
  4. バッチが顧客情報をサグーワークス DB に登録する
  5. サグーワークス DB に登録に成功した時は、バッチが登録成功した(あるいは既に登録されている)メッセージ(顧客 ID )を SQS から削除する

バッチと SQS を使うことで、CRM 関連の処理とそれ以外の処理を非同期化することができました。

終わりに

CRM など外部からの仕様変更の影響を減らしたい時には、SQS はとても有効です。

皆さんも是非、プロダクトに導入してみてはいかがでしょうか!