このエントリはMagento Advent Calendar 2019の6日目です。

今回はMagento2.3系から加わった、非同期・バルク処理APIについて解説します。

Magento2.2までのREST APIの欠点

Magento2.2までのREST APIは大量のデータを一括更新する、ということが苦手でした。APIのリファレンスを見ていただくとわかると思いますが、1回のリクエストでは1件のデータしか更新できません。
少量のデータ更新であれば問題なくとも、大量のデータを一気に更新したい場合にはREST APIは不向きでした。しかもAPI呼び出しを行うと、Magento側が結果を返却するまではクライアントはタイムアウトまで待たされてしまい、次の処理ができませんでした。

非同期・バルク処理APIの仕組み

Magento2.3で導入された非同期・バルク処理APIは、前述のREST APIの欠点を補うために開発された機能です。
まとめて扱われていますが、正確には非同期APIがベースにあり、バルク処理APIがさらに追加される形になっています。

非同期APIの仕組み

非同期APIは、従来のREST APIと以下のように異なる動きをします。

同期API 非同期API
クライアントの待ち時間 処理が終わるまで 処理受け付けが終わるまで
結果の取得 処理の完了と同時 別途ステータス確認APIを使用
処理の予約 できない できる

非同期APIを使うと、呼び出し側はとにかくリクエストをMagentoに投げつけるだけでよくなります。
処理を行うMagento側は、定時バッチで一定件数ずつ受け付けた内容を処理するので、サーバー負荷も安定します。

反面、即座にリクエストが処理されるわけではないので、いつ処理が完了するかは確約されません。すぐに結果が欲しい場合は、従来からある同期APIを使うと良いでしょう。

バルク処理APIの仕組み

バルク処理APIは非同期APIをベースとし、1回のAPI呼び出しで複数件のデータ処理ができるようにしたものです。
バルク処理APIは以下の流れで動きます。

  1. クライアントからのリクエストを受け付ける
  2. 受け付けたリクエストに含まれている処理対象データを分解し、1件ずつのデータにする
  3. 1件ずつのデータをジョブとして登録し、ジョブIDを得る
  4. ジョブIDを含む受付結果をクライアントに返却する

以降は非同期APIと同じ流れとなり、Magentoの定時バッチによる処理に委ねます。

非同期・バルク処理APIのエンドポイント

非同期・バルク処理APIのエンドポイントは、現時点では以下のリクエストのみを受け付けています。

  • POST
  • PUT
  • PATCH(コア実装では未対応)

GETやDELETEは受け付けていないので、一括登録・更新はできますが、削除はできないと思ってください。

非同期APIのエンドポイント

非同期APIのエンドポイントは、以下のようになります。

  • POST http(s)://ドメイン名/rest/async/V1/products
  • PUT http(s)://ドメイン名/rest/async/V1/products/<商品SKU>

同期APIと比べると、「async」の文字が増えている点が異なります。

バルク処理APIのエンドポイント

バルク処理APIのエンドポイントは以下のようになります。

  • POST http(s)://ドメイン名/rest/async/bulk/V1/products
  • PUT http(s)://ドメイン名/rest/async/bulk/V1/products/byProductSku

こちらも「async/bulk」が増えていることがわかります。
また、商品SKUを指定していたところは「byProductSku」に変わり、更新対象の商品SKUはHTTPリクエストボディに記述する必要があります。

次回は非同期・バルク処理APIを使うための下準備について解説します。