Каковы наилучшие подходы к кластеризации/распространению приложения сервера Java? Я ищу подход, который позволяет масштабировать по горизонтали, добавляя больше серверов приложений и больше серверов баз данных.Java-решения для распределенных транзакций и/или данных, разделяемых в кластере
- Какие технологии (технологии разработки программного обеспечения или конкретные технологии) вы предложили бы подходить к этой проблеме?
- Какие методы вы используете для создания слоя персистентности для масштабирования для многих читателей/писателей. Масштабировать транзакции приложений и масштабировать доступ к общим данным (наилучший подход - исключить общие данные, какие методы вы можете применить для устранения общих данных).
- Различные подходы, как представляется, необходимо в зависимости от того, для чтения или записи тяжелые ваши транзакции, но я чувствую, что если вы можете оптимизировать «написать» тяжелый приложение, которое будет также быть эффективным для «чтения»
«лучшее» решение позволит вам написать приложение Java для одного узла и, надеюсь, «скрыть» большинство деталей доступа/блокировки общих данных.
В распределенной среде наиболее сложной проблемой всегда является использование нескольких транзакций для доступа к общим данным. Кажется, есть два общих подхода к параллельным транзакциям.
- Explicit locks (который чрезвычайно подвержен ошибкам и медленным для координации между несколькими узлами в распределенной системе)
- Software transactional memory (СТМ) АКА оптимистичный параллелизм, где выполняется откат транзакции во время фиксации, если он обнаруживает, что разделяет состояние (и транзакция позже может быть повторена). Какой подход лучше масштабируется и каковы компромиссы в распределенной системе?
Я исследовал масштабирование решений (и, в общих приложений, которые обеспечивают пример того, как в масштабе), таких как:
- Terracotta - обеспечивает «прозрачный» масштабирование за счет расширения модели памяти Java на включают распределенную общую память с использованием механизма блокировки параллелизма Java (синхронизированный, ReentrantReadWriteLocks).
- Google App Engine Java - Позволяет писать приложения на Java (или python), которые будут распределены между «облачными» серверами, на которых вы распространяете сервер, обрабатывающий транзакцию, и вы используете BigTable для хранения ваших постоянных данных (не знаете, как ваши транзакции, данных или обработчиков блокировок для эффективного масштабирования)
- Darkstar MMO Server - Darkstar - это игровой сервер MMO с открытым исходным кодом с открытым исходным кодом Sun (массово многопользовательский онлайн), который они масштабируют транзакции в поточном транзакционном режиме, позволяя данной транзакции работать только на определенную сумму и и, если потребуется, он будет откатываться (вроде как транзакционная память программного обеспечения). Они занимались исследованиями в supporting a multi-node server setup для масштабирования.
- Hibernate's optimistic locking - если вы используете Hibernate вы можете использовать их оптимистическую поддержку параллелизма для поддержки software transactional memory типа поведения
- Apache CouchDB должен «масштаб» для многих чтения/записи децибел в конфигурации сетки естественно. (есть ли хороший пример того, как вы управляете блокировкой данных или обеспечиваете изоляцию транзакций?):
- JCache - Масштабирование «чтения» тяжелых приложений путем кэширования результатов по общим запросам, которые вы можете использовать в приложении Google appengine для доступа к memcached и кэширования других часто читаемых данных.
Terracotta представляется наиболее полным решением в том, что вы можете «легко» изменить существующее серверное приложение для поддержки масштабирования (после определения объектов @Root и методов AutoLockRead/Write). Проблема состоит в том, чтобы действительно получить максимальную отдачу от распределенного приложения, оптимизация для распределенных систем на самом деле не такая мысль, которую вы, должно быть, должны ее проектировать, зная, что доступ к объектам потенциально может быть заблокирован сетевым вводом-выводом.
Для правильного масштабирования, кажется, что это всегда сводится к данным разделения и распределения нагрузки операций таким образом, что данное «исполнительный блок» (процессор ядро -> Тема -> распределенная узел приложения -> DB мастер-узел)
Похоже, что для того, чтобы правильно распределить приложения, кластерирование должно быть в состоянии разделить ваши транзакции с точки зрения чтения/записи данных. Какие решения люди придумывают для распространения данных своих приложений (Oracle, Google BigTable, MySQL, хранилища данных) и вообще как вы управляете данными секционирования (многие мастера записи, с большим количеством прочитанных БД и т. Д.).
Что касается масштабирования уровня сохраняемости данных, то какой тип конфигурации масштабируется наилучшим образом с точки зрения разделения ваших данных на многие читатели/многие авторы (как правило, я разделял свои данные на основе данного пользователя (или любого другого основного объекта что обычно является вашей «корневой» объектной сущностью), принадлежащей одной основной БД)
«Сложная система, которая работает, неизменно обнаруживается, что она эволюционировала от простой системы, которая работала. Обратное утверждение также кажется верным: сложная система, разработанная с нуля, никогда не работает и не может быть использована для работы. начните сначала, начиная с простой рабочей системы ». -John Gall –