2013-03-12 10 views
2

Я пытаюсь написать узловую программу, которая берет поток данных (используя xml-поток) и объединяет его и записывает в базу данных (используя mongoose). У меня возникли проблемы с определением, как сделать консолидацию, поскольку данные могут не попасть в базу данных к моменту обработки следующей записи. Я пытаюсь сделать что-то вроде:Обработка потока в узле, где действие зависит от асинхронных вызовов

on order data being read from stream 
    look to see if customer exists on mongodb collection 
    if customer exists 
     add the order to the document 
    else 
     create the customer record with just this order 
    save the customer 

Моя проблема заключается в том, что два «около» заказы на дело клиента дублировать записи клиентов, чтобы быть написаны, так как первый один не был написан до второго чекам посмотрите, есть ли там.

В теории я думаю, что я мог бы решить проблему, приостановив xml-поток, но есть ошибка, которая мешает мне это делать.

+1

Его трудно ответить, не видя, что вы пробовали. Пожалуйста, покажите код, чтобы лучше понять проблему. – Max

+0

Все, что я пробовал, не работает! (и я не хочу смущать себя). Плюс, для чего потребуется много знаний о домене. – baldmark

ответ

1

Не уверен, что это лучший вариант, но с использованием asyncqueue было тем, что я делал.

В то же время, когда я делал это, был добавлен запрос на растяжение для xml-stream (который является тем, что я использовал для обработки потока), что позволило сделать паузу.

0

Есть ли уникальное поле на объекте клиента в данных, поступающих из потока? Вы можете добавить уникальное ограничение на свою схему мангуста, чтобы предотвратить дублирование на уровне базы данных.

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

+0

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

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