何时使用书签(Bookmarks)
书签属于一个更大的主题:Causal consistency。在进一步阅读之前,我们建议先阅读 Neo4j 因果集群简介 以及 Neo4j 因果集群的生命周期。请特别留意 因果一致性解释。
书签确保在从集群读取数据时,所读取的数据代表用户对图的最新视图。当使用带书签的事务时,实际上是表示:“仅在能够满足此书签(即已处理并应用该书签)时才使用特定实例”。
不幸的是,在何时使用书签这一点上并不存在“一刀切”的情形。如果回顾上面关于 Raft 以及事务向追随者传播的所有信息(上面的链接),我们可以得出以下结论:
-
数据传播的速度可按(从快到慢的数据可用性)划分为:
-
主节点 (Leader)
-
多数追随者
-
其余追随者和读取副本
-
-
领袖拥有所有事务,并且始终是最新的实例
-
由于 Raft 的特性,多数追随者已拥有事务(但可能尚未应用)
-
其余追随者(以及读取副本)会在稍后时间最终获得这些事务
基于这些信息,您可以做出如下设计选择:
-
对于必须读取自己写入的查询,请使用书签,并且
-
对延迟敏感的直接读取查询发送至领袖1,使用 bolt 进行直接连接,而非 bolt+routing。
-
对延迟不敏感的其他查询,请使用 bolt+routing(这些查询将被路由到追随者)
-
-
对于不需要最新图视图的其他查询,请勿使用书签(这些查询将被路由到随机的追随者/读取副本)
|
1 在决定将直接读取事务发送至领袖时请谨慎。您需要避免对领袖造成过大压力,以致其无法再处理更多请求。更多相关信息请参阅此处。 |
这只是一个示例,但通过直接/路由连接与书签的组合,完全可以实现上述方案。请记住,书签在事务级别上生效,这意味着您可以根据需要进行微调,以获得最佳吞吐量和使用体验。您可能会为不同的客户端设置不同的一致性和数据可用性需求,并据此在客户端层面调整书签的使用方式。
此页面有帮助吗?