Установка балансировщика нагрузки
Балансировщик нагрузки для работы с интернет-магазином можно установить совместно с VPOS.
Для установки балансировщика нагрузки необходимо:
Прописать репозитории:
Для кассового сервера версии 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
Обновить список пакетов и установить пакет
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 подключения к виртуальной кассе | Порт в параметрах должен совпадать с портом в настройках виртуальной кассы, на котором касса ожидает данные Значение параметра может быть с приставкой " Например, " |
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 | числовой | Максимальное количество хранимых сессий | По умолчанию |
loadBalancer.session.expireCacheTimeMin | числовой | Время жизни сессии в минутах | По умолчанию |
virtualCashCluster.error.percent | числовой | Критический уровень ошибок кассы (в процентах от веса кассы) | По умолчанию |
virtualCashCluster.error.catch.window.time.min | числовой | Временной интервал плавающего окна для регистрации ошибок кассы (в минутах) | По умолчанию 5 |
virtualCashCluster.error.penalty.time.ms | числовой | Время, в течение которого на кассу не будут распределяться запросы, в случае если касса достигла критического уровня ошибок (в миллисекундах) | По умолчанию |
su.artix.cashserveronlineshop.client.virtualcash.requestQueueTimeoutMs | числовой | Время ожидания запроса в очереди запросов на кассу (в миллисекундах) | По умолчанию |
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]
Наименование | Тип данных | Описание | Примечания |
---|---|---|---|
shopcode | string | Код магазина | Необязательный параметр. По умолчанию код магазина All |
clusterid | string | Идентификатор кластера | Необязательный параметр |
istotal | boolean | Сохранять результат в БД кассового сервера для возможности оплаты на обычной кассе:
| Необязательный параметр. По умолчанию |
{ "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>]
Наименование | Тип данных | Описание | Примечания |
---|---|---|---|
shopcode | string | Код магазина | Необязательный параметр. По умолчанию код магазина 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>]
Наименование | Тип данных | Описание | Примечания |
---|---|---|---|
shopcode | string | Код магазина | Необязательный параметр. По умолчанию код магазина All |
clusterid | string | Идентификатор кластера | Необязательный параметр |
{ "check": { чек_с_рассчитанными_скидками }, "payments": [ { "type": 0, "amount": 0 } ], "customerAddress": "string" }
Параметры тела запроса:
Наименование | Тип данных | Описание |
---|---|---|
check | object | Результат запроса, выполненного ранее методом calculatediscount или spendbonus |
payments | object | Оплата |
customerAddress | string | Адрес (телефон или e-mail) покупателя |
Параметры объекта payments
:
Наименование | Тип данных | Описание |
---|---|---|
type | int | Код типа оплаты в кассе |
amount | decimal | Сумма оплаты |
В процессе выполнения запроса total
осуществляется удаленное закрытие чека на ФР.
В таблицу onlinecheck
добавляется новая запись со статусом ONLINE_PAYING
и статусом оплаты NOT_CONFIRM
. В таблицу onlineCheckPayStatus
добавляется запись об оплате чека со статусом NOT_CONFIRM
.
Если запрос выполнен корректно, то в ответе от сервера будет получен идентификатор сохраненного онлайн-чека:
{ "id": 3 }
Получение статуса оплаты онлайн-чека
Для получения статуса оплаты онлайн-чека необходимо выполнить запрос типа GET на URL:
http://<host>:<port>/receipt/getdocumentinfo?[documentid=<documentId>&shopcode=<shopCode>&clusterid=<clusterId>]
Наименование | Тип данных | Описание | Примечания |
---|---|---|---|
documentid | string | Идентификатор документа | Обязательный параметр |
shopcode | string | Код магазина | Необязательный параметр. По умолчанию код магазина 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>]
Наименование | Тип данных | Описание | Примечания |
---|---|---|---|
payeddocumentid | string | Идентификатор чека, по которому проходила оплата | Обязательный параметр |
shopcode | string | Код магазина | Необязательный параметр. По умолчанию код магазина 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
записывается ссылка на оплаченный документ. Данный чек необходимо восстановить на кассе.