Уникальность идентификатора сеанса в распределенной среде?

Мы используем Spring Session (с резервным копированием с помощью Pivotal Gemfire) для наших приложений Spring Boot, работающих в распределенной среде.

В такой распределенной среде

гарантирует ли Spring Session, что уникальный идентификатор сеанса используется для новых сеансов, создаваемых на разных JVM?


person yathirigan    schedule 04.01.2016    source источник


Ответы (1)


Просто просматриваю старые сообщения SO для поддержки Spring Session Pivotal GemFire, поэтому приношу свои извинения, на ваш вопрос так и не был дан своевременный ответ.

Короче говоря, Spring Session использует UUID для создания "уникальных" идентификаторов сеанса. Например, см. здесь или, в более общем смысле, здесь.

ПРИМЕЧАНИЕ. Redis данных сеанса Spring поддерживает использует/обертывает класс MapSession для хранения состояния сеанса в Redis по умолчанию.

Похоже, существует множество обсуждение эффективности или, скорее, уникальности UUID для JVM в кластере. Этот конкретный, хотя и устаревший, привлек мое внимание, поскольку исходил из Oracle Форумы сообщества Java.

Однако имейте в виду, что использование Spring Session вашим приложением в конечном итоге определяет, являются ли идентификаторы сеанса уникальными; то есть это не зависит от количества узлов в кластере GemFire, поскольку отдельные узлы GemFire ​​не генерируют идентификатор сеанса (приложения, использующие Spring Session).

Таким образом, если только одно приложение (вероятно, маловероятно в мире микросервисов) когда-либо присутствует с используемой Spring Session, то вероятностно гарантируется, что UUID будут уникальными. Даже тогда, на основе ссылки доступны, маловероятно, что 2 или более узлов "приложений", использующих Spring Session, когда-либо будут генерировать конфликтующие идентификаторы (хотя (почти?) все возможно ;-).

Хотя, я полагаю, если это имеет первостепенное значение/важность, следуя прекрасной традиции Spring, было бы просто расширить GemFireOperationsSessionRepository и переопределить createSession(), вызвав соответствующий GemFireSession конструктор для передачи нужного идентификатора сеанса.

Однако во всех случаях (GemFire, Redis и т. д.) проблема уникальности идентификатора сеанса не зависит от базового хранилища данных.

Надеюсь это поможет...

Ваше здоровье!

person John Blum    schedule 15.06.2016