Огромное количество объектов, шардинг и java EE

Я новичок в java ee и не знаю, как реализовать то или иное требование.

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

Мой вопрос заключается в том, существует ли подход Java EE для решения проблемы поиска экземпляра объекта, позволяющий клиентам получить ссылку на объект, не зная, на какой машине он находится.

Я знаю о JNDI, но не уверен, что регистрация каждого объекта в каталоге JNDI уместна. Нужно ли мне писать библиотеку «Локатор», которая может узнавать о виртуальной машине, которой принадлежит каждый объект?


person Royce    schedule 17.08.2011    source источник
comment
Рассматривали ли вы доступные решения, такие как Terracotta и согласованность? Или у вас есть какие-либо особые/законодательные требования, исключающие такие решения?   -  person Alistair A. Israel    schedule 17.08.2011
comment
@AlistairIsrael Я ничего не имею против них, однако они, кажется, только помогают с распределением данных в объектах. Время вычислений также должно быть сегментировано. Однако эти решения могут быть полезными для распространения реестра. OTOH что-то вроде Hazelcast также было бы простым решением для распространения реестра.   -  person Royce    schedule 17.08.2011
comment
Я мог бы поклясться, что Terracotta обеспечивает прозрачную кластеризацию, из-за чего вашему приложению кажется, что оно работает на огромной JVM. Их веб-сайт сейчас не дает понять, что они все еще делают это, или, может быть, это то, что Терракотовый DSO — это все.   -  person Alistair A. Israel    schedule 17.08.2011


Ответы (2)


Не вдаваясь в подробности, позвольте мне высказать несколько направлений исследования.

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

Сама Java EE (как спецификация) не указывает, а эталонная реализация не предоставляет «готовое» решение для широко распределенной кластеризации и сегментирования, которые, как я думаю, вы ищете.

Сама Glassfish (Java EE RI) использует Shoal в качестве среды кластеризации, которая может использовать либо Grizzly или JGroups в качестве основы платформа для групповых коммуникаций.

Итак, в вашем конкретном случае я бы рассмотрел возможность создания и использования JGroups для группового общения. Затем вместо центрального реестра мы полагаемся на DHT для определения местоположения службы/объекта. Посмотрите, как существующие успешные платформы на основе DHT (memcached, Apache Cassandra) реализуют секционирование и поиск, отказоустойчивость и аварийное переключение, и просто адаптируйте/адаптируйте их. Затем вы можете использовать RMI/RPC для вызовов клиент-сервер (сервисный узел).

Надеюсь, я имею смысл, и удачи! Если вы развернете это самостоятельно, посмотрите, сможете ли вы открыть исходный код. ;)

person Alistair A. Israel    schedule 17.08.2011

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

Простой пример кода здесь. Вы записываете свой расчет через класс, который реализует com.tangosol.uti.InvocableMap.EntryProcessor. Это позволит производить вычисления на сервере, где существуют данные. Одно ограничение заключается в том, что данные должны быть сериализуемыми, поскольку они перемещаются по сети.

public class CalcLogic implements EntryProcessor {
....
    //InvocableMap.Entry is the "data"
    //You write your calculation in this process methods.
    public Object process(InvocableMap.Entry entry {
        (YourObjectType) obj = (YourObjectType)entry.getValue();
        //do some calculation against obj here
        entry.setValue(obj);   
        return null;
    }

....
}
person user865871    schedule 18.08.2011