【问题标题】:Delaying API calls between multiple parallel processes延迟多个并行进程之间的 API 调用
【发布时间】:2019-10-23 11:59:08
【问题描述】:

我正在向 C# Web 应用程序添加 SMS 通知。简而言之,用户登录界面、键入消息、选择收件人并保存。我正在使用 Hangfire 来启动后台作业 - 这些作业处理实际的建筑,然后通过提供商(当前为 Nexmo)发送 SMS 消息。

Nexmo 以及大多数其他 SMS 提供商对其 API 设置了限制,这将出站消息排队的能力限制为 X/秒,该速率根据您的帐户级别而有所不同。出于测试目的,我限制为 1/秒。

目前,当我的后台进程开始时,我正在跟踪 API 调用之间经过的时间量,如果小于 1 秒,我将线程置于休眠状态剩余的时间量。这似乎工作得很好,然而我遇到的问题是多个并行后台进程可能同时运行,例如当两个用户触发 SMS 出站消息发出时同时。还有另一项复杂性,如果您使用 2 个出站号码,您的 API 限制实际上会加倍(1 条消息/秒,来自 每个 使用的号码)。我目前忽略了这一点,只是在所有 API 调用之间进行延迟。

我正在寻找有关如何规避此问题的任何建议。我的一个想法是将消息处理与后台作业完全分离——hangfire作业只是构建消息并将它们标记为排队等待发送,以及一个单独的单线程应用程序,它基本上充当观察者并发送消息FIFO .

任何建议将不胜感激!

【问题讨论】:

    标签: c# api function-call nexmo


    【解决方案1】:

    根据您使用的国家/地区和号码类型,API 请求的限制会有所不同。通常限制为每个密钥每秒 30 个 API 请求 - 但受地区限制,请参阅:

    https://help.nexmo.com/hc/en-us/articles/203993598-What-is-the-Throughput-Limit-for-Outbound-SMS-

    https://help.nexmo.com/hc/en-us/sections/200622473-Country-Specific-Features-and-Restrictions

    例如,如果您使用的是美国长虚拟号码 (LVN),而不是短代码或免费电话号码,则上限为每秒每 LVN 1 条消息和每天 250 条消息。如果这是您遇到的限制,您可能需要考虑您使用的号码类型,因为美国 LVN 确实不适用于 P2P 短信。

    更新:

    您可以设置配置设置

    "appSettings": {
        "Nexmo.Api.RequestsPerSecond": "30"
      }
    

    到您的 appsettings.json - 这将使配置设置为使用 ThrottlingMessageHandler 的 http 客户端 - 因为任何 Nexmo API 客户端都利用单例配置实例(因此它是 http 客户端),这将有效地阻止您发送超过每秒限制的请求数。

    【讨论】:

    • 感谢您的回复,这些链接是我构建逻辑 v1 的方式。我真正想要的是关于如何在一般意义上处理这种类型的场景的一些建议,无论是 Nexmo、SignalWire、Twilio 等。在这种情况下,我有 N 个工作进程发送可变数量的并发请求,这些请求必须是彼此隔开,可以看到适用于工作人员的油门量。我能想到的只是单线程看门狗式应用程序在队列进入时处理它。
    • @CaryonInferno 修改了我的原始回复 - 您可以设置一个配置设置来限制允许的请求数量。
    • 谢谢!显然我没有足够的信誉来支持你的答案,但我很感激。
    • 嗨@CaryonInferno - 如果你能接受那就太好了,因为它可能会帮助下一个有这个问题的人。谢谢!
    猜你喜欢
    • 2013-03-10
    • 2020-08-17
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多