我们的任务是将相当多的xml数据(127万个xml文件,每个文件一个节点具有属性)迁移到Neo图中,并且我们一直在使用go例程来分析文件、解析xml、准备插入的cypher查询等。由于必须处理xml的体系结构,我们正在使用go例程与通道并发地处理线程中的每个文件,从而限制了同时进行的工作进程的数量。
我遇到的问题是我遇到了类似"tcp connection reset by peer“和"panic: and‘t read expected for message length. Read: 0 Expected: 2”之类的错误。我只能想象这是由于在我们的工作线程中并发运行连接和语句。我们的限制是100个并发工作者,我不认为这对Neo来说是一个大问题,但我就是不明白为什么它会对我们造成阻碍。
对于处理这样的用例,我们必须在大量的工作例程中运行单个循环语句(在我们的例子中,一次运行100个),有没有什么架构建议?
目前,我们正在遍历文件树以构建要处理的文件队列,然后在遍历完成后,我们迭代该队列并启动go例程来处理每个文件,使用缓冲的油门通道来阻止新例程的触发,直到先前的例程完成为止。在每个例程中,我都会创建一个新的连接、准备语句、执行、关闭等等。
我看到这个包提供了Pipeline,但我只是不确定如何在我们目前正在进行的处理/队列/通道架构中使用它:
https://github.com/johnnadratowski/golang-neo4j-bolt-driver
我也尝试过使用:
但是,当同时尝试连接到Neo时,仍然会收到tcp connection reset by peer错误。
发布于 2017-12-21 06:01:56
您可能正在使用ne4j-bolt-driver中的线程不安全功能。
Neo4j-bolt-driver提供了两个版本的驱动程序:
Driver普通驱动程序DriverPool驱动程序,用于管理连接池驱动程序对象本身是线程安全的,但代表底层连接的Conn对象不是。您可能会以一种不应该使用的方式使用Conn对象。
对于goroutines,最好使用DriverPool方法创建Conn对象。当在连接上调用Close时,它不一定关闭底层连接并回收该连接以供重用。
https://stackoverflow.com/questions/40117546
复制相似问题