为了最好地解释我的目标,我会将问题简化为我的要求的基础知识。如果需要更多详细信息,请告知我们。
假设我有10个可用于分配的唯一数字(0-9)。数据库包含哪些数字保留或免费。运行前端Web服务的目标是成功请求编号以进行分配。一旦将该号码分配给特定节点,就会保留该号码,并且没有其他节点可以分配该号码。
请记住,这是一个没有单点故障的分布式系统。
给我带来麻烦的警告是卡桑德拉最终的一致性概念。请注意,我可以将Cassandra调整为完全一致,但代价是延迟更高。如果这是我最好的(也可能是唯一的)选项,我可以做到,但我想保留一致性调整的概念。
我对策略的看法是在节点上执行以下操作:
1)查询Cassandra以获取免费号码列表。
2)随机选择一个免费号码。
3)对Cassandra执行Put,称此节点已保留该号码。
4)连续查询Cassandra以查看哪个节点成功保留了该号码。 (继续请求,因为阅读可能不会立即反映作业。)
5)如果返回的节点名称是提交此节点预订的名称,则预订成功。
6)如果返回的节点名称是不同的节点名称,则意味着另一个节点在与该节点名称大致相同的时间请求该号码,并且被赋予了分配。此节点必须返回步骤1并重试。
我有一种奇怪的感觉,如果我使用上述策略,特定情况会导致错误(双重分配等)。
其他人可以评论我提出的策略,并可能提供自己的策略吗?感谢。
答案 0 :(得分:2)
您可能需要查看Apache ZooKeeper。看起来它正是你所需要的。您可以使用ZooKeeper获取新的分配,并将现有的分配存储在Cassandra中。
答案 1 :(得分:0)
根据您的应用程序,您真的需要从一组固定的数字中选择一个吗?如果您只需要选择其他节点未选择的唯一编号,则可以通过为每个节点生成UUID(通用唯一标识符)来完成此操作,例如:与http://docs.python.org/library/uuid.html。