2015-04-01 4 views
0

У меня есть клиентское приложение, запрашивающее некоторую информацию с URL-адреса каждые 1 секунду.Общая java HashMap в кластерной среде

На сервере (сервлет & JSP-приложение), чтобы избежать доступа к БД, когда это не является необходимым, было реализовано следующее решение. Вот фрагмент:

//a static HashMap where we save the last record inserted in db 
public static Map<Long, Long> VALUES = new HashMap<Long, Long>(); 

// A lastRecordRead sent by the client 
if (VALUES.get(id) != lastRecordRead) {  
    //Access the database to get some information 
    //cause the last value read is different from the last record inserted 
    ... 
}else{ 
    //Do nothing 
    //It's not necessary access DB cause the parameters match 
} 

Это работало так, как ожидалось, в среде разработки.

Проблема возникает, когда у нас есть кластерная среда. У нас есть сервер, развернутый в двух узлах (с использованием jboss), каждый из которых имеет свой собственный HashMap и собственные значения. Таким образом, в зависимости от узла, на который мы атакуем, мы можем получить разные значения ...

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

Любая помощь будет оценена.

EDIT: Я сейчас играю с HazelCast, и, кажется, так легко, что я боюсь, что я делаю что-то неправильно ...

В моем сервере я использую сейчас HazelCast вместо HasMap :

public static Map<Long, Long> VALUES = (Hazelcast.newHazelcastInstance(new Config())).getMap("VALUES"); 

При записи вставляются:

 if (((VALUES.get(id) == null)||(VALUES.get(id) < lastIdInserted))) { 
      VALUES.put(id, lastIdInserted);  
     } 

Когда сервер вызывается клиентским приложением:

// A lastRecordRead sent by the client 
if (VALUES.get(id) != lastRecordRead) {  
    //Access the database to get some information 
    //cause the last value read is different from the last record inserted 
    ... 
}else{ 
    //Do nothing 
    //It's not necessary access DB cause the parameters match 
} 

И я думаю, вот и все. Может ли кто-нибудь подтвердить, что это нормально, или я что-то не хватает ...? Действительно ли это решение заполняется по всем узлам? Я делаю тесты с 2 котами, и это работает, но будет ли работать с разными ips?

Заранее благодарен!

ответ

3

У вас есть два варианта:

  1. использовать некоторые распределенный ключ-значение, как: http://memcached.org/

http://infinispan.org/about/

http://basho.com/riak/

http://hazelcast.org/

... и тонны других.

  1. Использовать концепцию «издатель-подписчик» и обновлять каждый экземпляр HashMap событиями. Это, как правило, реализуется с некоторым JMS брокера:

    http://docs.oracle.com/cd/E19717-01/819-7759/aerbk/index.html https://www.rabbitmq.com/tutorials/tutorial-three-java.html

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

как обычный случай - использование кулак один.

+0

Думаю, я собираюсь попробовать memcached. Если это сработает, я отвечу на правильный ответ. Фрагмент будет оценен, хотя ... Большое спасибо! – elcadro

+0

Проверьте эту статью http://www.javaworld.com/article/2078584/open-source-tools/use-memcached-for-java-enterprise-performance--part-2--database-driven-web-apps. html Также есть примеры кода. –

+0

Еще раз спасибо. Я использую jdbc вместо hibernate, но это может помочь в любом случае ... Насколько я знаю, после прочтения некоторых статей в Интернете, похоже, что для использования memcached вам необходимо установить приложение сервера и, кроме клиента ... это верно? В этом случае, возможно, использование других опций, как Halzelcast, кажется лучшим вариантом для меня ... – elcadro

2

Необходимо использовать Распределенные HashMap. Есть некоторые рамки. hazelcast - один пример. Вы можете использовать версию сообщества Hazelcast (бесплатно).

Вы также можете использовать Redisson (распределенные вычисления) тоже: https://github.com/mrniko/redisson

+0

Я пытаюсь использовать этот подход. Я дам Вам знать. Не могли бы вы показать мне фрагмент или статью, пожалуйста? Большое спасибо! – elcadro

+0

Вы должны взглянуть на документ лесной книги. – Loc

+0

Я сейчас это делаю. Благодаря! ;) – elcadro

0

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

Вы уверены, что это не преждевременная оптимизация?

+0

Там будет много клиентских приложений, запрашивающих некоторую информацию, так что это будет необходимо. Кроме того, это необходимый клиент;) – elcadro

 Смежные вопросы

  • Нет связанных вопросов^_^