Есть сервер и клиент. На сервере поднят вэб сервис. На клиенте получаю ссылки на 50 документов и в цикле начинаю их по одному отправлять на сервер.
На сервер приходит только 9-10 документов. При этом процедура пишет что завершилась и всё хорошо. Никаких ошибок в журнале регистрации нет.
В чём может быть проблема? Куда могут потерятся документы?
(5) AllexSoft, Вроде одну причину нашёл.... Моя ошибка. Почему то не всегда были данные для отправки...
Но возникает другой вопрос... Если на клиенте я получаю описание XDTO пакета с сервера это замедляет работу?
У меня на сервере определены XDTO пакеты. Описание строки и таблицы. Я их получаю на клиенте. Заполняю и потом отправляю.
Проблема в том что уходит много времени на подключение. Бывает по 4-7 секунд задержка пока прокси создаётся. Хотя базы обе лежат локально на одном ПК.
(6) TODD22, дело в том что при соединении с веб сервисом клиент получает описание веб-сервиса, то есть какие там типы используются, какие пространства имен, какие есть процедуры и функции, входящие\исходящие параметры и тд.. он получает это описание в XML, потом он преобразует это в коллекции соответствующих свойств объектов, все это занимает время.. отсюда длительное время подключения. Например в SOAP-клиенте на PHP есть флаг разрешающий кэширование определения сервиса, тогда соединение происходит гораздо быстрее.. по понятным причинам) а вот в 1C такого нет, к сожалению (
(7) AllexSoft, Это плохо :(
Попробую тогда может позже перейти на http сервисы.
Сейчас у меня вообще соединение по COM идёт... по сети со всей области магазины подключаются по СОМ.
Думал перейду на вэб сервисы будет быстрее.... :(
(8) TODD22, я бы на вашем месте не особо спешил переходить на http-сервисы, там свои проблемы ) я бы не был так уверен что он будет работать быстрее, не для этого он нужен) все таки правильная настройка сервиса и уменьшение описания сервиса за счет удаления пакетов может сыграть большую роль в ускорении.. я вот по большей части стараюсь либо сделать свой XDTO пакет с простыми типами типа строка, булево, число.. и передавать все в них, либо вообще обойтись без пакетов.. и передавать строку неограниченной длины (она работает без пакетов вообще), а вот в строку с помощью JSON http://v8.1c.ru/o7/201410json/index.htm можно положить что угодно =) Получается очень быстрый сервис.
Например в SOAP-клиенте на PHP есть флаг разрешающий кэширование определения сервиса, тогда соединение происходит гораздо быстрее.. по понятным причинам) а вот в 1C такого нет, к сожалению (
(25) dj_serega, отличная статья в тему! может кстати у ТС действительно что то в модуле сеанса написано этого, что долго инициируется.. я что то совсем забыл этот момент. Даже с его пакетом 7 секунд на инициализацию веб-сервиса это очень много
(6) TODD22, ПС: если это ваш самописный веб сервис то зайдите на закладку Прочее, в свойствах веб-сервиса, там будет Пакеты XDTO, делайте минимальное количество пакетов, нужно отнестись к этому очень внимательно и изучить типы в каждом из пакетов и понятно насколько он вам нужен, иногда проще передавать в строках, чем использовать какой то тяжелый пакет с кучей свойств и выиграть время на подключении к сервису в итоге)
(9) AllexSoft, Я передаю строковые данные. Это коды номенклатуры и тд. То есть там никаких сложных типов у меня нет.
Единственное у меня передаются данные в виде таблицы. То есть таблица продаж. А в ней строки.
Вот эта таблица и строки описаны в виде пакета.
Это я из типовой конфигурации взял. Вернее переделываю бонусный сервер в типовой рознице.
Вот на скрине те пакеты которые мне нужны. В них передаются продажи и бонусы.
(13) TODD22, ну тогда только разделять на разные web-сервисы, например один сервис возвращает информацию о накоплениях, другой о бонусах и тд, ну и разделить пакет ДисконтныйСервер на несколько соответственно.. либо вообще отказаться от пакетов и сделать сериализацию через JSON и передавать просто строку. Хотя может у вас там может просто ПК слабенький ..
(14) AllexSoft, ПК хороший i3 и 16 Гб ОЗУ.
Попробую в рабочем режиме как будет. Если до этого на COM работали то я думаю тут будет быстрее немного, относительно СОМ.
(1) TODD22, а нельзя передавать эти самые 50 документов одним пакетом? Зачем их передавать в цикле по одному? Передайте сразу все (сформируйте xml файлик, таблицу значений, еще что нибудь) а потом уже разбирайте на сервере, тем самым избежите проблем с большим количеством подключений.
А нет опыта работы с большим количеством подключений? У меня доходит до 25 подключений в минуту... А нужно с запасом сделать хотя бы 50. То есть передавать от 50 клиентских баз по документу в минуту.
Потянет? сами документы у меня в базу записываются с движениями по одному регистру. А потом перепроводятся регламентным заданием.
Проверил 100 документов у меня передаются на сервер за 220 секунд, в среднем по 2.2 секунды на документ.
Это при том что прокси поднят. И в цикле просто вызываю функцию передачи.
(21) TODD22, я бы на твоем месте задумался о Внешних источниках данных на клиентах.. подключаем базу (с разрешенным доступом из вне) через внешние источники и вуаля, получаем данные напрямую из базы и пишем их туда.. ну а малой кровью - все таки работать без пакетов, просто через передачу строки, которую формировать через ЗначениеВСтрокуВнутр и принимать на клиентах ЗначениеИзСтрокиВнутр
ПС: пропробуй ради эксперимента создай пустой веб-сервис, который возвращает "тест", без пакетов и пропробуй его вызвать, посмотришь какую выгоду получишь при подключении на сервисе без пакетов
Дочитав ветку хочу предложить написать на http.
Логика следующая:
1. Формируем xml
2. Пакуем в архив с паролем (можно упустить если соединение предполагается защищенным)
3. Пакуем файл (архив или xml) в двоичные данные
4. Пакуем в Хранилище Значения
5. теперь в строку и на http.
А источники данных по какой технологии подключаются?
Сейчас у меня по COM подключаются узлы к центральной базе. Если плохое интернет соединение. Постоянно обрывается, но при этом ТимВьювер работает. И переодически переподключается. То COM может повесить 1Ску :(
(29) TODD22, внешние источники подключаются напрямую в БД (то есть прям непосредственно в MS SQL), с помощью драйвера, в обход 1С.. никаких инициализаций сеанса или сериализации данных там не происходит, поэтому нет дополнительных накладных расходов, которые есть и при HTTP-сервисе, и Web-сервисе. Правда нужно учитывать проблемы с записью в данные напрямую в БД, контроль целостности, перерасчет итогов виртуальных таблиц и тд..
(31) TODD22, ну почему же, БД можно опубликовать во вне, в интернет, обычная проброска портов на шлюзе. Единственное нужно будет правильно настроить фаервол на шлюзе, что бы левые не коннектились.. хотя с GSM будет проблема, там IP динамический) Думаю вам лучше начать со скорости запуска Web-сервиса который вы написали, как он есть, с сеансовых модулей.. возможно создать отдельную роль под WebСервис, ну а в модуле сеанса инициализировать только самые важные параметры типа
Если РольДоступна("ДоступДляВебСервиса") тогда
//инициализируем только самые важные параметры
.....
выход;
КонецЕсли;
ну и я так понимаю вы тестируете скорость работы сервиса просто вызовом его в цикле, что не совсем верно.. вот вам пример, что выполнится раньше 100 подключений от разных клиентов к веб-сервису или 100раз вызов сервиса в цикле. Дело в том что Web-сервисы работают параллельно, поэтому клиенты могут коннектиться все одновременно, то есть будет затрачено 7 секунд всего на все 100подключений (в идеале, в реале наложится нагрузка на сервис при одновременном коннекте что снизит производительность), а в цикле будет ожидание вызова сервиса каждый раз, то есть 7х100 = 700 секунд
(32) AllexSoft, В цикле я смотрел за сколько у меня выгрузится 100 документов при условии что у меня например целый день не было связи. Интернет частая проблема, то кабель где нибудь порвут, то оборудование у провайдера сгорит, то профилактика то ещё что... в общем периодически бывает простой. Документы копятся... 100 документов за 220 секунд меня вполне устроят...
Буду пробовать ускорять передачу одного документа, а то 7 секунд это долго 3-4 комфортное время, а вот 7 уже долго для кассы.... у нас не супермаркет, поток не большой. Но всё же... не понятно что будет когда будут конектится по 30-50 магазинов в минуту.... с другой стороны СОМ это выдерживает...
Сделал замер производительности установки параметров сеансов.
Одна строка выполняется 69% времени и чистое время 3.1111. Чистое время в секундах показывается?
(34) TODD22, попробуй закомментировать эту строку.. ну или временно пустое значение нужного типа туда установить.. и посмотри улучшится ли скорость вызова веб-сервиса
(36) AllexSoft, Делал замер производительности. Нашёл строки которые работают долго. Потом программу закрыл. Открыл заново, и теперь больше не могу найти эти строки...
Вообще странно но у меня функция модуля сеанса выполняется 5 раз.
Не понимаю почему.... :( Первый раз когда поднимается прокси, второй раз когда отправляется документ. Потом ещё несколько раз подряд выполняется....
(37) TODD22, интересные наблюдения.. такого быть не должно по идее.. сеанс инициироваться должен только один раз, при подключении к веб-сервису клиента. Может у вас там что то с конфой? может кто то подписку при записи документа вашего залепил и вызывает что то, хотя зачем.. непонятно в общем) похоже вам за отладку садиться надо и разбираться почему у вас так
Если просто запускаю базу под тем же пользователем под которым подключаюсь то процедура установки параметров вызывается 3 раза. Если через сервис обращаюсь то 6 раз.
(46) TODD22, там в метаданных Общие - Ws-ссылки, туда добавить он имеет ввиду и ее вызывать.. только толку это не особо прибавит (имхо), для ваших целей учета бонусов она все равно будет каждый раз новая инициализироваться в каждом документе ЧекККМ. Ну все равно попробуйте, 1% что поможет он есть )))