1

我需要为我的同步数据库客户端预先分配简洁的整数主键(从一个连续的范围)。

用例非常简单:在移动客户端连接断断续续的情况下,我需要打印带有短序列号的票证。这些数字必须足够短,以便在嘈杂的环境中通过糟糕的 PA 系统读取,从而获得门奖。

Realm 似乎非常适合这项任务——但我需要允许每个客户端在连接到服务器时为自己预先分配一个保证唯一序列号池,以便他们可以稍后打印票证,即使在离线时也是如此。

class TicketNumber extends RealmObject { 
    @PrimaryKey int serialNumber;
    String clientId; // instance identifier unique to each client
}

我的意图是客户端 A 执行事务以创建从 max(serialNumber)+1 开始的一堆TicketNumber对象,并在每个对象上设置自己的 clientId。如果客户端 B 已经TicketNumber在该范围内创建了对象,我希望我可以依靠事务失败(抛出 ObjectExists)。

但是,如果客户端 A 或客户端 B 在创建时断开连接,它将愉快地在同一范围内创建本地副本。当同步发生时,它将clientId冲突对象的 设置为最后“创建”它的任何客户端。显然,如果两个客户都已经打印了具有相同序列号的票,这对我来说是个问题。

正如我所看到的,为了保证客户对票号的所有权,我需要“在线优先”创建对象,这样我就可以观察并应对冲突。有没有办法知道领域客户端的连接状态?我想要做的甚至可能吗?我必须等待柜台可用吗?

4

1 回答 1

0

跨分布式设备生成本地 ID 的最简单方法不是使用整数和受限范围,而是 UUID:UUID.randomUUID().toString()应该足够好,因为它是一个 128 位值。硬件故障或地球射线交换位的可能性大于两个设备上的两个密钥相同。

这基本上也是所有其他分布式数据库所做的。

于 2016-12-05T08:44:13.080 回答