こんにちは、システム開発事業部の加藤です。
この記事について
ecサイトで引当在庫を実装について業務で考えることがありました。
この記事では、実装にあたって考えたことを共有します。
引当在庫とは
実在庫の中で、特定の用途やお客さんに割り当てるために確保された在庫です。
以下、chat gpt による回答の引用です。
在庫引当の意味「引当在庫」とは、ECサイト上で商品が注文された際に、その商品を「販売用」として予約(引き当て)することを意味します。このプロセスにより、注文された商品が他の顧客に売れてしまうのを防ぎます。
この記事では、カートに商品を追加した場合に、その商品の在庫をきちんと用意しておくために確保される在庫という用途で引当在庫を利用します。
引き当てを行うタイミング、引き当てを解除するタイミングは要件次第で変わります。
実装にあたって考えたこと
購入完了までの正常な場合
以下カートに追加段階で、在庫を確保する場合で考えます。
カート追加した際に、データベースで管理している実在庫の数を減らします。
この際に、減らした実在庫と同じ数だけ引当在庫のデータを保存します。
ユーザーが購入に成功した場合は、保存した引当在庫のデータを削除します。
実在庫と引当在庫はデータベース上に保存されており、在庫の増減時には当然トランザクション管理が必要です。
購入できなかった場合
途中でサイトを離脱する等で購入処理まで行わなかった場合、
何も対応しなかった場合、不整合が生じてしまうので、減らした分の在庫を元に戻す必要があります。
以下、流れです。
まず、正常なケースと同じようにカートに追加した段階で実在庫を減らし、引当在庫も確保します。
この後に、ユーザーが何らかの原因で購入が行えなかった場合、
定期的に確保している引当在庫の有効期限が切れたものを確認し、期限が切れているものがあれば、引当在庫を解除した上で、在庫を元に戻します(確保していた数だけ増やします)。
何をもって有効期限が切れたとするかは検討の必要があります。数分、数時間の間、ユーザーがセッションを維持している間などです。
最後に
他にも、カート追加時にデータベースの実在庫データは減らさずに、引当在庫を追加し、
実在庫数 - 引当在庫数 = 有効在庫数(ユーザーが購入できる在庫)
とすることも考えました。
しかし、こうなるとユーザーが購入できる在庫を計算したい場合に毎回、
実在庫と引当在庫の両方を確認する必要があり、面倒なのと負荷が増加しそうだったので今回の方法を採用しました。
何か参考になれば嬉しいです。