Каковы наилучшие подходы к кластеризации/распространению серверного приложения Java? Я ищу подход, который позволит вам масштабироваться по горизонтали, добавляя больше серверов приложений и больше серверов баз данных.
- Какие технологии (методы разработки программного обеспечения или конкретные технологии) вы бы предложили для решения этого типа проблем?
- Какие методы вы используете для разработки уровня сохраняемости для масштабирования для многих читателей/писателей. Масштабируйте транзакции приложений и масштабируйте доступ к общим данным (лучший подход — исключить общие данные; какие методы можно применить для устранения общих данных).
- Кажется, нужны разные подходы в зависимости от того, читаются ли ваши транзакции или пишутся тяжело, но я чувствую, что если вы можете оптимизировать тяжелое приложение для записи, которое также было бы эффективным для "чтения"
«Лучшее» решение позволит вам написать приложение Java для одного узла и, надеюсь, «скрыть» большую часть деталей доступа/блокировки общих данных.
В распределенной среде самая сложная проблема всегда сводится к тому, что несколько транзакций обращаются к общим данным. Кажется, есть два общих подхода к одновременным транзакциям.
- Явные блокировки (которые чрезвычайно подвержены ошибкам и медленно координируются между несколькими узлами в распределенная система)
- Программная транзакционная память (STM) АКА оптимистичный параллелизм, при котором транзакция откатывается во время фиксации, если она обнаруживает это общее состояние изменилось (и транзакцию можно повторить позже). Какой подход лучше масштабируется и каковы компромиссы в распределенной системе?
Я исследовал решения для масштабирования (и вообще приложения, которые дают пример того, как масштабироваться), такие как:
- Terracotta – обеспечивает "прозрачное" масштабирование за счет расширения модели памяти Java путем включения распределенной общей памяти с использованием механизма блокировки параллелизма Java (синхронизированного, ReentrantReadWriteLocks).
- Google App Engine Java – Позволяет вам писать приложения Java (или Python), которые будут распределяться между «облачными» серверами, где вы распределяете, какой сервер обрабатывает транзакцию, и используете BigTable для хранения ваших постоянных данных (не знаете, как вы транзакции, которые обращаются к общим данным или обрабатывают конфликты блокировки для эффективного масштабирования)
- Сервер Darkstar MMO. Darkstar – это игровой сервер Sun с открытым исходным кодом для MMO (многопользовательская онлайн-игра). данная транзакция будет выполняться только для определенной суммы и фиксации, и если это займет много времени, она откатится (вроде как программная транзакционная память). Они изучают поддержку установки многоузлового сервера для масштабирования.
- оптимистическая блокировка Hibernate — если вы используете Hibernate, вы можете использовать оптимистическую поддержку параллелизма для поддержки поведения типа программной транзакционной памяти
- Предполагается, что Apache CouchDB естественным образом "масштабируется" для многих БД чтения/записи в сетчатой конфигурации. (есть ли хороший пример того, как вы управляете блокировкой данных или обеспечением изоляции транзакций?):
- JCache — масштабирование "чтения" тяжелых приложений путем кэширования результатов до обычных запросы, которые вы можете использовать в Google appengine для доступа к memcached и для кэширования других часто читаемых данных.
Terracotta кажется наиболее полным решением, поскольку вы можете «легко» модифицировать существующее серверное приложение для поддержки масштабирования (после определения объектов @Root и методов @AutoLockRead/Write). Проблема в том, чтобы действительно получить максимальную производительность от распределенного приложения, оптимизация для распределенных систем на самом деле не является задним числом, вы должны разработать ее, зная, что доступ к объекту потенциально может быть заблокирован сетевым вводом-выводом.
Для правильного масштабирования кажется, что это всегда сводится к разделению данных и транзакциям балансировки нагрузки таким образом, чтобы заданная «единица выполнения» (ядро процессора -> поток -> узел распределенного приложения -> главный узел БД)
Похоже, что для правильного масштабирования любого приложения с помощью кластеризации вам необходимо иметь возможность разделять ваши транзакции с точки зрения их чтения/записи доступа к данным. Какие решения придумали люди для распределения данных своих приложений (Oracle, Google BigTable, MySQL, хранилища данных) и вообще, как вы управляете секционированием данных (много мастеров записи, гораздо больше баз данных чтения и т. д.).
С точки зрения масштабирования уровня сохраняемости данных, какой тип конфигурации лучше всего масштабируется с точки зрения разделения ваших данных на множество читателей/многих писателей (обычно я бы разделял свои данные на основе заданного пользователя (или любого другого основного объекта, который обычно является вашим «корневой» объект объекта), принадлежащий одной главной БД)