2017-01-03 7 views
0

Я сопоставляю элементы из двух списков, например, здесь будет соответствовать элемент c из A и c из B. Затем я делаю некоторую обработку и добавляю соответствующую пару в другой список.Firebase: Убедитесь, что действие выполняется только один раз с использованием нескольких рабочих

- List A 
    - a 
    - b 
    - c 

- List B 
    - c 
    - d 

Для этого я наблюдаю за того на обоих списка А и Б, а также проверить, если совпадение существует, когда добавляется что-то.

Это хорошо работает, но у меня слишком много вставок для одного клиента.

Так что мне нужно запустить мой помощник на нескольких машинах, чтобы ускорить работу.

Но я хочу, чтобы каждое совпадение происходило только на одной машине, т. Е. Если машина 1 находит совпадение, то для машины 2 нет смысла обрабатывать ее.

Я попытался использовать atomic commits, но в то время как это предотвращает совпадение нескольких совпадений друг с другом, совпадение выполняется еще дважды.

Как я могу заблокировать элементы, чтобы убедиться, что другие машины не рассматривают их после начала процесса сопоставления?

ответ

0

Firebase не предоставляет встроенную поддержку для чего-то подобного, и, кроме того, меня беспокоит отсутствие идемпотентности в самом потоковом протоколе. Если вы подписываетесь на обновления по теме, но сам узел умирает, на вашем следующем запуске сервера вы получите обновление VALUE, а не набор всех обновлений INCREMENTAL, которые произошли во время вашего узла.

С хорошими структурами данных вы можете «перевернуть свои собственные» объекты, подобные этому. В конце концов, процессоры задач с поддержкой кластеров с idempotency задач и блокировкой рабочего персонала, такие как Resque и Celery, делают именно это, не так много на пути базовых ресурсов (Redis, DB и т. Д.). Вам нужно будет добавить наборы данных для управления рабочим блокировка, блокировка рабочих мест работниками, средства для восстановления/обработки ошибок и т. д. Однако, если вы просмотрите код, который они используют для этого, вы быстро увидите, что требуется больше работы, чем простое сообщение StackOverflow справится с этим.

В качестве альтернативы, почему бы не рассмотреть использование стека, такого как ActionHeroJS, в качестве уровня API, поддерживающего кластер? Он имеет резервную кластерную механику Redis и управление задачами на основе Resque со всеми вашими требованиями и хорошо сочетается с Firebase ...

0

Я сделаю снимок.

Наше приложение имеет пользователей, и некоторые пользовательские данные могут быть отредактированы - однако мы не хотим, чтобы пользовательские данные редактировались на нескольких клиентах одновременно. Таким образом, мы реализовали простой механизм блокировки, который уведомлял клиентов о том, что пользователь заблокирован при его редактировании.

Применяя это к вашему прецеденту

- List A 
    -Yiuiaisida9 //node names created with childByAutoId 
    letter: "a" 
    isLocked: false 
    -YJI99s9ajsl 
    letter: "b" 
    isLocked: false 
    -YE9jsiakskk 
    letter: "c" 
    isLocked: true 

- List B 
    -YJ0a0s0kdka 
    letter: "c" 
    isLocked: true 
    -YM0s09s0ksk 
    letter: "d" 
    isLocked: false 

Так что ваши клиенты все наблюдать список A и B. Список Когда дочерний узел добавляется в список А, что узел изначально установлен заблокирован: верно. Список поиска B, и если он находит совпадение, заблокируйте его и начните обработку.

Другие клиенты будут уведомлены, что «c» теперь заблокировано и будет просто игнорировать их, поскольку их код не переходит к обработке заблокированных узлов.

Просто мысль ...