Установка балансировщика нагрузки

Балансировщик нагрузки для работы с интернет-магазином можно установить совместно с VPOS.

Для установки балансировщика нагрузки необходимо:

  1. Прописать репозитории:

    Для кассового сервера версии 4.х (Artix Control Center)
    wget -O - http://update.artix.su/artix.gpg.key |sudo apt-key add -
    echo 'deb [arch=amd64] http://update.artix.su/cs/ cashserver4_stable cashserver4' | sudo tee /etc/apt/sources.list.d/cashserver4.list
  2. Обновить список пакетов и установить пакет artixcs-online-shop:

    sudo apt-get update
    sudo apt-get install artixcs-online-shop

Конфигурирование модуля

Настройка модуля производится в файле /opt/artixcs-online-shop/application.properties:

Наименование

Тип данных

Описание

Примечания

server.port

числовойПорт, на котором балансировщик нагрузки ожидает данныеПо умолчанию 9010

su.artix.cashserveronlineshop.client.virtualcash.url

строковый

URL подключения к виртуальной кассе

Порт в параметрах должен совпадать с портом в настройках виртуальной кассы, на котором касса ожидает данные

Значение параметра может быть с приставкой "http://" или без нее.

Например, "http://localhost:8090/" и "localhost:8090/" будут работать идентично.

su.artix.cashserveronlineshop.client.virtualcash.user

строковыйЛогин пользователя для подключения к виртуальной кассе

su.artix.cashserveronlineshop.client.virtualcash.password

строковыйПароль пользователя для подключения к виртуальной кассе

su.artix.cashserveronlineshop.client.cs.url

строковыйURL для подключения к кассовому серверу, на который будет сохраняться чек из интернет-магазина

su.artix.cashserveronlineshop.client.cs.user

строковыйЛогин пользователя для подключения к кассовому серверу

Используется при включенной аутентификации по REST API. Активируется в настройках кассового сервера

su.artix.cashserveronlineshop.client.cs.password

строковыйПароль пользователя для подключения к кассовому серверу

Используется при включенной аутентификации по REST API. Активируется в настройках кассового сервера

loadBalancer.session.maxCacheSize

числовойМаксимальное количество хранимых сессий

По умолчанию 1000

loadBalancer.session.expireCacheTimeMin

числовойВремя жизни сессии в минутах

По умолчанию 1000

virtualCashCluster.error.percent

числовойКритический уровень ошибок кассы (в процентах от веса кассы)

По умолчанию 1000

virtualCashCluster.error.catch.window.time.minчисловойВременной интервал плавающего окна для регистрации ошибок кассы (в минутах)По умолчанию 5

virtualCashCluster.error.penalty.time.ms

числовойВремя, в течение которого на кассу не будут распределяться запросы, в случае если касса достигла критического уровня ошибок (в миллисекундах)

По умолчанию 300000

su.artix.cashserveronlineshop.client.virtualcash.requestQueueTimeoutMs

числовойВремя ожидания запроса в очереди запросов на кассу (в миллисекундах)

По умолчанию 3000

Пример настройки
server.port=9010
##################
# Подключение к виртуальной кассе
su.artix.cashserveronlineshop.client.virtualcash.url=http://localhost:8090/
su.artix.cashserveronlineshop.client.virtualcash.user=
su.artix.cashserveronlineshop.client.virtualcash.password=
##################
# Подключение к кассовому серверу (КС)
su.artix.cashserveronlineshop.client.cs.url=http://localhost:8080/CSrest/rest/
su.artix.cashserveronlineshop.client.cs.user=
su.artix.cashserveronlineshop.client.cs.password=  

#######################################
# Балансировщик нагрузки

# Максимальное кол-во хранимых сессий
loadBalancer.session.maxCacheSize=1000
# Время жизни сессии в минутах
loadBalancer.session.expireCacheTimeMin=1000
# Критический уровень ошибок кассы (в процентах от веса кассы)
virtualCashCluster.error.percent=10
# Временной интервал плавающего окна для регистрации ошибок кассы (в минутах)
virtualCashCluster.error.catch.window.time.min=5
# Время в течении которого на кассу не будут распределяться запросы, в случаи если касса достигла критического уровня ошибок (в миллисекундах)
virtualCashCluster.error.penalty.time.ms=300000

#######################################
# Очередь запросов на кассу

# Время ожидания запроса в очереди запросов на кассу (в миллисекундах)
su.artix.cashserveronlineshop.client.virtualcash.requestQueueTimeoutMs=3000

serviceName=artixcs-online-shop

Запросы расчета дисконта распределяются между кассами в соответствии с их весом. Чем больше вес у кассы, тем чаще запросы будут отправляться на данную кассу за один цикл. За один цикл осуществляется минимум 100 запросов.

Если во время запроса на кассу в течение времени, указанного в настройке virtualCashCluster.error.catch.window.time.min, был зафиксирован определенный процент ошибок от веса (процент определяется параметром virtualCashCluster.error.percent), то балансировщик перестанет отправлять запросы на данную кассу в течение времени, которое указано в настройке virtualCashCluster.error.penalty.time.ms.

При отправке запроса на кассу автоматически создается сессия. В рамках созданной сессии можно повторно отправлять запросы на ту же кассу.

Сессии создаются при отправке любых запросов, кроме запросов с расчетом дисконта.

Кроме ответа на запрос также возвращается идентификатор сессии в поле jssesionid в coockie. Повторно обратиться к той же кассе для отправки запросов можно с использованием данного идентификатора. Для этого необходимо вручную отправить в coockie запроса идентификатор сессии.

Максимальное количество хранимых сессий определяется параметром loadBalancer.session.maxCacheSize.
В рамках созданной сессии:

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

    Время жизни сессии определяется параметром loadBalancer.session.expireCacheTimeMin.

Все запросы, отправляемые в рамках одной кассы, помещаются в очередь балансировщика. Если запрос находился в очереди балансировщика дольше времени, указанного в настройке su.artix.cashserveronlineshop.client.virtualcash.requestQueueTimeoutMs, то балансировщик вернет ошибку об истечении времени ожидания.

Если во время распределения балансировщиком запросов по текущим кассам выгружается новый список касс, то для обработки запросов по новым кассам будет создан дополнительный балансировщик.

REST API для работы с балансировщиком

Передача онлайн-чека с расчетом воздействий

Для передачи онлайн-чека на виртуальную кассу через балансировщик и расчета дисконтных и бонусных воздействий необходимо выполнить запрос типа POST на URL:

http://<host>:<port>/receipt/calculate?[shopcode=<shopCode>&clusterid=<clusterId>&istotal=true|false]

Наименование

Тип данных

Описание

Примечания

shopcodestringКод магазинаНеобязательный параметр. По умолчанию код магазина All

clusterid

stringИдентификатор кластераНеобязательный параметр

istotal 

boolean

Сохранять результат в БД кассового сервера для возможности оплаты на обычной кассе:

  • true – результат сохраняется в БД кассового сервера.
    Чек с таким значением может быть передан только 1 раз, он откладывается в БД КС и может быть только восстановлен на кассе.
  • false – результат передается на виртуальную кассу для расчета дисконтной системы.

Необязательный параметр.

По умолчанию false

Пример тела запроса
{
  "identifier": "100500",
  "positions": [
    {
      "posnum": 1,
      "barcode": "1",
      "quant": 10,
      "price": 10.60,
      "minprice": 5.00,
      "name": "test goods"
    }
  ],
  "cards": [
    {
      "number": "1"
    }
  ],
  "coupons": [
    {
      "number": "2232"
    }
  ],
  "dontChange": true
}

, где

  • identifier – уникальный идентификатор чека,
  • dontChange – признак модификации чека:
    • true – модификация чека запрещена (добавление/сторнирование позиций, применение модификаторов и т.д.),
    • false – чек можно модифицировать.

Для использования цены из интернет-магазина в запросе должны быть переданы цена и минимальная цена товара. Если один или оба этих параметра не будут переданы, то виртуальная касса подставит данные из собственной БД.

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

В ответ возвращается результирующий чек с воздействиями, который возвращает VPOS.

Расчет воздействий и резервирование суммы бонусов для оплаты

Для расчета дисконтных и бонусных воздействий, резервирования суммы бонусов для оплаты, сохранения чека на КС необходимо выполнить запрос типа POST на URL:

http://<host>:<port>/receipt/spend?[shopcode=<shopCode>&clusterid=<clusterId>&spendSum=<spendSum>]

Наименование

Тип данных

Описание

Примечания

shopcodestringКод магазинаНеобязательный параметр. По умолчанию код магазина All

clusterid

stringИдентификатор кластераНеобязательный параметр

spendSum 

BigDecimalСумма оплаты бонусами

Необязательный параметр

Пример тела запроса
{
  "identifier": "100500",
  "positions": [
    {
      "posnum": 1,
      "barcode": "1",
      "quant": 10,
      "price": 10.60,
      "minprice": 5.00,
      "name": "test goods"
    }
  ],
  "cards": [
    {
      "number": "1"
    }
  ],
  "coupons": [
    {
      "number": "2232"
    }
  ],
  "dontChange": true
}

, где

  • identifier – уникальный идентификатор чека;
  • dontChange – признак модификации чека:
    • true – модификация чека запрещена (добавление/сторнирование позиций, применение модификаторов и т.д.);
    • false – чек можно модифицировать.

Для использования цены из интернет-магазина в запросе должны быть переданы цена и минимальная цена товара. Если один или оба этих параметра не будут переданы, то виртуальная касса подставит данные из собственной БД.

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

В ответ возвращается результирующий чек с воздействиями, который возвращает VPOS.

Оплата чека онлайн

Для оплаты чека онлайн необходимо выполнить запрос типа POST на URL:

http://<host>:<port>/receipt/total?[shopcode=<shopCode>&clusterid=<clusterId>]

Наименование

Тип данных

Описание

Примечания

shopcodestringКод магазинаНеобязательный параметр. По умолчанию код магазина All

clusterid

stringИдентификатор кластераНеобязательный параметр
Пример тела запроса "чек с рассчитанными скидками"
{
  "check": {
    чек_с_рассчитанными_скидками
  },
  "payments": [
    {
      "type": 0,
      "amount": 0
    }
  ],
  "customerAddress": "string"
} 

Параметры тела запроса:

НаименованиеТип данныхОписание
checkobjectРезультат запроса, выполненного ранее методом calculatediscount или spendbonus
paymentsobjectОплата
customerAddressstringАдрес (телефон или e-mail) покупателя

Параметры объекта payments:

НаименованиеТип данныхОписание
typeintКод типа оплаты в кассе
amountdecimal

Сумма оплаты

В процессе выполнения запроса total осуществляется удаленное закрытие чека на ФР.

В таблицу onlinecheck добавляется новая запись со статусом ONLINE_PAYING и статусом оплаты NOT_CONFIRM. В таблицу onlineCheckPayStatus добавляется запись об оплате чека со статусом NOT_CONFIRM.

Если запрос выполнен корректно, то в ответе от сервера будет получен идентификатор сохраненного онлайн-чека:

Пример ответа
{
    "id": 3
}

Получение статуса оплаты онлайн-чека

Для получения статуса оплаты онлайн-чека необходимо выполнить запрос типа GET на URL:

http://<host>:<port>/receipt/getdocumentinfo?[documentid=<documentId>&shopcode=<shopCode>&clusterid=<clusterId>]

Наименование

Тип данных

Описание

Примечания

documentidstringИдентификатор документаОбязательный параметр
shopcodestringКод магазинаНеобязательный параметр. По умолчанию код магазина All

clusterid

stringИдентификатор кластераНеобязательный параметр

Если запрос выполнен корректно, то в ответе от сервера будет получен статус оплаты:

Пример ответа "Оплата прошла успешно"
{
  "SUCCESS": [
    "fd2628a5-4912-4157-bdd8-b1b9f86bb566": "SUCCESS",
    "6333acdb-07ad-49b1-8776-f3555c46d132": "SUCCESS"
  ]
}

Если хотя бы одна оплата не прошла, то будет получен статус FAIL

Пример ответа "Оплата с ошибкой"
{
  "FAIL": [
    "fd2628a5-4912-4157-bdd8-b1b9f86bb566": "SUCCESS",
    "6333acdb-07ad-49b1-8776-f3555c46d132": "FAIL"
  ]
}

В процессе выполнения запроса getDocumentInfo обновляется статус оплаты в таблице onlineCheckPayStatus. Такой же статус оплаты устанавливается у чека в таблице onlinecheck.

Сохранение чека с оплатами в БД кассового сервера

Для сохранения чека с оплатами в БД КС с последующим восстановлением на кассе необходимо выполнить запрос типа POST на URL:

http://<host>:<port>/receipt/savePayedCheck/payeddocumentId?[shopcode=<shopCode>&clusterid=<clusterId>]

Наименование

Тип данных

Описание

Примечания

payeddocumentidstringИдентификатор чека, по которому проходила оплатаОбязательный параметр
shopcodestringКод магазинаНеобязательный параметр. По умолчанию код магазина All

clusterid

stringИдентификатор кластераНеобязательный параметр
Пример тела запроса "чек с оплатами"
{
  "cards": [
    {
      "bonusbalance": 62.8,
      "cardmode": 1,
      "idcardgroup": 1,
      "namecardgroup": "bonus",
      "number": "911",
      "sessionid": "_cash_1030_0bccc9d3$1.1.0.2.093757211$0$1"
    }
  ],
  "identifier": "243",
  "pointsForEarn": 0.4,
  "positions": [
    {
      "barcode": "1",
      "code": "1",
      "dept": null,
      "discounts": [
        {
          "campaigncode": 6,
          "campaignname": "1",
          "discountcode": 7,
          "discountmode": 1,
          "discountname": "new name",
          "discountrate": 5,
          "discountsum": 0.76,
          "discounttype": 1,
          "ispositiondiscount": 0,
          "minpriceignored": false,
          "posnum": 1
        }
      ],
      "earnedbonuses": [
        {
          "amount": 0.4,
          "assettimebeg": "",
          "assettimeend": "",
          "campaigncode": 1,
          "campaignname": "111",
          "cardnumber": "911",
          "ispositionbonus": 0,
          "weight": 0
        }
      ],
      "isallowbonusspend": true,
      "measure": 1,
      "measurename": "шт",
      "minprice": 13.68,
      "name": "МОЛОКО БМК 1.5% 1Л П/П",
      "paymentmethod": 0,
      "paymentobject": 0,
      "posnum": 1,
      "price": 15.2,
      "quant": 1,
      "spentbonuses": [
        {
          "campaigncode": 1,
          "campaignname": "111",
          "cardnumber": "911",
          "discountcode": 3,
          "discountmode": 2,
          "discountname": "Новое имя",
          "discountsum": 10,
          "discounttype": 5,
          "ispositiondiscount": 0,
          "posnum": 1,
          "sessionid": "_cash_1030_0bccc9d3$1.1.0.2.093757211$0$1"
        }
      ],
      "sum": 4.44,
      "sumWithoutDiscounts": 15.2,
      "taramode": 0,
      "tmc": {
        "minprice": 13.68,
        "price": 15.2
      },
      "vatcode": -1,
      "vatrate": 0,
      "vatsum": 0
    }
  ],
  "sum": 4.44,
  "dontChange": null,
  "payments": [
    {
      "type": 1,
      "amount": 1,
      "valcode": 1,
      "valname": "ru"
    }
  ]
}

Если запрос выполнен корректно, то в ответе от сервера будет получен идентификатор нового онлайн-чека:

Пример ответа
{
    "id": 3
}

В процессе выполнения запроса savePayedCheck статус документа, по которому проходила оплата, меняется на ONLINE_CLOSED. Чек с оплатами записывается в таблицу onlinecheck со статусом NEW, в поле sourcedocumentid записывается ссылка на оплаченный документ. Данный чек необходимо восстановить на кассе.

  • No labels