Репликация сеансов мультисерверного кластера Coldfusion - массивы в сеансе - PullRequest
1 голос
/ 18 декабря 2011

Мне интересно знать, если массив, хранящийся в области видимости сеанса, повторяется по экземплярам сервера при использовании многосерверной установки coldfusion9, например, с помощью 2 кластеризованных экземпляра, запущенных на одном компьютере с включенной репликацией сеанса.

Не знаю, правильно ли я понял документацию:

http://help.adobe.com/en_US/ColdFusion/9.0/Admin/WSc3ff6d0ea77859461172e0811cbf363c31-7ffa.html

Там написано:

Репликация сеанса также обеспечивает репликацию переменных области сеанса по всему кластеру. Однако репликация сеанса не поддерживает репликацию массивов в CFC или переменных области действия сеанса.

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

1 Ответ

1 голос
/ 19 декабря 2011

Если корзина сама по себе является CFC:

<cfset session.cart = CreateObject('component','model.objects.shoppingCart') />

, если она внутренне оборачивает массив структур и сохраняет их в SESSION или VARIABLES, то не будет работать . в любом другом случае - но не при реализации в многосерверном кластере ACF9.0.

Решение состоит в том, чтобы изменить дизайн CFC / Classes для вашего магазина таким образом, чтобы они:

  1. Внутренне (в пределах CFC) не используйте область VARIABLES для хранения доступа к массивам, а

  2. Внутренне (в пределах CFC), не открывайте область SESSION напрямую при чтении / записи в массивы.

Это делается с помощью Структура вместо массива (ниже приведен методобъявлено в вашей корзине покупок CFC):

<cffunction name="addItemToCart" returntype="void">
  <cfargument name="item" type="any" required="true" />

  <cfscript>
  var id = arguments.item.getID();
  if (NOT StructKeyExists(VARIABLES.userCart, 'id')
  {
     VARIABLES.userCart[id] = StructNew();
     VARIABLES.userCart[id].qty = 0;
  }
  VARIABLES.userCart[id].item = arguments.item;
  VARIABLES.userCart[id].qty++;
  </cfscript>

В этом приведенном выше примере псевдокода VARIABLES.userCart, который является областью, доступной в пределах CFC (и совместно используемой в вызовах методов дляlife of CFC) хранит переменную userCart в виде структуры вместо массива.Затем, с некоторым изяществом, мы добавляем новые ключи в структуру на основе уникального идентификатора элемента корзины покупок и создаем подструктуру: один для хранения фактического элемента магазина (в ключе 'item') и один для хранения/ обновить количество (в ключе 'qty').

Использование структуры в качестве механизма хранения вместо массива позволит вам создать приложение CF9, которое поддерживается в вашем многосерверном кластере, если вырешите создать / сохранить ХФУ в СЕССИИ.

Итак, подведем итог:

<cfset SESSION.myCartItemCount = ArrayNew(1) />

Поддерживается.

<cfset SESSION.user = CreateObject('component','model.objects.user') />

Поддерживается, если существуетНет хранения в массиве внутри CFC .

<cfset SESSION.cart = CreateObject('component','model.objects.cart') />

Не поддерживается , если имеется внутреннее чтение / запись в массивы.

ИзменитеМассивы для структур под капотом, и вы готовы идти.

...