azure - Azure Cosmos 会话一致性与同一区域中具有多个实例的微服务的有界陈旧一致性
问题描述
假设我正在开发一个社交媒体应用程序。我们在同一区域部署了多个后端服务实例。现在,每当重新加载应用程序页面时,后端服务实例之一将接收请求并联系 cosmos。问题如下-:
T1 - 已加载应用页面。服务实例 1 向 cosmos 发出读取请求。
T2 - 用户 A 添加的评论。服务的实例 2 在 cosmos 中发出了写入。
T3 - 再次加载应用页面。服务实例 3 向 cosmos 发出读取请求。
如果我们使用会话一致性,时间 T2 和 T3 的会话令牌将不同,因为写入查询由不同的实例发出,而读取查询由不同的实例发出。因此,可能会出现在时间 T3,当应用页面加载时,用户 A 添加的评论没有加载,因为会话一致性稀释到一致前缀,以防同一区域中的不同会话令牌。
为了解决这个问题,我们可以使用有限的陈旧性,但我认为这可能是矫枉过正。
我们如何处理这些具有会话一致性的多实例服务场景?
解决方案
使用会话令牌执行此操作的唯一方法是实现分布式互斥锁。虽然这会起作用,但它可能会对性能产生不利影响,因为令牌资源可能会在请求的高并发时被锁定。
Cosmos DB 中的所有写入都是多数仲裁(3/4 副本)。对于只有一个区域的帐户,Bounded staleness 通过执行 2 个副本读取,然后比较每个副本的 LSN 来确保没有过时的读取。如果 LSN 匹配,则数据是最新的并返回给客户端。如果 LSN 不匹配,则返回较高的,因为这将是最新的。
在执行分布式互斥体和使用有限陈旧性之间的权衡是构建分布式互斥体需要时间和精力,并且会对延迟产生不利影响。使用 Bounded Staleness 需要零努力,但每次读取的成本是 Session 的 2 倍,因为它是 2 副本读取,而不是具有 Session 一致性的单个副本。
推荐阅读
- docker - 如何使用 kubernetes 部署前端(Vue 或 React)+ Nginx?
- javascript - Vuex v-model 到对象状态字段
- java - 使用 WebView 加载时网站不可用
- mysql - Laravel 数据库连接被拒绝
- php - 如果页面来自我网站上的链接,如何仅允许访问该页面
- javascript - 未捕获的类型错误:cuadrito.getContext 不是 eventos.js:10 的函数
- visual-studio-code - 编译器 clang.exe 在 VSCode 上找不到标头
- c++ - 不同整数的数组相加
- java - Shell 脚本不作为 crontab 运行,而是手动运行
- python - 无法通过 OpenCV python 打开 Mac 网络摄像头