Имя: Пароль:
1C
 
HTTP сервис - количество запросов в секунду
0 andryscha1c
 
14.10.24
22:52
Подскажите, какое количество запросов в секунду способен принимать http сервис в 1С, чтобы не влияло на скорость обращения к сервису? Если в секунду поступает около 10 запросов, это нормально или могут возникнуть проблемы?
1 oleg_km
 
14.10.24
23:01
Смотря какая продолжительность обработки запросов. Но я как-то пробовал 1С на прочность с помощью LOIC. В конце концов упал весь сервер 1С. Пришлось перезапускать. Поэтому, если собираетесь основную базу выставить в инет, нужен балансировщик, ограничивающий интенсивность запросов.
2 andryscha1c
 
15.10.24
09:28
(1) Балансировщик, что вы имеете в виду, могли бы что-то порекомендовать? Мгновенные запросы получения остатков с другой базы планируется получать сразу, данные на создание элементов и документов планируется организовать через очередь заданий.
3 arsik
 
15.10.24
08:17
Может все же рест взять?
4 andryscha1c
 
15.10.24
09:23
(3) rest и планируется
5 Garykom
 
15.10.24
09:47
(0) веб-серверов с публикацией может быть несколько на кластер серверов 1С
так что затык будет не в http-сервисе а в самом сервере 1С и обвязке (nginx) перед веб-серверами
6 arsik
 
15.10.24
10:10
(4) Ну рест быстрый - должно работать. Я бы все же сделал нагрузочное тестирование.
7 andryscha1c
 
15.10.24
10:18
(6) rest явно же будет быстрее и производительнее, чем soap?
8 Asmody
 
15.10.24
11:15
(7) нет. вы не там ищете производительность
9 andryscha1c
 
15.10.24
11:23
(8) что вы имеете в виду?
10 Asmody
 
15.10.24
11:44
(9) скорость сериализации в json (в случае с rest) или в xml (при soap) не играет существенной роли. основное время уйдёт на извлечение/запись данных и бизнес-логику.
11 andryscha1c
 
15.10.24
11:48
(10) понял, спасибо. Пока что придерживаюсь rest все же. Но вопрос открыт все еще на количество вызов в секунду и организации балансировщика.
12 oleg_km
 
15.10.24
12:33
Я сделал в C# генератор запросов и посмотрел:

using System.Net.Http;
using System.Net.Sockets;
using System.Threading.Tasks;

namespace testHTTP
{
    internal class Program
    {
        static readonly HttpClient cli = new HttpClient();

        static void Main()
        {
            // DoHttp();
            DoTCP();

            Console.WriteLine($"Finished. Press any key...");
            Console.ReadLine();
        }

        static void DoHttp()
        {
            //const string url = @"http://srv-3:8082/OperSys/hs/sys/test";
            const string url = @"http://esb241.agp.local:8082/DevOperOKM/hs/sys/test
            const int cntReq = 50;

            List<Task<string>> tasks = new List<Task<string>>();

            for (int i = 0; i < cntReq; i++)
            {
                Task<string> res = cli.GetStringAsync(url);
                Console.WriteLine($"{i}: {res.Id}: {DateTime.Now}");
                tasks.Add(res);
            }

            int ii = 0;
            while (tasks.Count > 0)
            {
                Task<string>[] tasks1 = tasks.ToArray();
                int id = Task.WaitAny(tasks1);
                Task<string> res = tasks1[id];

                Console.WriteLine($"{ii}: {id}: {res.Id}: {res.Result}");
                tasks.Remove(res);

                ii++;
            }
        }

        static void DoTCP()
        {
            const int cntReq = 50;

            TcpClient[] clis = new TcpClient[cntReq];
            for (int i = 0; i < cntReq; i++)
            {
                Console.WriteLine($"Socket {i} : {cntReq - 1}");
                clis[i] = new TcpClient();
                clis[i].ConnectAsync("localhost", 9106);
            }
            Console.WriteLine($"Wait. Press any key...");
            Console.ReadLine();
        }
    }
}
13 andryscha1c
 
15.10.24
12:39
(12) сколько было одновременных запросов? по итогу упал веб сервис? Как правильно организовать балансировщик?
14 arsik
 
15.10.24
12:54
(13) так от оборудования же зависит.
Делаешь свой тест и увидишь. Может не балансировщик делать, а через nginx проксировать. При чрезмерных нагрузках отфутболивать прямо там, с ошибкой "попробуйте зайти позже"
15 timurhv
 
15.10.24
16:39
(11) Ответ от 1С сразу нужен?

Если нет, можно организовать через брокеров сообщений.

Либо на стороне 1С писать сообщения в регистр сведений (измерение УникальныйИдентификатор, реквизит ХранилищеЗначений) и потом уже в 1 поток запросом их выбирать и обрабатывать по бизнес-логике.
16 novichok79
 
15.10.24
16:46
берешь k6, делаешь скрипт и пуляешь в свой 1С, смотришь как оно умирает или наоборот справляется.
17 palsergeich
 
15.10.24
16:56
(0) Зависит от оборудования, у меня и 100 в секунду в течение часа нна быстром ответе жило, да время ответа несколько увеличивается со временем, но отвалов единицы.
Будет плохой код - может и 10 в сек не потянуть
18 Web00001
 
15.10.24
17:05
19 andryscha1c
 
15.10.24
22:07
А кто нибудь использовал oData?пишут что это самый быстрый обмен, с другой стороны читал что если будут отборы и большой объем данных он станет медленее. Есть кто использовал на практике или какие либо официальные источники?
20 novichok79
 
17.10.24
11:37
(19) я использовал на практике, это майкрософтовский стандарт.
в любом обмене, если будут отборы или большой объем данных он станет медленее ))))))
ваши проблемы решит нагрузочное тестирование на сценариях приближенных к реальным.
а то мы тут рассуждаем о сферическом коне в вакууме.
я вам уже скинул k6, но вы проигнорили ответ.
в этом k6 плюс в том, что вы можете написать какой угодно тест с какими угодно данными.
так вот пишете скрипт на js, запускаете с разными показателями нагрузок, приближенными к реальным (например 1000 запросов в секунду), после тестов k6 в консоли пишет сколько заходов было, среднее время ответа и т д по вашим конечным точкам API.
подобные задачи (не в 1С правда) я решал именно так.
21 novichok79
 
17.10.24
11:39
еще кстати k6 экспортит данные о нагрузочном тесте в prometheus, так шо можно в графане красивые графики рисовать еще.
хотя для вашей задачи достаточно будет просто позапускать тест вашего API с разными показателями нагрузки и решить - оно норм или не норм.