我的应用程序还没有上线,所以在它进入生产之前我正在测试我的 Gremlin 查询的性能。
为了测试,我正在使用一个查询,将边从一个顶点添加到 300 个其他顶点。它做了更多的事情,但这是简单的描述。我添加了这个提到的 300 的工作量只是为了测试。
如果我连续运行 300 次查询,几乎需要 3 分钟才能完成,并创建了 90,000 条边(300 x 300)。
我很担心,因为如果有 60,000 名用户同时使用我的应用程序,他们可能会在 2 分钟内使用此查询创建 90,000 条边,而在我的情况下,60,000 名用户同时在线并不算太多。 如果我有 1 百万名用户同时在线,我将需要许多服务器处于满负荷状态,这超出了我的预算。
然后我注意到当我的测试正在执行时,CPU 没有显示出很多活动,我不知道为什么,我不知道数据库在内部如何工作。 因此,我认为也许更真实的情况是同时调用我的查询,因为这就是真正用户要发生的事情,但当我尝试测试时,我得到了 ConcurrentModificationException。
据我所知,这个错误发生的原因是一个边或顶点在同时被 2 个查询读取或写入,这是我的应用程序中可能经常发生的事情,因为所有用户顶点都在不断地更改连接到同样的 4 个顶点,这些“冲突”将一直发生。
我正在使用通过 Node.js 使用 sockets 连接的 Gremlin Server 3.4.8 进行本地测试。当它进入生产时,我的计划是使用 AWS Neptune 作为我的数据库。
我该怎么做才能恢复希望呢?关于这个主题肯定有非常重要的东西我不知道,因为我不知道图形数据库在内部是如何工作的。
编辑
我实现了一个逻辑来重试查询请求,当收到错误时使用“指数回退”方法。这修复了 ConcurrentModificationException,但是在发送多个查询时,Gremlin Server 中存在许多问题,显示多线程在 Gremlin Server 中完全不受支持且不稳定,我们应该尝试在其他支持 Gremlin 的数据库中进行多线程操作,正如答案所说。我遇到了数据返回的随机不一致性以及来自数据库的 NegativeArraySize 和其他随机错误等问题,要注意这一点,以免浪费时间认为您的代码可能会出现错误,就像我遇到的那样。
ConcurrentModificationException
异常吗?能提供完整的堆栈跟踪吗? - stephen mallettejava.lang.NullPointerException
错误。如果我逐个发送顶点,则不会出现错误。此外,我还有另一个查询同时发送,用于创建许多边,然后在另一个查询中读取这些边时会得到重复的结果或其他随机不一致性,似乎同时发送多个查询以保存数据会生成数据损坏。 - fermmm