库存管理服务的优化设计

问题描述

一个库存管理系统,可以接收新库存、为订单分配库存、在结账页面保留库存。在任何给定的时间点,系统都应该能够在 {productId,storeId} 级别告知可用库存。实体看起来像:

新库存

{
    "storeId": "100001-W101","productId": "100001123456","quantity": 5
}

分配的库存

{
    "storeId": "100001-W101","quantity": 1
}

[以上表示已在此 storeId 为该 productId 分配了 1 个订单]

预留库存

{
    "storeId": "100001-W101","cartId: "123","expireTime": 1622962817,"quantity": 2
}
{
    "storeId": "100001-W101","cartId: "113","expireTime": 1622962819,"quantity": 1
}

[以上表示该 storeId 已经预留了 3 个该 productId 数量]

因此,storeId: 100001-W101productId: 100001123456 的可用库存为:

5 (onhand) - 1 (allocated) - 2 (reserved) - 1 (reserved) = 1

每当超过 expireTime(以纪元毫秒为单位)时,都需要删除保留条目

我们可以清楚地看到,对于保留实体,我们需要在 {productId,storeId} 级别进行聚合。

如果我们可以快速查询分配数量和预留数量,那么可用库存的计算将非常容易。

考虑redis

我们可以将这些实体存储为键值对,例如:

INHAND#PRODUCTID#STOREID: 5

ALLOCATED#PRODUCTID#STOREID: 1

RESERVED#PRODUCTID#STOREID#CARTID: {"qty" : 2,"expiry": 1622962819}

在这种情况下查找会非常快,但是在保留的情况下聚合会很困难!!为了克服这个问题,我们可以这样做:

RESERVED#PRODUCTID#STOREID: [{"cart":"123","qty" : 2,"expiry": 1622962819},{"cart":"113","qty" : 1,"expiry": 1622962817}]

但是这个列表可能会增长,并且它可能会溢出 redis 中允许的记录大小。

此外,是否可以使用 redis TTL 概念来自动使这些保留条目过期(我们需要 100% 保证它在正确的过期时间发生,因为这是核心业务逻辑)?

如果没有,我们可以编写一个调度程序来获取所有以 KEYS RESERVED* 开头的键,但这是一个好主意吗?我能否在我的应用层逐个迭代这些键?

考虑其他数据库

我应该考虑将时间序列数据库之类的东西作为我的数据存储吗?读写速度够快吗?

Edit-1:保留的对象在任何给定时间都不会超过 5k,因为我们在到期后(2 分钟)刷新这些对象,或者在成功下订单后将它们移动到分配的存储桶.

Postgres 在这里工作吗?因为拥有一个完整的时间序列数据库会有点矫枉过正

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)