Service - Stock Location Standard

From Izara Wiki
Jump to navigation Jump to search

Overview

Handler service for basic stock locations that hold a quantity remaining per stock location and can reserve stock when building orders. One Stock Location can service many SellOffers, so each Stock Location keeps per SellOfferId list of quantities remaining.

Repository

https://bitbucket.org/izara-market-products/izara-market-products-stock-location-standard

DynamoDB tables

Standard Config Table Per Service

Configuration tags

{
	configTag: "StockLocationHandlerServiceNameTag"
	configKey: "StockLocationHandlerServiceNameTag"
	configValue: xxx // this own services ServiceNameTag, eg "StockLocationStandard"
}
{
	configTag: "ProductGraphServiceName"
	configKey: "ProductGraphServiceName"
	configValue: xxx // eg: "ProductGraph"
}
{
	configTag: "StockLocationManagerServiceName"
	configKey: "StockLocationManagerServiceName"
	configValue: xxx // eg: "StockLocationManager"
}

SellOfferStock

Remaining stock for one SellOffer.

{
	sellofferId
	stockRemaining
	stockReserved
	stockAvailable
    stockStatusProcessing
    stockUniqueRequestId
	//updateUuid: xxx // random number, used in conditional when updating count to protect against race conditions
}
  • partition key: sellofferId
  • sort key: (none)

Notes

  • updateUuid is no longer used.
  • SellOfferStock now uses stockStatusProcessing and stockUniqueRequestId to control concurrent updates and prevent race conditions.

stockStatusProcessing

  • Boolean field that indicates whether the SellOfferStock record is currently being processed by a request.
  • Set to true when the request acquires the lock and starts processing.
  • Set to false after stockRemaining, stockReserved, and stockAvailable have been updated.

stockUniqueRequestId

  • Stores the uniqueRequestId of the request that currently owns the lock.
  • Set when the request acquires the lock.
  • Removed at the end of the Lambda after all processing and final steps have been completed.

The stockUniqueRequestId must remain until the Lambda finishes because it identifies the request that owns the lock. Removing it too early could allow another request to acquire the lock while the current request is still completing its processing.

SellOfferReservedStock

Reserve stock when begin processing an order, one record per usage, once the order is successful we adjust SellOfferStock to reflect the change and change status of reserved stock.

{
	sellofferId
	reservedTimestampId
	quantity
	reservedStockStatus: updated|reserved|confirmed|cancelled
}
  • partition key: sellofferId
  • sortKey: reservedTimestampId
  • reservedTimestampId: {timestamp sent with request}_{uniqueRequestId}, this allows us to check idempotence and not reserve same request multiple times
  • records are not deleted once they are confirmed or cancelled, so a record is kept of changes

Notes

  • When finding or reserving stock for a SellOffer, query graph to find the StockLocation for the sellOffer (or have it saved in the SellOffer object), then query dynamoDB for stock levels
  • A SellOffer's link to StockLocation is immutable, cannot be changed

Working documents

Stock Location Standard