Кластерный общий кэш [закрывается]

COM поддерживает вызовы метода интерфейса для двух разных потоков, двух разных процессов или двух разных машин. Это называется маршалинг . Два разных потока - наиболее распространенный случай, COM-сервер часто не является потокобезопасным. COM реализует поточную безопасность для таких однопоточных коклассов, направляя вызов из «неправильного» потока в поток, создавший сервер. Маршалинг между процессами происходит, когда вы пишете внепроцессный сервер. Между разными машинами в сети это называется DCOM.

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

Основная задача прокси-сервера заключается в сериализации аргументов вызова метода в буфер памяти или сетевой пакет. Это может быть довольно нетривиальным, особенно когда вы используете указатели на структуры переменного размера. COM нуждается в помощи, чтобы понять это правильно, и это работа вашего проекта FooPS. Когда вы запускаете midl.exe для вашего .idl-файла, midl автоматически генерирует код из определений интерфейса для реализации прокси и заглушки. Это довольно часто достаточно хорошо, но вам может понадобиться реализовать свои собственные, если встроенных ключевых слов в midl недостаточно для описания ваших данных.

Наконец, что не менее важно, Windows предоставляет стандартный маршаллер, который может маршалировать простые интерфейсы. Разработан для поддержки подмножества COM, определенного COM Automation. Другими словами, интерфейсы, которые являются производными от IDispatch и используют только типы, совместимые с Automation. Вам нужно только получить правильные записи в реестре, чтобы включить его, и в противном случае не нужен прокси / заглушка, сгенерированный midl. И, конечно, если вы выполняете простые внутрипроцессные вызовы только в одном потоке, он вам тоже не понадобится. Это довольно часто.

26
задан Amro 2 July 2012 в 06:55
поделиться

7 ответов

После некоторого поиска я нашел ReplicatedHashMap JGroup . Он не был тщательно протестирован, но кажется отличным началом. Он удовлетворяет всем моим требованиям, не давая мне слишком много функций, которые мне не нужны. Кроме того, он довольно гибкий. Я все еще ищу "идеальный" ответ :)

Спасибо за ваши ответы.

9
ответ дан 28 November 2019 в 07:27
поделиться

Как насчет этого?

Сделайте локальный ConcurrentHashMap в качестве локального кеша. Создайте распределенную карту / кеш Hazelcast. Начните прислушиваться к событиям распределенной карты и обновите локальную ConcurrentHashMap.

Теперь локальные кэши на каждом члене будут одинаковыми. Автосинхронизация.

import com.hazelcast.core.IMap; 
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.EntryListener;
import com.hazelcast.core.EntryEvent; 
import java.util.concurrent.ConcurrentHashMap;

public class Sample implements EntryListener {
        Map localCache = new ConcurrentHashMap ();

        public static void main(String[] args) { 
                Sample sample = new Sample();
                IMap   map    = Hazelcast.getMap("default"); 

                //Listen for all added/updated/removed entries
                map.addEntryListener(sample, true);  
        }

        public void entryAdded(EntryEvent event) {
             localCache.put(event.getKey(), event.getValue());            
        }

        public void entryRemoved(EntryEvent event) {
             localCache.remove(event.getKey());            
        }

        public void entryUpdated(EntryEvent event) {
             localCache.put(event.getKey(), event.getValue());            
        }
}
13
ответ дан 28 November 2019 в 07:27
поделиться

Задумывались ли вы о Infinispan - http://www.jboss.org/ infinispan / ? API очень прост и основан на стандарте (JSR-107). Использование также очень простое

CacheManager manager = new DefaultCacheManager(
                GlobalConfiguration.getClusteredDefault() );

Cache cache = manager.getCache();

cache.put("key", "value");

- Харди

9
ответ дан 28 November 2019 в 07:27
поделиться

Have you considered Terracotta? Might be overkill: http://www.terracotta.org/web/display/orgsite/Data+Caching

There was a JSR in the area of caching a while ago, do any of the following fit the bill: http://java-source.net/open-source/cache-solutions/jcache ?

I personally used FKache a few years ago and it worked well, but I didn't use it in distributed mode.

Is it important that it's a distributed cache with local copies of data? There's also the JavaSpaces stuff if it's shared memory you need...

5
ответ дан 28 November 2019 в 07:27
поделиться

Я использовал несколько технологий в этой области и очень рекомендую JBoss Cache как лучший выбор для того, что вы пытаетесь сделать. Он использует JGroups в качестве транспорта, но обеспечивает абстракцию транзакций более высокого уровня. В готовом виде он предоставляет вам распределенную структуру узлов дерева.

edit: Да, и JBossCache не зависит от сервера приложений JBoss, вы можете использовать его в любой среде. Во всяком случае, вне JBossAS он работает лучше, чем внутри него.

3
ответ дан 28 November 2019 в 07:27
поделиться

Memcached имеет несколько Java-клиентов .

1
ответ дан 28 November 2019 в 07:27
поделиться

Мой вариант - Система кэширования Java от Apache, она поддерживает TCP Lateral Cache, который, на мой взгляд, является той функцией, которая вам нужна.

0
ответ дан 28 November 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: