【问题标题】:py2neo and eventual consistency?py2neo 和最终的一致性?
【发布时间】:2018-03-02 22:27:32
【问题描述】:

我正在使用来自 Flask 调试服务器的 Py2Neo 3 (v3.1.1) 来访问 Neo4j。

Neo4j 服务器是 Ubuntu 16.04 上的基本 apt-get'd Neo4j 服务器 (3.3.3)。 Py2Neo 正在使用 Bolt 端口。

当更新 Neo4j 数据库的 Flask 请求时

tx = graph.begin();
....
tx.commit();

之后是同一客户端在四秒或更长时间内发出的请求,95% 的时间第二次查询的结果不会反映几秒前刚刚发生的更新。但是如果另一个客户端在更新后立即通过 Flask 服务器查询数据库,它每次都会看到更新的数据。似乎,如果第二个客户这样做,第一个客户看到旧数据的可能性下降到大约 75%。

我很确定 Neo4j 没有在因果一致模式下运行。 (我在安装 Neo4j 时进行了简单的 apt-get 安装。)我如何确认这一点?

我相信 Flask 服务器对所有请求都使用相同的 Py2Neo 图形对象。

正如您在上面看到的,Py2Neo 更新请求确实使用了显式事务,然后是显式 tx.commit()。但是该图形对象已用于一些自动提交查询以及显式事务之外。

我在 Py2Neo 3 文档中没有看到任何提及“因果”或“最终”或“缓存”的内容。

你有什么建议?

--- 更新 1 -----

这似乎不是 Neo4j 服务器的问题。打开 Py2Neo.watch('neo4j.bolt') 显示 Py2Neo 发送正确的请求到 Neo4j 服务器和更新的数据由 Py2Neo 从 Neo4j 服务器。但是 Py2Neo Cursor.data() 揭示了旧数据被返回给应用程序,尽管服务器为 Py2Neo 提供了新数据。

【问题讨论】:

    标签: flask neo4j py2neo


    【解决方案1】:

    实际上可以在这里找到部分答案:Is py2neo caching burning me?

    引用的页面表明您可能会从调用 my_node.pull() 中受益。这应该可行,但我认为您会发现这实际上效率低下,因为尽管已经从 db 一次(或多次)有效地接收到正确的值然后被忽略,但它会导致对 db 的另一个重要请求。

    作为替代方案,请考虑使用 Neo Technologies 发布+支持且 Py2Neo 正在使用的 Python 驱动程序。如果您这样做,您将失去 Py2Neo(例如 OGM)的一些功能,但您将更好地控制您的应用程序和 Neo4j 服务器之间的对话,并且在您的堆栈中减少一个(可能是错误的)层。您可以找到有关此 Python 驱动程序和其他选项的信息 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多