Java EE: разумно ли в этом сценарии сделать мой атрибут контекста потокобезопасным?

Я внедряю систему динамических уведомлений (а-ля Facebook) для своего сайта с помощью API Servlet 3.0. Моя запланированная структура для поддержки этой функциональности:

  1. При каждой загрузке страницы отправьте XMLHTTP-запрос «получить» на сервер.
  2. Разрешить серверу создавать объекты AsyncContext из этих запросов «получить» и сохранять их в карте области приложения с ключом идентификатора веб-сайта пользователя.
  3. Всякий раз, когда пользователь выполняет действие, которое порождает уведомление, запрашивайте на карте области приложения идентификаторы друзей пользователя и, используя хранящиеся там объекты AsyncContext, отправьте уведомление каждому другу.
  4. Каждый из друзей получает уведомление.

Мой вопрос: нужно ли делать эту карту потокобезопасной? В худшем случае функция, действующая от имени «пользователя, отправляющего уведомление», отправит уведомление в устаревший асинхронный контекст на карте либо потому, что пользователь, которому она соответствует, в настоящее время переключает страницы и еще не отправить новый запрос XMLHTTP или вышел из системы.

Однако при каждой загрузке страницы у меня также есть код для получения всех уведомлений в базе данных, более новых, чем «дата последней проверки», поэтому при загрузке страницы уведомление пользователя не зависит от динамической системы уведомлений. Таким образом, пользователь все равно получит уведомление, если он переключает страницы (и, очевидно, концепция уведомлений не актуальна, если пользователь вышел из системы).

Учитывая эту информацию, есть ли какие-либо сценарии, которые потребуют, чтобы карта была потокобезопасной?


person Kevin    schedule 06.05.2011    source источник


Ответы (1)


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

Кроме того, этот план не будет очень хорошо масштабироваться после 1 сервера. Если это нормально.... просто используйте ConcurrentHashMap.

person bwawok    schedule 06.05.2011
comment
Можете ли вы объяснить, почему он не масштабируется за пределы 1 сервера с использованием ConcurrentHashMap? - person Kevin; 07.05.2011
comment
Он не будет масштабироваться дальше 1 сервера, чтобы хранить все в хэш-карте. Вы хотели бы сохранить это в базе данных и сделать что-то или другое... - person bwawok; 07.05.2011
comment
Еще вопрос/замечание. Атрибуты контекстной области не могут быть обновлены, пока находятся в контексте; их можно только установить или извлечь. ConcurrentHashMap здесь не нужен, поскольку каждый пользователь будет извлекать копию карты для чтения/вставки данных, а затем возвращать ее в контекст под тем же ключом. Итак, вопрос в том, нужна ли мне блокировка контекста; Я неправильно сформулировал исходный вопрос. Не могли бы вы ответить на мой обновленный вопрос? - person Kevin; 07.05.2011