2016-10-18 3 views
2

Нам было поручено перенести довольно много данных xml (1,27 миллиона xml-файлов, один узел со свойствами для каждого файла) в график Neo, и мы использовали go-процедуры для жевания через файлы, синтаксический анализ xml, подготавливать запросы cypher для вставок и т. д. Из-за архитектуры обработки xml мы используем go-процедуры одновременно с каналами для обработки каждого файла в потоках, регулируя количество работающих одновременно.Обработка параллельных соединений neo4j с goroutines

Проблема, с которой я сталкиваюсь, заключается в том, что я столкнулся с такими ошибками, как «сброс соединения tcp через peer», а также «panic: не удалось прочитать ожидаемые байты для длины сообщения. Read: 0 Ожидаемое: и я могу только предположить, что это связано с одновременным запуском соединений и заявлений в наших рабочих. Наше дросселирование имеет нас на 100 одновременных рабочих, и я бы не подумал, что это будет серьезной проблемой для Нео, но я просто не могу понять, почему он задыхается от нас.

Существуют ли какие-либо рекомендации по архитектуре для обработки такого примера, когда мы должны запускать одиночные операторы cypher в большом количестве рабочих процедур (в нашем случае 100 за раз)?

В настоящее время мы ищем файловое дерево, чтобы создать очередь файлов для обработки, а затем, после того как прогулка завершена, мы перебираем эту очередь и запускаем программы для обработки каждого файла, используя буферный канал дроссельной заслонки, чтобы блокировать отключение новых подпрограмм до завершения предыдущих процедур. В каждой рутине я разворачиваю новое соединение, готовлю оператор, выполняю, закрываю и т. Д.

Я вижу, что этот пакет предлагает Pipelines, но я просто не уверен, как использовать его в обработке/очереди/архитектура канал, который мы получили в настоящее время происходит:

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

Я также попытался с помощью:

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

Но продолжают получать tcp connection reset by peer ошибки при тр ying для одновременного подключения к Neo.

+0

Я только что начал разбираться в Neo4j с помощью golang bolt-driver. Одна из вещей, указанных в документах, - объект Connection не является потокобезопасным. Кажется, каждый горутин должен создать свое собственное Соединение. Не знаю, была ли эта проблема. [Ссылка] (https://godoc.org/github.com/johnnadratowski/golang-neo4j-bolt-driver#Conn) –

+0

Спасибо за комментарий.его прошло более года с тех пор, как я коснулся этого, поэтому я не уверен, что у меня будет время, чтобы проверить это, но сообщит, если я это сделаю. Вы хотите отправить свой комментарий в качестве ответа, если я обойду его, и все получится правильно? –

ответ

0

Возможно, вы используете ненадежную функциональность потока в neo4j-bolt-драйвере.

Есть 2 версии драйверов, поставляемых Neo4j-болт водитель:

  1. Driver Plain драйвер
  2. DriverPool Driver, которая управляет пулом соединений

Драйвера самих объектов потокобезопасны , но объект Conn, который представляет собой базовое соединение, не является. Возможно, вы используете объект Conn таким образом, чтобы его не означало.

С goroutines, его лучшее, чтобы создать Conn объектов, используя DriverPool методов. Когда в соединении вызывается Close, он не обязательно закрывает базовое соединение и восстанавливает соединение для повторного использования.

Смежные вопросы