与分区的Service Fabric状态服务保持一致

时间:2016-04-12 12:51:14

标签: architecture microservices consistency azure-service-fabric

我们举一个简单的例子。我有一个管理用户的有状态服务。它有一个可靠的字典,可以将UserID映射到某些数据,包括用户名。

在此服务的RegisterUser方法中,我们要检查用户名是否尚未使用过。当服务是单例时,这是非常简单的,但是当它被分区时,我们最终会遇到几个问题:

  1. 如果用户已经存在,我们必须询问所有分区。我们可能会引入另一个将用户名映射到用户ID的单例服务来克服这个问题。
  2. 有竞争条件。两个用户可以尝试同时注册名称用户名。两个用户都有可能成功。
  3. 我正在寻找有关处理此类情况的可能方法的一般建议。我可以想象这种问题会经常发生在分区数据上。

4 个答案:

答案 0 :(得分:0)

这通常通过本质上是原子的外部数据存储来解决。使用事务数据存储(如SQL数据库)来存储用户名/ ID。这将允许您执行诸如创建唯一约束以强制实现这些用户名的唯一性之类的事情。

答案 1 :(得分:0)

由于这种情况下的客户端应用需要立即响应,而不依赖于演员/服务的其他状态,我认为无状态服务将是更好的选择。您所依赖的状态是来自外部存储的数据,如数据库。

答案 2 :(得分:0)

由于现有的答案都没有直接解决您的问题(无论有效的建议),我都会回答您的原始问题以备记录:

  1. 通常你会使用某种确定性分区方案,例如范围分区 - 例如,如果你需要搜索用户' foo'你会搜索F分区(或E-G分区)而不是每个分区。
  2. SF可靠集合使用的交易可能会保护您免受竞争条件的副作用。请阅读此内容以获取更多详细信息:https://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-services-reliable-collections/#persistence-model
  3. 您的标题涉及一致性级别 - Service Fabric中的所有操作都非常一致,这意味着在执行之前将在所有副本中提交写入。

答案 3 :(得分:0)

SF中的可靠集合可用于并发事务,并且Service Fabric保证一致性。如果您在分区中使用相同的dictiornary,则不会因分区而遇到任何问题。当您需要同时更新两个系统时,问题变得复杂,并且您已在每个字典中依赖数据。在这种情况下,您可以使用“Saga”模式或“Twophase commit”模式等模式。

有关详细信息,请参阅https://docs.microsoft.com/en-gb/azure/service-fabric/service-fabric-reliable-services-reliable-collections#persistence-model: 可靠的集合提供了强大的一致性保证,可以更轻松地推断应用程序状态。通过确保事务提交仅在整个事务已记录在大多数法定数量的副本(包括主副本)之后才能实现强一致性。为了实现较弱的一致性,应用程序可以在异步提交返回之前确认回客户端/请求者。

Reliable Dictionary:表示键/值对的复制,事务和异步集合。与ConcurrentDictionary类似,键和值都可以是任何类型。