2009-12-13 2 views
3

Я хотел бы иметь мастер-подчиненную установку узлов Erlang, где операции чтения и записи происходят только на главном узле. Ведомые узлы хранятся только в режиме горячего резервирования.Асинхронная транзакция Mnesia

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

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

ответ

2

Я думаю, что вы будете счастливее, если вы построите эту ретрансляцию за пределами площадки, используя систему очереди сообщений (возможно, возможно, с помощью rabbitmq), обновив реплицированную базу данных из корня очереди сообщений. Соединения глобальной сети, скорее всего, перегружаются или спускаются, а протоколы очереди сообщений имеют способы справиться с этим. Распределение Erlang просто сдаётся, и вам нужно проливать обновления в файл до тех пор, пока не появится реплика и не сможет его использовать.

Для обеспечения наилучшей симметрии перед отправкой сообщений в очередь следует установить очередь сообщений. Поэтому даже мастер обновляется путем потребления из очереди сообщений. Если требуется ответ, текущий мастер может отправить сообщение назад эмитенту сообщения.

У Mnesia есть несколько разных видов mnesia transaction contexts, но ничто из того, что действительно подходит точно так, как вы хотите.

+0

Я также немного исследовал с тех пор, как увидел этот вопрос: предложение Христиана звучит разумно. – jldupont

0

Интересное Q и одинаково интересное A!

В принципе, то, что вы предлагаете, христианское, например. иметь gen_server - сериализацию доступа к БД. Впервые я это сделал, а затем понял: держись! Mnesia транзактивна, поэтому для первого сериализации доступа немного странно, а затем повторите это, обновив БД посредством транзакции.

Я все еще немного озадачен, учитывая, что mnesia применяет транзакционную семантику. Я склонен считать это как подсказку, что вам не нужно сериализовать доступ к себе, тем более, что разработчики mnesia, вероятно, знают систему лучше, чем я do;)

Я понимаю, что это не совсем прямой ответ на ваш вопрос, однако я бы сказал, используя mnesia + memorynodes + disknodes. Моменты памяти для быстрого захвата и удаления для восстановления после сбоя/резервного копирования.

НТН, haavee