#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.