Apiを通した大量データの処理時間改善について

カスタムアプリで、大量の注文データの中から特定の商品(バリエーション)を含むものを検索する機能を開発しています。

カスタムアプリの開発環境は以下の通りです。

  • Ruby on Rails v6.0.3 + shopify_api gem v9.2.0

以下のコードの通り、REST API を通して Order を大量に取得し、それぞれの Order の LineItem に検索したバリエーションが含まれるかどうかを走査するという実装を行いました。

class Order < ShopifyAPI::Order> MAX_ORDER_LIMIT_PER_PAGE = 250> > class << self> def all_pages(per_page = Order::MAX_ORDER_LIMIT_PER_PAGE)> all_orders = > page = 1> orders = Order.find(:all, params: {limit: per_page})> all_orders << orders> while orders.next_page?> page += 1> orders = orders.fetch_next_page> all_orders << orders> end> all_orders.flatten> end> > # !! このメソッドが遅い> def find_by_variant_id(variant_id)> orders = > Order.all_pages.each do |order|> if order.paid?> if order.line_items.find { |line_item|> line_item.variant_id == variant_id.to_i> }> orders << order> end> end> end> orders> end> end

上記コードの処理速度がかなり遅く(数十件注文のデータの検索に、数十秒かかる)、困っています。

数十から数百の注文データから特定商品を含むデータを検索するにあたって、より良いコードの書き方があれば、教えていただけると有り難いです。

GraphQLのご利用をお勧めします。

https://shopify.dev/docs/admin-api/graphql/reference

https://shopify.dev/docs/admin-api/graphql/reference/bulk-operations/bulkoperation

1 Like

@junichiokamura さん、ご回答ありがとうございます。

GraphQL も試しに使ってみたのですが、「ある商品(Variant)を、明細(lineItems)含む注文(Order)」を1リクエストで処理できなかった事もあり、期待していたほど速度が出ず、もあきらかけていました。

ただ、BulkOperation については知りませんでした。

教えていただいてありがとうございます!

少なくとも、これでリクエストのタイムアウトは防げそうな気がしました。

試してみます。

なるほど。

扱っているデータは違いますが、以下のようなブログもあるので参考にしてみてください。

https://www.shopify.jp/blog/partner-graphql-shopify-metafields

1 Like

様々な情報を共有していただき、ありがとうございます!

上のブログの記事も参考にさせていただきます!!