Должен ли я обращаться к выходу Map Reduce как к моноидному документу? - PullRequest
0 голосов
/ 11 марта 2012

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

Выходные данные выглядят так для одного документа

{ "_id" : ObjectId("4f48855606164f4765000004"), "value" : { "payment" : "5.0", "conversions" : [ ObjectId("4f5bd23baa113e964700000e") ] } }

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

Также одна проблема с этим подходом состоит в том, что я делаю платежи каждый размесяц, поэтому _id, являющийся user_id, будет конфликтовать.Кроме того, я думаю, что возможна проблема транзакции, потому что мне нужно обновить микроплатежи до другого состояния, чтобы я знал, что не буду выплачивать их снова, и что произойдет, если произойдет сбой одного из платежей?Эти состояния изменяются через state_machine , если это имеет какое-либо значение.

1 Ответ

0 голосов
/ 12 марта 2012

Должен ли я обращаться к выходу Map Reduce как к моноидному документу?

Конечно, ты определенно можешь это сделать. По этой причине M / R выводится в коллекцию, а не просто в «какой-то файл».

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

Итак, ясно, что выходные данные вашего M / R являются важными данными. Не оставляйте эти данные в коллекции, которая может быть "забита" будущим M / R. Вместо этого переименуйте созданную вами коллекцию или выполните цикл for, который вручную добавляет данные в коллекцию "хранитель".

В коллекции keeper измените _id на что-то вроде _id: { uid: ObjectId('...'), month: "201203" }. Вы также можете разделить поле values на несколько полей. И вам нужно будет добавить поле для идентификатора транзакции.

Также следует помнить, что MongoDB по умолчанию использует записи "огонь и забыть". Это низкая безопасность. У вас есть финансовые данные, поэтому убедитесь, что вы соблюдаете все рекомендации по доступности и безопасности данных:

  • Журнал включен
  • Наборы реплик (с дополнительным центром обработки данных)
  • Убедитесь, что все записи в эту коллекцию / дБ выполняются с w: majority и journal: true. Это замедлит пропускную способность БД в этой операции, поскольку эти записи могут занимать несколько сотен миллисекунд.
  • База паролей
  • Нестандартный порт MongoDB, белый список IP (обычная защита БД)

что произойдет, если один из платежей не будет выполнен?

Это нетривиальная проблема, и ее слишком сложно объяснить здесь. Вместо этого посмотрите этот документ по двухфазной фиксации с MongoDB .

Обратите внимание, что для двухфазной фиксации требуется команда findAndModify MongoDB. Вам нужно научиться справляться с этим с помощью Mongoid.

...