使用goroutines处理并发neo4j连接

问题描述 投票:2回答:1

我们的任务是将相当多的xml数据(127万个xml文件,每个文件包含一个属性的节点)迁移到Neo图中,我们一直在使用go例程来咀嚼文件,解析xml,准备cypher查询因为必须处理xml的体系结构,我们使用go例程与通道同时处理线程中的每个文件,限制一次进行的工作数。

我遇到的问题是我遇到了诸如“通过对等方重置tcp连接”之类的错误以及“恐慌:无法读取消息长度的预期字节。读取:0预期:2。”我只能想象这是因为我们的工人同时运行连接和语句。我们的限制让我们有100名兼职工人,我不认为这对Neo来说是一个主要问题,但我无法弄清楚为什么它会让我们感到窒息。

是否有任何架构建议用于处理这样的用例,我们必须在大量的工作例程中运行单个cypher语句(在我们的例子中一次100个)?

目前,我们正在走一个文件树来构建要处理的文件队列,然后在完成步骤之后,我们迭代该队列并触发go例程来处理每个文件,使用缓冲的油门通道来阻止关闭直到先前的例程完成之前的新例程。在每个例程中,我正在启动一个新连接,准备语句,执行,关闭等。

我看到这个包提供了Pipelines,但我不知道如何在我们目前使用的处理/队列/通道架构中使用它:

https://github.com/johnnadratowski/golang-neo4j-bolt-driver

我也尝试过使用:

https://github.com/go-cq/cq

但是在尝试同时连接到Neo时仍然会遇到tcp connection reset by peer错误。

go neo4j
1个回答
0
投票

您可能在neo4j-bolt-driver中使用线程不安全功能。

Neo4j-bolt-driver提供了2个版本的驱动程序:

  1. Driver平原司机
  2. 管理连接池的DriverPool驱动程序

驱动程序对象本身是线程安全的,但代表底层连接的Conn对象不是。你可能以一种不应该使用的方式使用Conn对象。

使用goroutines,最好使用Conn方法创建DriverPool对象。在连接上调用Close时,它不一定关闭底层连接并回收连接以便重用。

© www.soinside.com 2019 - 2024. All rights reserved.