Какая архитектура? Распределение контента по кластеру - PullRequest
0 голосов
/ 19 января 2009

Я создаю приложение для обслуживания контента, которое состоит из кластера двух типов узлов: ContentServers и ContentBuilders.

Идея состоит в том, чтобы всегда подавать свежий контент. Содержимое свежее, если оно было построено недавно, т.е. Content.buildTime

Требования:

* ContentServers будет только искать контент и обслуживать его (например, из распределенного кэша или подобного), не дожидаясь, пока что-либо будет создано, за исключением первого запроса для каждого элемента контента.

* ContentBuilders должен быть сбалансирован по нагрузке, перестраивать Контент непосредственно перед его истечением, должен создавать только тот контент, который действительно запрашивается. Созданный контент должен быть быстро доступен для всех ContentServers

Какую архитектуру мне использовать? В настоящее время я думаю о распределенном кеше (возможно, EhCache) для хранения встроенного контента и очереди сообщений (возможно, JMS / ActiveMQ) для передачи запросов контента составителям, хотя я рассмотрю любые другие варианты / предложения. Как я могу быть уверен, что ContentBuilders не будет создавать одну и ту же вещь в одно и то же время и будет создавать контент только по истечении срока его действия?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 19 января 2009

Честно говоря, я бы переосмыслил ваш подход и скажу почему.

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

Я буду говорить о когерентности Tangosol / Oracle здесь, потому что это то, с чем у меня больше всего опыта, хотя Terracotta будет поддерживать некоторые или большинство из этих функций и является бесплатной.

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

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

Таким образом, ваше решение гарантирует, что каждый кэш будет попадать на удаленный узел.

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

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

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

Теперь у вас могут быть другие причины сделать это так, как вы предлагаете, но я могу ответить на него только в контексте доступной информации.

Я также укажу вам сводку технологий грид / кластеров для Java , которую я написал в ответ на другой вопрос.

1 голос
/ 15 мая 2009

Вы можете попробовать Hazelcast . Это открытый исходный код, peer2peer, распределенная / разделенная карта и очередь с поддержкой выселения. Импортируйте одну баночку, вы готовы! Супер просто.

0 голосов
/ 27 января 2009

Похоже, вам нужна какая-то форма распределенного кэша, распределенной блокировки и обмена сообщениями.

Terracotta предоставляет вам все три - распределенный кеш, распределенную блокировку и обмен сообщениями , и ваша модель программирования - просто Java (JMS не требуется).

Я написал блог о том, как обеспечить, чтобы кэш заполнял его содержимое только один раз и только один раз: Что такое мемоизер и почему вы должны заботиться о нем .

Я согласен с Cletus - если вам нужна высокая производительность, вам нужно будет рассмотреть возможность разбиения, однако, в отличие от большинства решений, Terracotta будет прекрасно работать без разбиения до тех пор, пока вам это не понадобится, а затем, когда вы примените разбиение, оно просто разделит работать в соответствии с вашим алгоритмом разделения.

0 голосов
/ 19 января 2009

Если построение контента можно распараллелить (построитель 1 делает 1..1000, построитель 2 делает 1001..2000), то вы можете создать файл конфигурации для передачи этой информации. ContentBuilder будет нести ответственность за мониторинг его области на срок действия.

Если это невозможно, тогда вам нужен какой-то менеджер для организации построения контента. Этот менеджер также может играть роль балансировки нагрузки. Менеджер может быть связан вместе с ContentBuilder или быть его собственным узлом.

Я думаю, что идеи распределенного кэша и обмена сообщениями JMS хороши.

...