为了最好地解释我的目标,我将把问题简化为我的基本要求。请让我知道是否需要更多详细信息以清楚起见。
假设我有 10 个可分配的唯一数字 (0-9)。哪些号码被保留或空闲由数据库包含。正在运行的前端 Web 服务的目标是成功请求分配号码。一旦将编号分配给特定节点,它就会被保留,其他节点不能分配它。
请记住,这是一个没有单点故障的分布式系统。
给我带来麻烦的警告是 Cassandra 的最终一致性概念。请注意,我可以以更高的延迟为代价将 Cassandra 调整为完全一致。如果这是我最好的(也可能是唯一的)选择,我可以做到,但我想保留一致性调整的概念。
我对策略的想法是在节点上执行以下操作:
1) 查询 Cassandra 以获取空闲号码列表。
2)随机选择一个空闲号码。
3) 对 Cassandra 执行 Put,说明该节点已保留该号码。
4)不断查询Cassandra,看哪个节点成功预留了号码。(不断请求,因为读取可能不会立即反映分配。)
5)如果返回的节点名称是该节点的预留被归档的名称,则预留成功。
6) 如果返回的节点名是不同的节点名,则表示另一个节点与这个节点几乎同时请求该号码,并被分配。此节点必须返回步骤 1 并重试。
我有一种奇怪的感觉,如果我使用上述策略,特定情况会导致错误(双重赋值等)。
其他人可以评论我提出的策略,并可能提供他们自己的吗?谢谢。