如何确定我的后台任务将在生产环境中进行多少次第 3 方网络 api 调用?
How do I determine how many 3rd party web api calls my background task will make in production?
我的 ASP.NET 核心 MVC Web 应用程序运行一个后台任务,该任务从 CoinGecko Api on a set interval. I'm using SignalR 请求加密货币市场数据,以在客户端和服务器之间创建一个开放的连接,以便显示的数据始终可用-最新,客户端无需手动向服务器请求。
CoinGecko 的速率限制为 50 calls/minute。我想显示 4 个特定硬币的数据。根据我要显示的数据,我估计我必须进行 25 次调用才能更新所有信息。我将分解通话:
- 1 次调用 /coin/markets 以获取所有 4 个硬币的市值、循环供应等信息
- 24 次调用 /coins/{id}/market_chart 以获取所有 4 个硬币的 1 小时、1 天、7 天、30 天、90 天和 1 年价格图表(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%2Cethereum%2Ccardano%2Cshiba-inu&vs_currencies=usd").Result;
if (response.IsSuccessStatusCode)
{
string data = response.Content.ReadAsStringAsync().Result;
_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 中心:
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>
}
tldr; You need to make sure your backend server is correctly caching
the API calls.
如果API个结果缓存在服务器上,缓存的结果用于public个面向的请求,那么只有API个后台调用才计入速率限制。
但是,如果每个 public 面对的请求都导致一个 API 调用,那么您将在 2 个请求后达到 50/分钟的速率限制。
总结:确保您的服务器正确缓存 API 调用。
我的 ASP.NET 核心 MVC Web 应用程序运行一个后台任务,该任务从 CoinGecko Api on a set interval. I'm using SignalR 请求加密货币市场数据,以在客户端和服务器之间创建一个开放的连接,以便显示的数据始终可用-最新,客户端无需手动向服务器请求。
CoinGecko 的速率限制为 50 calls/minute。我想显示 4 个特定硬币的数据。根据我要显示的数据,我估计我必须进行 25 次调用才能更新所有信息。我将分解通话:
- 1 次调用 /coin/markets 以获取所有 4 个硬币的市值、循环供应等信息
- 24 次调用 /coins/{id}/market_chart 以获取所有 4 个硬币的 1 小时、1 天、7 天、30 天、90 天和 1 年价格图表(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%2Cethereum%2Ccardano%2Cshiba-inu&vs_currencies=usd").Result;
if (response.IsSuccessStatusCode)
{
string data = response.Content.ReadAsStringAsync().Result;
_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 中心:
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>
}
tldr; You need to make sure your backend server is correctly caching the API calls.
如果API个结果缓存在服务器上,缓存的结果用于public个面向的请求,那么只有API个后台调用才计入速率限制。
但是,如果每个 public 面对的请求都导致一个 API 调用,那么您将在 2 个请求后达到 50/分钟的速率限制。
总结:确保您的服务器正确缓存 API 调用。