Как уменьшить пинг ответа с сервера

233
23 мая 2018, 18:50

Есть ссылка для получения данных через API, https://api.binance.com/api/v1/depth?symbol=BTCUSDT она работает с ограничением. можно получать не более 1 раза в секунду запрос. (1 поток!) Это не ограничение, а большой пинг, т.к. сайт работает через сервера Amazon CloudFront. Типа Cloudflare. И вся информация идет через него. Из-за этого, как я понял, получается большая цепочка: Запрос поступает от пользователя на

api.binance.com > Amazon CloudFront > Основной сервер отдает ответ > Amazon CloudFront > api.binance.com > пользователь.

Как можно обойти защиту Amazon CloudFront, найти прямые адреса? Или сократить цепочку, уменьшить пинг ответа сервера. К примеру так:

Пользователь > Amazon CloudFront > Основной сервер отдает ответ > Amazon CloudFront > Пользователь.

Либо вообще выйти как-то на прямой сервер и уже от него получать ответ. без Amazon CloudFront. Есть какие-то варианты?

Знаю что люди обходят эту защиту и добиваются пинга [0.050 сек] примерно 20 ответов в секунду. [1 поток]

Пишу на C#, с сервером работаю так:

string userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0";
string url = "https://api.binance.com/api/v1/depth?symbol=BTCUSDT";
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 | System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);
request.Method = "GET";
request.UserAgent = userAgent;
request.Headers.Add("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
System.Net.HttpWebResponse response = (System.Net.HttpWebResponse) request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string resultGet = reader.ReadToEnd();
response.Close();
reader.Close();
return resultGet;

Используя потоки, получился такой код. Но с ним задержка становиться только больше. Тут я паралельно запускаю

    static List<float> list = new List<float> { };
    static List<Thread> threads = new List<Thread>();   // Список потоков
    static int threadCount = 50;                        // Число потоков
    static ManualResetEvent startEvent = new ManualResetEvent(false);   // Событие для старта рабочих потоков
    static volatile int starterCount = 0;               // Счётчик запущенных потоков. volatile показывает, что переменная будет изменяться в различных потоках и её не надо оптимизировать
    static object LockObject = new object();            // Блокировка для изменения переменной starterCount
    static int count = 0;
    static void Main(string[] args)
    {
        // Создаём пул потоков
        for (int i = 0; i < threadCount; i++)
        {
            Thread thread = new Thread(Work);
            threads.Add(thread);
        }
        // На старт — запускаем стартовые потоки и ждём их запуска
        foreach (var thread in threads)
            new Thread(Starting).Start(thread);
        while (starterCount < threadCount) Thread.Sleep(1);
        // Внимание — к этому моменту все стартовые потоки запустились и ожидают на WaitOne()
        Thread.Sleep(100);
        // Марш — установка события отпускает приостановленные потоки
        startEvent.Set();
        Console.Read();
        float sum = 0;
        foreach(var i in list)
        {
            sum += i;
        }
        float srznach = sum / 50f;
    }
    static void Work()
    {
        System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
        st.Start();
        string userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0";
        string url = "https://api.binance.com/api/v1/depth?symbol=BTCUSDT";
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 | System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
        System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
        request.Method = "GET";
        request.UserAgent = userAgent;
        request.Headers.Add("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
        System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
        string resultGet = reader.ReadToEnd();
        response.Close();
        reader.Close();
        st.Stop();
        float s = st.ElapsedMilliseconds / 1000f;
        list.Add(s);
        count++;
        Console.WriteLine(s.ToString()+" "+ count.ToString());
    }

    static void Starting(object paramThread)
    {
        lock (LockObject)
        {
            starterCount++;
        }
        startEvent.WaitOne();
        (paramThread as Thread).Start();
    }

При запуске каждого нового потока, ping только увеличивается:

сек  |   номер потока
1,237 1
1,784 2
2,062 3
2,586 4
2,975 5
3,394 6
3,674 7
3,593 8
3,94 9
4,236 10
4,514 11
4,38 12
4,776 13
4,844 14
5,066 15
5,112 16
5,342 17
5,615 18
5,923 19
5,995 20
6,196 21
6,267 22
6,465 23
6,554 24
6,745 25
6,808 26
7,097 27
7,358 28
7,553 29
7,645 30
7,812 31
7,932 32
8,204 33
8,206 34
8,461 35
8,473 36
8,736 37
8,746 38
9,009 39
9,096 40
9,301 41
9,382 42
9,582 43
9,862 44
10,123 45
10,398 46
10,674 47
11,471 48
11,856 49
12,141 50
Answer 1

Конкретно пинг зависит:

  • От интернет провайдера
  • От того, на сколько удален сервер к которому подключаемся
  • От загруженности вашего интернет канала

Сами вы вряд-ли, что-то сможете предпринять, ибо от вас это, ну никак не зависит.
Как вариант расположить свой сервер поблизости к сервису, к которому собираемся подключаться или попробовать изменить провайдера и скорость интернета.

READ ALSO
Программно изменить значение выбранной строки dataGridView

Программно изменить значение выбранной строки dataGridView

Есть две формыВ первой находится dataGridView, во второй в textBox передаются значения ячеек выбранной строки, который затем изменяет пользователь

171
Проблема с установкой пакетов Xamarin

Проблема с установкой пакетов Xamarin

Скачал с гита проект на xamarin, попытался собрать получил ошибку :

169