如何确定我的后台任务将在生产环境中进行多少次第 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 次调用才能更新所有信息。我将分解通话:

假设我每分钟拨打所有 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 调用。