我目前正在使用 dynamoDB 实现聊天服务器。
这是 ChatData 表中的键
- 主分区键:roomNo
- 主排序键:seq
聊天服务器,可以创建多个即时房间,每天大约100~120个。所以我选择了主分区键作为房间号(roomNo),并在seq上按数据创建时间(或顺序值)排序。
我想自动增加 seq,但是,我知道 DynamoDB 不支持auto_increment
or identity
。所以,我将尝试使用Timestamp
或AtomicLong
从我的客户端应用程序(JAVA 1.8)。
但是,每个都有问题。首先, Timestamp
, 可能会在表中插入重复值。
并且AtomicLong
,可以增加原子值,但是当我重新启动我的应用程序时,它又从 1 开始。
也许如果我可以seq
从 DynamoDB 中获得最大价值,我应该使用什么?或者如何改变桌子上的钥匙?
我认为您在正确的轨道上使用
AtomicLong
,但是每次您的应用程序开始确定要从哪个值开始时,您都必须运行扫描操作。您需要对此进行测试以确保它不会过多地降低性能。另一种选择是元数据项。您可以为此创建一个额外的表,或者您可以使用一个永远不会存在的哈希属性值将一个项目添加到您现有的表中(因此它不会与您的应用程序冲突,并且可以使用其众所周知的轻松检索价值)。存储您的应用程序需要了解的名称/值对(例如
lastSeq
),并根据需要使用条件写入来更改它(例如,增量lastSeq
但仅当当前值为 时234
)。如果客户端应用程序有多个实例,您将需要考虑争用以及这可能会如何影响事情;使用条件写入应该可以缓解这种情况(但您需要在每次创建项目时查询和更新元数据项目)。
您可以在 AWS DynamoDB 开发人员指南中阅读有关条件写入的更多信息。