与分区 Service Fabric 有状态服务的一致性
Consistency with partitioned Service Fabric stateful service
举个简单的例子。我有一个管理用户的有状态服务。它有一个可靠的字典,可以将 UserID 映射到一些数据,包括用户名。
在此服务的 RegisterUser 方法中,我们要检查用户名是否尚未被使用。当服务是单例时,这是非常简单的,但是当它被分区时,我们最终会遇到几个问题:
- 如果用户已经存在,我们必须询问所有分区。我们可能会引入另一个将用户名映射到用户 ID 的单例服务来解决这个问题。
- 存在竞争条件。两个用户可以尝试同时注册名称user name。两个用户都有可能成功。
我正在寻找处理此类情况的可能方法的一般性建议。我可以想象这种问题会经常发生在分区数据上。
这通常通过本质上是原子的外部数据存储来解决。使用像 SQL 数据库这样的事务性数据存储来存储用户 names/ids。这将允许您执行诸如创建唯一约束以强制这些用户名的唯一性之类的事情。
由于客户端应用程序在这种情况下需要立即响应,而不依赖于来自 actor/service 的其他状态,我认为无状态服务将是更好的选择。您依赖的状态是来自外部存储的数据,例如数据库。
由于 none 的现有答案直接解决了您的问题(无论建议如何有效),我将回答您的原始问题以备案:
- 通常您会使用某种确定性分区方案,例如范围分区 - 例如,如果您需要搜索用户 'foo',您会搜索 F 分区(或 E-G 分区) 而不是每个分区。
- SF 可靠 collections 使用可以保护您免受竞争条件副作用影响的事务。阅读此内容了解更多详情:https://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-services-reliable-collections/#persistence-model
您的标题谈到了一致性级别 - Service Fabric 中的所有操作都是高度一致的,这意味着写入将在确认之前在所有副本中提交。
SF中的可靠集合可用于并发事务,并由Service fabric保证一致性。如果您跨分区使用相同的词典,您将不会因分区而面临任何问题。当您需要同时更新两个字典并且每个字典中都有依赖数据时,问题就变得复杂了。在这种情况下,您可以使用 "Saga" 模式或 "Twophase commit" 模式等模式。
更多信息请参考https://docs.microsoft.com/en-gb/azure/service-fabric/service-fabric-reliable-services-reliable-collections#persistence-model:
Reliable Collections 提供开箱即用的强一致性保证,使应用程序状态的推理更加容易。强一致性是通过确保事务提交仅在整个事务已记录在大多数副本(包括主副本)上后完成来实现的。为了实现较弱的一致性,应用程序可以在异步提交 returns.
之前确认回 client/requester
可靠字典:表示 key/value 对的复制、事务和异步集合。类似于ConcurrentDictionary,key和value都可以是任意类型。
举个简单的例子。我有一个管理用户的有状态服务。它有一个可靠的字典,可以将 UserID 映射到一些数据,包括用户名。
在此服务的 RegisterUser 方法中,我们要检查用户名是否尚未被使用。当服务是单例时,这是非常简单的,但是当它被分区时,我们最终会遇到几个问题:
- 如果用户已经存在,我们必须询问所有分区。我们可能会引入另一个将用户名映射到用户 ID 的单例服务来解决这个问题。
- 存在竞争条件。两个用户可以尝试同时注册名称user name。两个用户都有可能成功。
我正在寻找处理此类情况的可能方法的一般性建议。我可以想象这种问题会经常发生在分区数据上。
这通常通过本质上是原子的外部数据存储来解决。使用像 SQL 数据库这样的事务性数据存储来存储用户 names/ids。这将允许您执行诸如创建唯一约束以强制这些用户名的唯一性之类的事情。
由于客户端应用程序在这种情况下需要立即响应,而不依赖于来自 actor/service 的其他状态,我认为无状态服务将是更好的选择。您依赖的状态是来自外部存储的数据,例如数据库。
由于 none 的现有答案直接解决了您的问题(无论建议如何有效),我将回答您的原始问题以备案:
- 通常您会使用某种确定性分区方案,例如范围分区 - 例如,如果您需要搜索用户 'foo',您会搜索 F 分区(或 E-G 分区) 而不是每个分区。
- SF 可靠 collections 使用可以保护您免受竞争条件副作用影响的事务。阅读此内容了解更多详情:https://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-services-reliable-collections/#persistence-model
您的标题谈到了一致性级别 - Service Fabric 中的所有操作都是高度一致的,这意味着写入将在确认之前在所有副本中提交。
SF中的可靠集合可用于并发事务,并由Service fabric保证一致性。如果您跨分区使用相同的词典,您将不会因分区而面临任何问题。当您需要同时更新两个字典并且每个字典中都有依赖数据时,问题就变得复杂了。在这种情况下,您可以使用 "Saga" 模式或 "Twophase commit" 模式等模式。
更多信息请参考https://docs.microsoft.com/en-gb/azure/service-fabric/service-fabric-reliable-services-reliable-collections#persistence-model: Reliable Collections 提供开箱即用的强一致性保证,使应用程序状态的推理更加容易。强一致性是通过确保事务提交仅在整个事务已记录在大多数副本(包括主副本)上后完成来实现的。为了实现较弱的一致性,应用程序可以在异步提交 returns.
之前确认回 client/requester可靠字典:表示 key/value 对的复制、事务和异步集合。类似于ConcurrentDictionary,key和value都可以是任意类型。