У меня есть задача создать прототип для в широком масштабе масштабируемого приложения для распределенной общей памяти (DSM). Прототип только служил бы подтверждением концепции, но я хочу провести свое время наиболее эффективно путем выбора компонентов, которые использовались бы в действительном решении позже.
Цель этого решения состоит в том, чтобы взять ввод данных из внешнего источника, взболтать его и сделать результат доступным для многих frontends. Те "frontends" просто взяли бы данные из кэша и служили бы ему без дополнительной обработки. Объем хитов frontend на этих данных может буквально быть миллионами в секунду.
Сами данные очень энергозависимы; это может (и делать) изменение вполне быстро. Однако frontends должен видеть "старые" данные, пока новейшее не обрабатывалось и кэшировалось. Обработка и запись сделаны единственным (избыточным) узлом, в то время как другие узлы только считывают данные. Другими словами: никакое поведение читки.
Я изучал решения как memcached однако, этот конкретный не выполняет все наши требования, которые упоминаются ниже:
Заранее спасибо за любые идеи.
Взгляните на Hazelcast . Это чистая Java, продукт с открытым исходным кодом (лицензия Apache), хорошо масштабируемый в оперативной памяти. Он предлагает поддержку 7X24. И он действительно решает все ваши проблемы. Я попытался объяснить каждую из них ниже:
Взгляните на кластеризацию JVM Terracotta, это OpenSource;) У него нет API, хотя он работает эффективно на уровне JVM, когда вы сохраняете значение в реплицированном объекте, оно отправляется на все другие узлы. Даже блокировка и все эти вещи работают прозрачно и без добавления нового кода.
Возможно, вы захотите ознакомиться с Java-специфичными решениями, такими как Coherence: http://www.oracle.com/global/ru/products/middleware/coherence/index.html
Однако я считаю такие решения слишком сложными и предпочитаю использовать решения типа memcached. Большим недостатком memcached для вашей цели является отсутствие блокировки записей, как кажется, и нет встроенного способа репликации данных для отказоустойчивости. Именно поэтому я бы рассмотрел хранилища данных типа "ключ-значение". Многие из них полностью удовлетворят ваши потребности.
Вот список хранилищ данных типа "ключ-значение", которые могут помочь вам в решении вашей задачи: http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores. Просто выберите то, с которым вам удобно работать.
Задумывались ли вы об использовании стандартного решения для обмена сообщениями, такого как rabbitmq ? RabbitMQ - это реализация протокола AMQP с открытым исходным кодом.
Ваше приложение более или менее похоже на систему публикации / подписки. Узел Publisher выполняет обработку и помещает сообщения (обработанные данные) в очередь на серверах. Подписчики могут получать сообщения с сервера различными способами. AMQP разделяет производителя и потребителя сообщений и очень гибок в том, как вы можете комбинировать две стороны.
Я делаю аналогичный проект, но вместо этого нацелен на платформу .NET. Помимо уже упомянутых решений, я думаю, вам стоит взглянуть на ScaleOut StateServer и Alachisoft NCache . Боюсь, что ни одна из этих альтернатив не является дешевой, но, по моему мнению, они более безопасны, чем открытый исходный код для коммерческих решений.
В целом, StateServer - лучший вариант, если вы хотите пропустить настройку каждой мелочи в кластере кеша, в то время как NCache предлагает на выбор очень много функций и топологий кеширования.
В зависимости от поведения данных по отношению к клиентам (если данные читаются много раз одним и тем же клиентом), может быть хорошей идеей смешать локальное кэширование на клиентах с распределенным кэшированием в кластере (доступно как для NCache и StateServer), просто мысль.