Как лучше всего отделить функции администратора от общедоступного сайта?

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

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

Сайт работает на довольно стандартном стеке Rails/MySQL/Linux, но я думаю, что это скорее проблема архитектуры, чем проблема реализации: в основном, как синхронизировать данные и бизнес-логику между этими разными приложениями?

Некоторые стратегии, которые я оцениваю:

1) Создайте подчиненную базу данных общедоступной базы данных на другом компьютере. Извлеките всю модель и код библиотеки, чтобы их можно было использовать между приложениями. Создайте новые контроллеры и представления для интерфейсов администратора.

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

2) Создавайте новые приложения, более специфичные для задач/отделов, и используйте промежуточное программное обеспечение, ориентированное на сообщения, для их интеграции. Некоторое время назад я читал шаблоны корпоративной интеграции, и они, похоже, защищали это для распределенных систем. (В качестве альтернативы, в некоторых случаях может быть достаточно базовой функциональности RESTful API в стиле Rails.) Но мне снятся кошмары о проблемах с синхронизацией данных и масштабной перестройке, которую это повлечет за собой.

3) Некоторая смесь обоих. Например, единственная общедоступная информация, необходимая для некоторых задач бэк-офиса, — это время выполнения или статус, доступные только для чтения. Имеет ли смысл иметь это в совершенно отдельной системе и отправлять данные в открытый доступ? Между тем, функции администрирования пользователей/групп будут выполняться в отдельной системе, совместно использующей базу данных? Недостатком является то, что это, кажется, сохраняет многие проблемы, которые у меня были с первыми двумя, особенно с реархитектурой.

Я уверен, что ответы будут сильно зависеть от конкретных потребностей сайта, но я хотел бы услышать истории успеха (или неудачи).


person AndrewO    schedule 10.05.2010    source источник
comment
Каково ваше текущее узкое место? База данных или процессор? Ожидаете ли вы, что возникнет узкое место в одном из них или в обоих?   -  person Dean J    schedule 10.05.2010
comment
Хм, из двух, я бы сказал, БД, но на самом деле в основном со сложными запросами только для администратора (панели мониторинга; большие, экспортные-множество-связанных-таблиц-в-CSV для маркетинговых вещей).   -  person AndrewO    schedule 10.05.2010


Ответы (2)


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

Ключевым моментом является хорошее понимание того, какие данные используются, где и как данные участвуют в процессе. Если вы можете это сделать, попробуйте определить, можете ли вы сделать одну базу данных «ведущей». Это будут ваши оперативные данные, а другая база данных будет вашим хранилищем операционных данных (ODS). ODS всегда является производным от ваших живых данных. Процесс обновления ODS на основе оперативных данных может происходить через определенные промежутки времени и может как упрощать данные, так и выполнять дополнительную обработку, чтобы сделать их более подходящими для приложения, использующего ODS.

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

person Jonathan van de Veen    schedule 11.05.2010

Я не любитель копировать то, что не должно быть. Я бы пометил то, что является только администратором, и создал бы эту часть как отдельную БД с внутренним IP-адресом или другим портом. Затем установите отношения внешнего ключа с общедоступным сайтом для доступа администратора. Обращение с ней как с индексированной таблицей было бы намного проще в администрировании, чем репликация, а разработка API является ненужной задачей, если вы не имеете дело с устаревшими системами. Кроме того, зачем копировать, если вы хотите, чтобы системы были отдельными. Мои два цента.

person Jack Navarro    schedule 10.05.2010