Заказ мнесийных событий - PullRequest
       22

Заказ мнесийных событий

2 голосов
/ 01 декабря 2010

Мы разрабатываем приложение, в котором несколько процессов в разных узлах распределенной системы подписываются на события mnesia.Таблица записывается из одного процесса на одном из узлов.

Однако возникла неопределенность, если мы можем быть уверены, что получим события в том же порядке, что и операции над таблицей.

Например: mnesia: delete (tab1, SomeRec), mnesia: write (tab1, SomeOtherRec)

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

Кроме того, как насчет операций над разными таблицами (из одного и того же процесса)?

mnesia: write (tab1, SomeRec), mnesia: write (tab2, SomeOtherRec)

Можем ли мы быть уверены, что всегда получим событие из tab1 до события из tab2?На всех процессах и на всех узлах?

Спасибо, Йенс

Ответы [ 3 ]

2 голосов
/ 01 декабря 2010

Для Erlang в целом отправка сообщений от процесса A процессу B гарантированно всегда будет в порядке.

Однако для сообщений между более чем двумя процессами вы не можете гарантировать, что сообщения, отправленные с A до B, будут поступать до сообщений, отправленных с C до B, даже если сообщения A были глобально отправлены первыми. Планировщик, сетевая задержка или проблемы с сетью (особенно если A и C не находятся на одном узле) могут быть хорошими примерами того, почему такие гарантии трудно дать.

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

Что касается событий mnesia, все они управляются в mnesia_subscr.erl, который является единственным gen_server, отвечающим за пересылку всех событий для узла, независимо от таблицы. Таким образом, это должно соответствовать принципу A - B и гарантировать заказанные события.

0 голосов
/ 02 мая 2011

Paxos - это решение, которое вы ищете. Сделать выбор из принятых значений является Максом ранее принятых предложений. Это создаст последовательность, которую вы можете использовать для заказа ваших инструкций.

0 голосов
/ 03 декабря 2010

Я не знаю, будет ли mnesia делать то, что вы хотите по умолчанию, но если предположить, что этого не произойдет, то вам, возможно, нужно начать смотреть на использование алгоритмов распределенного согласия, таких как Paxos ? Существует реализация в виде lib_paxos , лицензированной по лицензии GPL библиотеки с открытым исходным кодом.

Излишне говорить, что это повлияет на вашу производительность, но обеспечит последовательность.

...