Как мне определить, сколько сторонних вызовов веб-api моя фоновая задача выполнит в рабочей среде?

#c# #api #rest #asp.net-core #signalr

#c# #API #отдых #asp.net-core #signalr

Вопрос:

Мой ASP.NET Основное веб-приложение MVC запускает фоновую задачу, которая запрашивает данные крипторынка из Api CoinGecko с заданным интервалом. Я использую SignalR для создания открытого соединения между клиентом и сервером, чтобы отображаемые данные всегда были актуальными без необходимости запроса клиента вручную с сервера.

У CoinGecko есть ограничение скорости 50 вызовов в минуту. Я хочу отобразить данные для 4 конкретных монет. Основываясь на данных, которые я хочу отобразить, я оцениваю, что мне нужно будет сделать 25 вызовов, чтобы обновить всю информацию. Я разберу вызовы:

  • 1 вызовите /coin/markets, чтобы получить такие данные, как рыночная капитализация, оборотное предложение и т. Д. для всех 4 монет
  • 24 вызова /coins/{id}/market_chart для получения графиков цен за 1 час, 1 день, 7 дней, 30 дней, 90 дней и 1 год для всех 4 монет (4 монеты x 6 временных интервалов)

Предполагая, что я совершаю все 25 вызовов каждую минуту, чтобы обновлять свои данные, повлияет ли количество клиентов на количество вызовов API, которые я делаю? Я предполагаю, что этого не произойдет, потому что данные запрашиваются в серверной части, а затем передаются всем клиентам через концентратор SignalR.

CryptoHttpListener.cs (фоновая задача):

 protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                HttpResponseMessage response = client.GetAsync(client.BaseAddress   "/simple/price?ids=bitcoin,ethereum,cardano,shiba-inuamp;vs_currencies=usd").Resu<
                if (response.IsSuccessStatusCode)
                {
                    string data = response.Content.ReadAsStringAsync().Resu<
                    _logger.LogInformation("{data}", data);
                    cryptoData = JsonConvert.DeserializeObject<CryptoDataModel>(data);
                    await SendMessage(cryptoData);
                }
                else
                {
                    _logger.LogError("API call failed");
                }
                await Task.Delay(10*1000, stoppingToken);
            }
        }

        public async Task SendMessage(CryptoDataModel cryptoData)
        {
            decimal Bitcoin = cryptoData.Bitcoin.Usd;
            decimal Ethereum = cryptoData.Ethereum.Usd;
            decimal Cardano = cryptoData.Cardano.Usd;
            decimal ShibaInu = cryptoData.ShibaInu.Usd;
            await _hubContext.Clients.All.CryptoPriceUpdated(Bitcoin, Ethereum, Cardano, ShibaInu);
        }
 

SignalR Hub:

 public class CryptoPriceHub : Hub<ICryptoPriceClient>
    {

    }

public interface ICryptoPriceClient
    {
        Task CryptoPriceUpdated(decimal Bitcoin, decimal Ethereum, decimal Cardano, decimal ShibaInu);
    }
 

Index.cshtml

 <p id="bitcoin">placeholder text</p>
<p id="ethereum">placeholder text</p>
<p id="cardano">placeholder text</p>
<p id="shibainu">placeholder text</p>

@section Scripts {
    <script src="~/lib/aspnet/signalr/dist/browser/signalr.min.js"></script>
    <script type="text/javascript">
        var connection = new signalR.HubConnectionBuilder().withUrl("/hub").build();
        connection.on("CryptoPriceUpdated", function (Bitcoin, Ethereum, Cardano, ShibaInu) {
            //Update the DOM
            console.log(Bitcoin   ' '   Ethereum   ' '   Cardano   ' '   ShibaInu);
            document.getElementById("bitcoin").innerText = Bitcoin;
            document.getElementById("ethereum").innerText = Ethereum;
            document.getElementById("cardano").innerText = Cardano;
            document.getElementById("shibainu").innerText = ShibaInu;
        });
        connection.start();

    </script>
}
 

Ответ №1:

tldr; Вам нужно убедиться, что ваш внутренний сервер правильно кэширует вызовы API.

Если результаты API кэшируются на сервере, а кэшированные результаты используются для общедоступных запросов, тогда только вызовы API в фоновом режиме будут учитываться при ограничении скорости.

Однако, если каждый общедоступный запрос вызывает вызов API, то после 2 запросов вы достигнете ограничения скорости 50 / мин.

Подводя итог: убедитесь, что ваш сервер правильно кэширует вызовы API.

Комментарии:

1. Я опубликовал свой текущий код выше для большего контекста. Я сохраняю свой ответ в переменной, десериализую его и сохраняю каждую цену монеты в переменной, прежде чем отправлять ее клиентам через _hubContext.Clients.All.CryptoPriceUpdated(Bitcoin, Ethereum, Cardano, ShibaInu) . Поскольку я сохраняю свой первоначальный ответ http в переменной, нужно ли по-прежнему кэшировать данные?

2. Конечно, похоже, что значения возвращаются из переменных. Но это зависит от того, как хранятся эти переменные. Я бы рекомендовал вам просто использовать имеющийся у вас код и несколько раз нажимать на /hub конечную точку и проверять ограничение скорости API.