Имя: Пароль:
1C
 
Высоконагруженные веб-сервисы на 1С
,
0 anchar007
 
08.12.17
09:04
Всем привет!
Интересует возможность создания веб-сервиса на 1С, который мог бы обрабатывать не меньше 100 запросов в секунду (от 1-2 потоков).
В общем я тестировал файловую и серверную базу на локальном ПК i3-6100 3.7 ГГц, 8Гб ОЗУ, SSD.
Файловая база с элементарным веб-сервисом типа "По номеру номенклатуры вернуть её наименование" может обрабатывать примерно 150 запросов в секунду.
Серверная с таким же веб-сервисом обрабатывает примерно 110 запросов в секунду.
Но если в веб-сервис добавить арифметические действия, например "за период от N до M вернуть наименование номенклатуры и её стоимость, которая вычисляется на основании нескольких параметров", то производительность падает очень сильно. Файловая база обрабатывает максимум 2 запроса в секунду. Причем, если закомментировать участок кода с арифметическими операциями вычисления стоимости, то снова больше 100 запросов в секунду.
Вопроса два:
1) Может кто-нибудь делал/читал/слышал что-то подобное и расскажет как увеличить производительность веб-сервиса в 1С?
2) Нашел статью http://catalog.mista.ru/public/540168/ про настройку metadata.js. Попробовал разобраться, но видимо без знания javascript там делать нечего. Может есть ещё примеры интеграции 1С с другими базами данных для увеличения производительности?
1 Волшебник
 
модератор
08.12.17
09:06
Аккумулируйте все ваши 100 запросов в один запрос.
2 Asmody
 
08.12.17
09:07
(1) 100 запросов от разных клиентов надо понимать
3 Asmody
 
08.12.17
09:08
(0) А точно надо тащить это непосредственно из 1С?
4 Волшебник
 
модератор
08.12.17
09:08
(2) Значит нужен промежуточный агрегатор.
5 Asmody
 
08.12.17
09:13
Я бы подготовленные данные выгружал в быстрое внешнее хранилище регламентным. А отдавал каким-нибудь простеньким сервисом на go/elixir
6 Genayo
 
08.12.17
09:17
(0) 1. Какая платформа?
    2. Кроме метадаты подобное предлагает еще Юрий Лазаренко.
7 ИмяФамилия
 
08.12.17
09:24
(5) +1
выгружать из 1с во чтото предназначенное для этих целей.
либо кэшировать выгруженное промежуточно в какомнить nginx.
8 vde69
 
08.12.17
09:24
(1) подобные финты запрещены лицензией 1с в явном виде.

то есть разрешено делать через промежуточное хранилище, но не разрешено работать с базой нескольким пользователям под одной сесией
9 Владимир1С
 
08.12.17
09:34
(0)
"Причем, если закомментировать участок кода с арифметическими операциями вычисления стоимости"

Это твой ответ: значения должны быть в уже готовом виде. Поле в карточке товара.

Какова периодичность изменения цен?
10 vde69
 
модератор
08.12.17
09:37
(9) >>>значения должны быть в уже готовом виде. Поле в карточке товара.


бред... ты так текущие остатки похрани...
11 Владимир1С
 
08.12.17
09:40
(10) В топике речь идёт о ценах. Расчёт цен может быть очень непростым, в общем случае. Цель ТС - ускориться. Значит, нужно применять всё что возможно.
12 Сияющий в темноте
 
08.12.17
09:42
в данном случае,работы с базой неи,есть получение информации из базы
работа же обычно подразумевает изменение данных в базе
13 Остап Сулейманович
 
08.12.17
09:43
(11) Бесполезно. Это 1С. Можно и фары тереть и по колесу стучать... а оно стсуко не предназначено и все тут. Самый правильный ответ в (4), (5). Любые пляски внутри 1С (по состоянию на сейчас - не спасут).
14 Остап Сулейманович
 
08.12.17
09:47
(12) "работы с базой неи,есть получение информации из базы"
Среди типового набора операций с базами данных CRUD - Reading стоит на втором месте.
15 Владимир1С
 
08.12.17
09:49
(0) Отладчик в режиме замера времени тебе в помощь,      anchar007. Что то мне подсказывает, что дело в алгоритме вычисления цены.
16 ptiz
 
08.12.17
09:50
(0) "арифметические действия" - похоже, что это не "арифметические" действия, а обращения к СУБД.
17 vde69
 
модератор
08.12.17
09:51
(15) не обязательно, возможно дело в индексах, а возможно в том, что атор пытается запустить сервис на персоналке
18 Владимир1С
 
08.12.17
09:51
(0) Процедура по получению цен хранимая или, хотя бы, не компилируется при каждом обращении?
19 Остап Сулейманович
 
08.12.17
09:51
(15) Фирма 1С считает, что дело в создании окружения для каждого сеанса. Открытие таблиц, выполнение модуля внешнего приложения, и особо выделено "инициализация параметров сеанса". А не в алгоритме вычисления цены.
20 бомболюк
 
08.12.17
09:52
(0) я бы не тратил время и сразу бы искал решение за рамками 1С.
21 Владимир1С
 
08.12.17
09:54
(0) Подробности алгоритма вычисления цены Давай сюда, обсудим.
22 arsik
 
гуру
08.12.17
09:56
(8) Так начинается каждый первый комментарий в топике от  vde69. Да сколько можно? Ты хоть один раз видел, что бы за это кого то наказали?
23 Владимир1С
 
08.12.17
09:57
(22) Здесь территоррия считается общественной, поэтому пусть его, пишет.
24 arsik
 
гуру
08.12.17
09:58
(0) Создай 100 вебсервисов в 1й базе :)
25 vde69
 
модератор
08.12.17
09:58
(24) файловая от этого загнется
26 Владимир1С
 
08.12.17
10:00
(0) Где ТС? Где подробности? Надо определить, насколько оправданно вычисление цены при каждом обращении.
27 anchar007
 
08.12.17
10:01
(6) 1. Какая платформа?
    2. Кроме метадаты подобное предлагает еще Юрий Лазаренко.

1. 8.3.10.2561
28 Filin
 
08.12.17
10:03
(26) ТС гуглит что такое "go/elixir" :)
29 anchar007
 
08.12.17
10:04
(2) 100 запросов от 1-2 клиентов. Есть 2 сайта, которые хотели бы получать данные из нашей 1С.
30 Владимир1С
 
08.12.17
10:15
(29) наконец подробности. Далее, приведи , хотя бы на словах, от чего зависит цена в данный момент. Точный список.
31 anchar007
 
08.12.17
10:21
Как я считаю цены:

1) выполняется запрос, который из тысяч элементов отбирает 156

2) Для каждого из 156 элеменов делаем запрос к регистру сведений. Получаем базовую стоимость этого элемента. (СтоимостьАренды)

3) дальше считаем новую стоимость в цикле из пункта 2:

//После этого присваиваем свою стоимость аренды
СтоимостьАренды = 14000;
        
//Считаем стоимость аренды зала без НДС
//ArendaZala - входной параметр функции веб-сервиса
Если элемент.НДС = ЛОЖЬ Тогда
   СтоимостьАрендыБезНДС = СтоимостьАренды - СтоимостьАренды/118*18;
   ОбщаяСтоимостьАрендыБезНДС= Окр(СтоимостьАрендыБезНДС*ArendaZala,2);
КонецЕсли;
        
//Считаем общую стоимость аренды зала с НДС
ОбщаяСтоимостьАренды = СтоимостьАренды*ArendaZala;
        
//Считаем комиссию
//Допустим мы обращамеся к реквизиту элемента, но для простоты присваиваю просто константу
ПроцентКомиссии = 20;        
Комиссия = ОбщаяСтоимостьАрендыБезНДС*ПроцентКомиссии/100;
        
ВозвращаемаяСтрока = ВозвращаемаяСтрока+элемент+"$"+Строка(ОбщаяСтоимостьАрендыБезНДС)+"$"+Строка(ОбщаяСтоимостьАренды)+"$"+Строка(Комиссия)+Символы.ПС;

4) в результате выполнения получаем много строк, например:
<>$21 355 932,2$25 200 000$4 271 186,44
<>$21 355 932,2$25 200 000$4 271 186,44
<>$21 355 932,2$25 200 000$4 271 186,44
<>$21 355 932,2$25 200 000$4 271 186,44
<>$21 355 932,2$25 200 000$4 271 186,44
32 v77
 
08.12.17
10:35
(31) ну тупо выгружай свои данные из 1с куда хош, напиши сервис на чём хош и пускай оно работает быстро быстро. там данных то кот наплакал.
33 Владимир1С
 
08.12.17
10:41
(31) Организуй логирование с отметками времени каждого этапа. В отдельную ТЗ, после выполнения теста по кнопочке ТЗ пишешь в файл и смотришь, какая часть портит тебе малину.  

по п.2: Базовая стоимость как часто меняется? Неужели по 1000 раз за день? Вынеси в дублирующее поле простого цифрового типа. Избавишься от запроса.
п.3: оптимизируй формулы. Убери умножения и деления по максимуму.

По последней строке п.3: элемент - ссылочного типа? Попробуй убрать его из символьной строки.

к п.1 вопрос: 156 - жёстко фиксированное число элементов или оно плавает? И запросик, работающий в п.1, в студию.
34 anchar007
 
08.12.17
11:08
(33) Спасибо!
"156 - жёстко фиксированное число элементов или оно плавает"
В тестовых целях это фиксированное число элементов. На реальных данных элементов может быть от 0 до 1000 примерно.

Но думаю нет смысла тратить время на 1С, а всё-таки лучше выгружать данные из 1С куда-то ещё. Вдруг запросов от сайтов будет не 100 в секунду, а 1000 или 10000, тогда 1С с этим скорее всего не справится.
35 Владимир1С
 
08.12.17
11:13
(34) Процент комиссии - фиксированный или завмсимый? Тоже, скорее всего, как бы фиксированный.

Может быть, просто класть файлик с готовыми ценами за день за объект в ФТП сайта?
36 Cyberhawk
 
08.12.17
11:16
(8) Гонишь, см. 57 ответ http://v8.1c.ru/predpriyatie/questions_licence.htm#57
37 anchar007
 
08.12.17
11:52
(35) и процент комиссии и цены могут меняться в зависимости от периода [N;M].
Пример: клиент заходит на сайт, говорит хочу забронировать номер в отеле в городе таком-то на такие-то даты, сайт идёт в 1С и 1С возвращает все доступные номера и цены по каждому номеру. Но цена зависит от периода [N;M], т.к. бывают "горячие сезоны", в которые проживание в номере будет стоить дороже. Комиссия тоже может меняться.
38 Владимир1С
 
08.12.17
13:03
(37) По моим субъективным ощущениям, Именно эту задачу, в связке с сайтом, наверно, лучше решать через голый SQL, учитывая требуемую скорость выдачи данных.
39 H A D G E H O G s
 
08.12.17
14:13
(38) В моим ощущениям - даже голый прогретый sql не будет выдавать достаточно сложный запрос с производительностью в 10 мс.
40 H A D G E H O G s
 
08.12.17
14:16
У автора проблема в архитектуре.
41 Волшебник
 
модератор
08.12.17
14:17
(31) Запрос, надеюсь, в цикле?
42 H A D G E H O G s
 
08.12.17
14:21
Автору бы еще почитать про Итоги СрезаПоследних и правильно их пользовать.
Или, если это невозможно - пользовать СредПоследних от NAF
43 Волшебник
 
модератор
08.12.17
14:22
(42) Мы в своей конфигурации завели ещё один регистр НашРегистрСрезПоследних, который обновляется при записи основного НашРегистр. Кому нужен срез последних, лезет во второй регистр. Получилось быстро.
44 H A D G E H O G s
 
08.12.17
14:22
(43) В 8.3 это сделано на уровне платформы
45 Волшебник
 
модератор
08.12.17
14:27
(44) Ну и правильно
46 Cyberhawk
 
08.12.17
14:29
(44) Тока для таблицы срезов вроде нет кластерного индекса, WTF?
47 Cyberhawk
 
08.12.17
14:34
Ну и таблица среза в 8.3 вроде используется только когда параметр даты среза не указан, иначе все по-старинке (полная таблица сама с собой соединяется)
48 H A D G E H O G s
 
08.12.17
15:08
(47) Ну это естественно.
49 H A D G E H O G s
 
08.12.17
15:09
(46) Это хитрый план.
50 Cyberhawk
 
08.12.17
15:11
(48) Ну тады в (43) вариант поинтереснее, если нужны срезы на дату, а не на конец/начало времен
51 Asmody
 
08.12.17
15:14
(43) Задним числом пересчитываете?
52 H A D G E H O G s
 
08.12.17
15:17
(50) Там такой же вариант, как в Итогах, я так понял.
53 Владимир1С
 
08.12.17
15:22
(37) Правильно ли я понял, что в общем случае базовая цена дня  индивидуальна? Для каждого из 365 дней года?
54 DexterMorgan
 
08.12.17
15:22
(50) Идея то не новая, сами 1С во всяких УТ используют во всю, например: РС ДоступныеОстаткиПланируемыхПоступлений. Просто зависит она уже от потребностей конкретного предприятия, кому-то и типового ЦеныНоменклатуры достаточно
55 Fragster
 
гуру
08.12.17
15:26
всю арифметику считать в запросе, если элемент - ссылка, то также в запросе получать представление, строку формировать не через +, а через записьXML.записатьбезобработки, числа писать через XMLСтрока(число) вместо Строка() и тем более Формат()
56 Владимир1С
 
08.12.17
15:29
(0) Обрати внимание на (55) - стоит заморочиться и выполнить всё, что написано.
57 Волшебник
 
модератор
08.12.17
15:30
(51) Нет, там всегда срез последних (на текущую дату).
Кому нужен срез на заднюю дату, лезет в виртуальную таблицу
58 Asmody
 
08.12.17
15:40
(57) Не, я к тому, что вдруг кто-то задним числом что-то поменял?
59 Asmody
 
08.12.17
15:41
Ах, у вас только на текущую! Вопрос отпал
60 oleg_km
 
08.12.17
16:38
(41) Я думаю во вложенных циклах
61 Владимир1С
 
08.12.17
16:49
(0) а куда подевался ТС?
62 Сияющий в темноте
 
08.12.17
17:56
вот так и пишутся высоконагруженные сервисы по поиску аренды
тяп ляп и в продакшн
63 Лефмихалыч
 
08.12.17
20:27
(0) оно тупит не из-за 1С, а из-за запросов к БД. Надо сделать, чтобы запросы к сервису были, а запросов к БД не было. Вариантов туева тьма и все они базируются на кешировании и денормализации
64 Юрий Лазаренко
 
08.12.17
20:55
(0) Вы что-то не так делаете. Нам удавалось отрабатывать несколько десятков и даже сотен запросов в секунду не только с арифметическими действиями, но и с записью в БД.
65 Cyberhawk
 
08.12.17
21:56
(64) Так у него запросы в циклах двойной вложенности, см. (31) :)
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший