假设我正在开发一个社交媒体应用程序。我们在同一地域部署了多个后端服务实例。现在,每当应用程序页面重新加载时,后端服务的其中一个实例将收到请求并联系cosmos。问题出在-:
T1 -已加载应用程序页面。服务的实例1向cosmos发出读取请求。
T2 -用户A添加的评论。服务的实例2发出了cosmos的写入。
T3 -应用程序页面再次加载。服务的实例3向cosmos发出读请求。
如果我们使用会话一致性,则time T2和T3的会话令牌将不同,因为写查询由不同的实例发出,读查询由不同的实例发出。因此,可能会发生在T3时,当加载应用页面时,用户A添加的评论未被加载,因为在同一区域中不同会话令牌的情况下,会话一致性稀释为一致前缀。
为了解决这个问题,我们可以使用有界陈旧,但我认为这可能是一种夸张的做法。
我们如何处理这些具有会话一致性的多实例服务场景?
发布于 2021-04-02 23:22:52
使用会话令牌做到这一点的唯一方法是实现分布式互斥。虽然这将起作用,但它可能会对性能产生不利影响,因为当请求的并发性很高时,令牌资源可能会被锁定。
Cosmos DB中的所有写入都是多数仲裁(3/4副本)。对于仅具有单个区域的帐户,通过执行2个副本读取,然后比较来自每个副本的LSN,限定的过时可确保不会发生过时读取。如果LSN匹配,则数据是最新的,并返回给客户端。如果LSN不匹配,它将返回较高的LSN,因为这将是最新的。
在这里,使用分布式互斥和使用有界失效之间的权衡是构建分布式互斥需要时间和精力,并且会对延迟产生负面影响。使用有界过时不需要付出任何努力,但每次读取的成本是会话的2倍,因为它是2个副本读取,而不是具有会话一致性的单个副本。
https://stackoverflow.com/questions/66914296
复制相似问题