使用goroutines处理并发neo4j连接

时间:2016-10-18 20:31:50

标签: go neo4j

我们的任务是将相当多的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错误。

1 个答案:

答案 0 :(得分:0)

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

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

  1. Driver普通司机
  2. DriverPool管理连接池的驱动程序
  3. 驱动程序对象本身是线程安全的,但代表底层连接的Conn对象不是。您可能以不应该使用的方式使用Conn对象。

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