офлайн рекомендация по дизайну веб-приложения - PullRequest
6 голосов
/ 13 марта 2011

Я хочу знать, какая архитектура лучше подходит для этого случая:

  1. У меня есть много магазинов, которые подключаются к веб-приложению, разработанному с использованием Ruby on Rails.
  2. Интернет не доступен постоянно
  3. Решение состояло в том, чтобы разработать автономную систему, которая требует установки локальной копии удаленной базы данных.

Все это уже было разработано. Теперь, что я хочу сделать:

  • Работа всегда с локальной копией базы данных.
  • Любые изменения в локальной базе данных должны быть синхронизированы с удаленной базой данных.
  • Все локальные копии должны иметь те же данные, что и другие локальные копии.

Чтобы решить эту проблему, я подумал об использовании программного обеспечения, подобного JMS, в конечном итоге Rabbit MQ. Это заключается в том, что любой SQL-запрос помещается в очередь JMS, которая будет выполняться на удаленном экземпляре приложения, который будет вставлен в удаленную БД, и помещает оператор вставки или SQL-запрос в другую очередь, которая будет прочитана всеми локальными экземплярами. Это кажется сложным и должно замедлить работу приложения.

Есть ли план или рекомендация, которую я должен применить для решения проблемы такого рода?

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Вы можете сделать это, но по сути вы разрабатываете свой собственный механизм репликации.Эти вещи могут быть немного сложными, чтобы получить право (что произойдет, если m1 и m3 выполняются на реплике r1, но m2 нет?) Я бы не хотел разрабатывать что-то подобное, если вы не уверены, что у вас есть ресурсы, чтобы сделатьэто работает.

Я бы посмотрел на существующее готовое решение для репликации.Если вы уже используете базу данных SQL, она, вероятно, имеет некоторую поддержку.Посмотрите здесь для получения более подробной информации, если вы используете MySQL

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

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

Даже в этом случае RabbitMQ вам совсем не помогает, поскольку для работы требуется постоянное соединение, поэтому вы вернулись к исходной точке.Простейшим решением было бы просто записать все изменения (команды SQL) в текстовый файл в удаленном месте, а затем, когда вы получите соединение, скопировать этот файл (scp, ftp, emaill или любой другой) на главный сервер и запустить все команды тами затем просто повторно синхронизируйте все реплики.

В зависимости от вашего конкретного проекта вам также может потребоваться убедиться, что нет конфликтов при запуске команд из другого удаленного местоположения, но нет общего технического решения для этого.Опять же, в зависимости от проекта, вы можете отменить одну из транзакций, уведомить пользователей о том, что это произошло, и т. Д.

1 голос
/ 13 марта 2011

Я бы рекомендовал взглянуть на CouchDB .Это база данных, отличная от SQL, которая делает то, что вы описываете автоматически.Он используется особенно в телефонных приложениях, которые часто не имеют подключения к Интернету или данным.Идея заключается в том, что у вас есть локальная копия базы данных CouchDB и одна или несколько удаленных баз данных CouchDB.Затем сервер CouchDB позаботится о репликации распределенных систем, и вы всегда работаете с локальной базой данных.Этот подход хорош тем, что вам не нужно создавать свой собственный механизм распределенной репликации.Для получения более подробной информации я хотел бы взглянуть на раздел «Распределенные обновления и репликация» их документации .

...