apache / incubator-hugegraph

A graph database that supports more than 100+ billion data, high performance and scalability (Include OLTP Engine & REST-API & Backends)
https://hugegraph.apache.org
Apache License 2.0
2.58k stars 512 forks source link

并发查询时 /gremlin接口返回的结果与预期不符合 #2487

Closed fantengfeiNana closed 3 months ago

fantengfeiNana commented 3 months ago

Bug Type (问题类型)

gremlin (结果不合预期)

Before submit

Environment (环境信息)

Expected & Actual behavior (期望与实际表现)

我们现在使用hugegraph1.2.0版本作为底层应用,当我们 使用一个线程池并发执行g.V().count()【获取顶点个数】和.g.E().limit(9999)【获取所有的边集合】时,发现接口返回的数据与请求的预期不一致,导致进一步解析时无法正确解析,请问/gremlin接口是异步么,还是需要控制访问方式?直接现象就是g.E().limit(9999) 返回的结果是 g.V().count()执行的结果 当我使用自动化测试时,并发执行时,hugegraph也是偶现异常 image

image

请问我该如何解决此类问题?

Vertex/Edge example (问题点 / 边数据举例)

No response

Schema [VertexLabel, EdgeLabel, IndexLabel] (元数据结构)

No response

dosubot[bot] commented 3 months ago

你好,@fantengfeiNana!很高兴再次看到你的问题,希望这次我们也能一起找到解决方案。

根据您的描述,我发现了一个类似的问题:[Bug] Incorrect return value of the same query。这个问题描述了在并发查询时,返回的结果与预期不符,与您的问题有一定的相似性。

关于您提到的/gremlin接口的行为,根据我在GremlinAPI.java中的代码分析,这个接口处理请求的方式(同步或异步)主要取决于底层的服务器框架(如Servlet,Netty)和HugeGraph服务器的配置,而不是在提供的代码片段中明确定义。然而,postget方法并未使用JAX-RS的异步特性如AsyncResponse,因此基于这段代码,看起来请求是同步处理的。但是,如果没有关于服务器设置的额外上下文,或者在应用程序的其他地方存在任何异步配置或实现,我们无法确定并发处理的具体行为。

关于HugeGraph的并发操作返回不一致数据的问题,可能与以下几个因素有关:

  1. 事务隔离和一致性:当并发操作(特别是读写操作)被执行时,事务的隔离级别可能会影响读取数据的一致性。如果一个线程正在更新图形,而另一个线程正在读取,根据隔离级别,读操作可能会看到图形的部分状态。

  2. 速率限制:如果并发操作超过这些限制,可能会导致限流,这可能会影响操作的执行和完成,可能导致不一致或意外的结果。

  3. 缓存一致性:在并发场景下,可能会出现缓存一致性问题,其中一个线程更新了图形,但另一个线程看到的缓存没有及时更新,导致读取不一致。

  4. 后端存储一致性:后端存储的一致性模型也可能影响并发操作的结果。根据后端存储如何处理并发操作,可能会在反映一个操作所做的更新到另一个操作所看到的视图中有延迟。

解决这个问题可能需要结合这些策略,根据您的部署和使用情况的具体细节进行定制。

关于HugeGraph的速率限制功能,它通过控制操作可以执行的速率来工作。当并发操作超过指定的速率限制时,超出的操作将无法立即获取许可。这意味着这些操作将不得不等待许可变得可用(这发生在ratePerSecond指定的速率下),或者如果它们不能等待,它们将被拒绝执行。这种机制确保系统不会被过多的操作一次性压垮,这对于维持性能和避免资源耗尽至关重要。

希望这些信息能对您有所帮助。如果您有任何其他问题或需要进一步的澄清,请随时告诉我。

Sources

#### About Dosu This response is meant to be useful and save you time. It is **not meant to be a precise solution**, but rather a starting point for your own research. Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant. If you want to continue the conversation, start your reply with @dosu-bot.

PS: 有重复的 issue, 所以先关闭当前的, 汇聚到一个