知识库

何时使用书签(Bookmarks)

书签属于一个更大的主题:Causal consistency。在进一步阅读之前,我们建议先阅读 Neo4j 因果集群简介 以及 Neo4j 因果集群的生命周期。请特别留意 因果一致性解释

书签确保在从集群读取数据时,所读取的数据代表用户对图的最新视图。当使用带书签的事务时,实际上是表示:“仅在能够满足此书签(即已处理并应用该书签)时才使用特定实例”。

不幸的是,在何时使用书签这一点上并不存在“一刀切”的情形。如果回顾上面关于 Raft 以及事务向追随者传播的所有信息(上面的链接),我们可以得出以下结论:

  • 数据传播的速度可按(从快到慢的数据可用性)划分为:

    1. 主节点 (Leader)

    2. 多数追随者

    3. 其余追随者和读取副本

  • 领袖拥有所有事务,并且始终是最新的实例

  • 由于 Raft 的特性,多数追随者已拥有事务(但可能尚未应用)

  • 其余追随者(以及读取副本)会在稍后时间最终获得这些事务

基于这些信息,您可以做出如下设计选择:

  • 对于必须读取自己写入的查询,请使用书签,并且

    1. 对延迟敏感的直接读取查询发送至领袖1,使用 bolt 进行直接连接,而非 bolt+routing

    2. 对延迟不敏感的其他查询,请使用 bolt+routing(这些查询将被路由到追随者)

  • 对于不需要最新图视图的其他查询,请勿使用书签(这些查询将被路由到随机的追随者/读取副本)

1 在决定将直接读取事务发送至领袖时请谨慎。您需要避免对领袖造成过大压力,以致其无法再处理更多请求。更多相关信息请参阅此处

这只是一个示例,但通过直接/路由连接与书签的组合,完全可以实现上述方案。请记住,书签在事务级别上生效,这意味着您可以根据需要进行微调,以获得最佳吞吐量和使用体验。您可能会为不同的客户端设置不同的一致性和数据可用性需求,并据此在客户端层面调整书签的使用方式。

© . This site is unofficial and not affiliated with Neo4j, Inc.