Каковы наилучшие подходы к кластеризации/распространению приложения сервера Java? Я ищу подход, который позволяет масштабировать горизонтально, добавляя больше серверов приложений и больше серверов баз данных.
- Какие технологии (технологии разработки программного обеспечения или конкретные технологии) вы предложили бы подходить к этой проблеме?
- Какие методы вы используете для создания слоя персистентности для масштабирования для многих читателей/писателей Масштабировать транзакции приложений и масштабировать доступ к общим данным (лучший подход заключается в устранении общих данных, какие методы вы можете применять для устранения общих данных).
- Различные подходы, по-видимому, необходимы в зависимости от того, читаются или записываются ваши транзакции, но мне кажется, что если вы можете оптимизировать "тяжелое приложение записи", которое также было бы эффективным для "чтения"
"Лучшее" решение позволит вам написать приложение Java для одного node и, надеюсь, "скрыть" большинство сведений о доступе/блокировке общих данных.
В распределенной среде наиболее сложная проблема всегда сводится к тому, что несколько транзакций получают доступ к общим данным. Кажется, есть два общих подхода к параллельным транзакциям.
- Явные блокировки (который чрезвычайно подвержен ошибкам и медленнее координирует работу нескольких узлов в распределенной системе)
- Программная транзакционная память (STM) AKA optimistic concurrency, где транзакция откатывается во время фиксации, если обнаруживает, что общее состояние изменилось (и транзакция позже может быть повторена). Какой подход лучше масштабируется и каковы компромиссы в распределенной системе?
Я изучал масштабирующие решения (и в целом приложения, которые служат примером масштабирования), например:
- Terracotta - обеспечивает "прозрачное" масштабирование путем расширения модели памяти Java для включения распределенной общей памяти с использованием механизма блокировки Java concurrency синхронизированный, ReentrantReadWriteLocks).
- Google App Engine Java - Позволяет писать приложения на Java (или python), которые будут распространяться среди "облачных" серверов, где вы распространяете сервер обрабатывает транзакцию, и вы используете BigTable для хранения ваших постоянных данных (не знаете, как ваши транзакции, которые получают доступ к общим данным или обрабатывают блокировки, могут эффективно масштабироваться).
- Darkstar MMO Server - Darkstar - это сервер MMO с открытым исходным кодом с открытым исходным кодом (массово многопользовательский онлайн), который они масштабируют транзакции в поточном транзакционном режиме, позволяя транзакция только для определенной суммы и фиксации, и если потребуется, она будет откатываться (вроде как транзакционная память программного обеспечения). Они проводят исследования поддержки настройки сервера node для масштабирования.
- Оптимистическая блокировка Hibernate - если вы используете Hibernate, вы можете использовать их оптимистичную поддержку concurrency для поддержки транзакционная память программного обеспечения поведение типа
- Apache CouchDB, как предполагается, "масштабируется" для многих библиотек чтения/записи в естественной конфигурации сетки. (есть ли хороший пример того, как вы управляете блокировкой данных или обеспечиваете изоляцию транзакций?):
- JCache - Масштабирование "чтения" тяжелых приложений путем кэширования результатов по общим запросам, которые вы можете использовать в Google appengine для доступа к memcached и кэш-памяти другие часто читаемые данные.
Terracotta представляется наиболее полным решением в том, что вы можете "легко" изменить существующее серверное приложение для поддержки масштабирования (после определения объектов @Root и методов AutoLockRead/Write). Проблема состоит в том, чтобы действительно получить максимальную отдачу от распределенного приложения, оптимизация для распределенных систем на самом деле не такая мысль, которую вы, должно быть, должны ее проектировать, зная, что доступ к объектам потенциально может быть заблокирован сетевым вводом-выводом.
Для правильного масштабирования кажется, что он всегда сводится к разделению данных и транзакций балансировки нагрузки таким образом, что данный "исполнительный блок" (cpu core → thread → распределенное приложение node → мастер базы данных node)
Похоже, что для того, чтобы правильно распределить приложения, кластерирование должно быть в состоянии разделить ваши транзакции с точки зрения чтения/записи данных. Какие решения люди придумывают для распространения своих данных приложений (Oracle, Google BigTable, MySQL, Data warehousing) и вообще как вы управляете данными секционирования (многие мастера записи, со многими другими считываемыми DB и т.д.).
Что касается масштабирования уровня сохранения данных, то какой тип конфигурации масштабируется наилучшим образом с точки зрения разделения ваших данных на многие читатели/многие авторы (как правило, я разделял свои данные на основе данного пользователя (или любого другого основного объекта, обычно является вашим "корневым" объектом объекта), принадлежащим одной основной БД)