Как синхронизировать структуру данных на нескольких серверах в Java? - PullRequest
2 голосов
/ 17 июня 2010

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

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

edit: карта поддерживается БД (в частности, Apache Cassandra) - но мне нужно, чтобы мои клиенты были в курсе любых изменений в ней в течение нескольких секунд, что означало бы, что мне нужно будет очень часто опрашивать Cassandra, если другие способы уведомления клиентов об изменении карты.

Ответы [ 5 ]

3 голосов
/ 18 июня 2010

Вы можете использовать Hazelcast .Если вы пытаетесь открыть доступ к одной и той же карте, Hazelcast автоматически сделает это за вас.Вот код для этого:

java.util.Map<String, Customer> distributedMap = Hazelcast.getMap("customers");

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

com.hazelcast.core.IMap<String, Customer> distributedMap = Hazelcast.getMap("customers");
distributedMap.addEntryListener(new EntryListener() {
        public void entryAdded(EntryEvent entryEvent) {
            System.out.println("Entry added");
        }

        public void entryRemoved(EntryEvent entryEvent) {
            System.out.println("Entry removed");
        }

        public void entryUpdated(EntryEvent entryEvent) {
            System.out.println("Entry updated");
        }

        public void entryEvicted(EntryEvent entryEvent) {
            System.out.println("Entry evicted");
        })
2 голосов
/ 17 июня 2010

Я думаю Терракотовая VM кластеризация - это путь. (Я не знаю, как «несколько серверов» сочетаются с «легким»)

1 голос
/ 18 июня 2010

Может быть Hazelcast может помочь. Имеет несколько реализаций распределенной коллекции.

1 голос
/ 18 июня 2010

Вы должны были бы быть более конкретными, например, карта поддерживается БД или она находится только в памяти приложения (как в сеансе или что-то в этом роде)?

Я видел реализации кеша, которые делают что-то похожее через очереди сообщений JMS и т. Д. (Например, JCS из apache).

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

Коммерческие решения для кластеров и кеша, вероятно, являются лучшим решением, как предлагали другие авторы.

1 голос
/ 17 июня 2010

Я сомневаюсь, что вы найдете что-нибудь более легкое, чем терракотовая. Почему бы не использовать БД с кэшированием второго уровня?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...