Какая архитектура? Распределите построение контента по кластеру

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

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

Требования:

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

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

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

Спасибо.


person chillitom    schedule 19.01.2009    source источник


Ответы (4)


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

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

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

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

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

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

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

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

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

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

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

person cletus    schedule 19.01.2009

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

person Talip Ozturk    schedule 15.05.2009

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

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

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

person kgiannakakis    schedule 19.01.2009

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

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

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

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

person Taylor Gautier    schedule 27.01.2009