【问题标题】:Sending emails through Amazon SES with Azure Functions使用 Azure Functions 通过 Amazon SES 发送电子邮件
【发布时间】:2017-06-05 16:27:25
【问题描述】:

问题:

因此,我们正在为我们的应用构建一个通讯系统,该系统必须能够每天发送 20k-40k 封电子邮件。

首选工具:

  1. Amazon SES - 用于定价和可扩展性
  2. Azure Functions - 用于无服务器计算以发送电子邮件

亚马逊 SES 的限制:

  1. Amazon SES 限制具有最大发送速率 - Amazon SES 通过施加最大发送速率来限制通过其服务进行的发送。目前,在沙盒 SES 环境之外,我们的容量为 14 封电子邮件/秒,每日电子邮件上限为 50K。但可以通过支持票提高此限制。

Azure 函数的限制:

  1. 在消耗计划中,无法限制 Azure Function 实例执行的数量。目前,缩放由 Azure 内部处理,因此该函数可以在几个到数百个实例之间执行。

  2. 通过阅读有关 Azure Functions 的其他帖子,Azure Functions 似乎存在“预热”期,这意味着一旦通过记录的触发器之一触发该函数,该函数可能不会立即执行。

Azure Functions 与 SES 的限制:

  1. 明显的问题是 Amazon SES 限制从 Azure 函数发送电子邮件,因为发送电子邮件的 Azure 函数的扩展执行将远高于 SES 允许的发送速率。

  2. 由于 Azure Function 消息的“预热”期,最终可能会在 Azure Function 真正开始大规模处理它们并发送电子邮件之前堆积在队列中,因此很有可能发生达到发送/速率限制。

问题:

  1. 我们如何利用通过 Azure Functions 发送电子邮件,同时仍处于 SES 的 X 电子邮件/秒限制之下?有没有办法限制 Azure 函数在每个时间范围内可以执行的次数?就像假设我们不希望每秒运行超过 30 个 Azure Function 实例?

其他想法:

  1. 如果客户的实施不断达到限制限制,Amazon SES 可能不喜欢为客户连续限制 SES。亚马逊 SES 的人,你能评论一下吗?

  2. Azure Functions - 根据文档,Azure Functions 在消耗计划上的缩放是在内部处理的。但是没有办法在缩放上设置手动“上限”吗?从客户的角度来看,这似乎是一个普遍的要求。 问题不在于 Azure Functions 无法处理负载,问题在于与 Azure Functions 接口的系统的其他组件无法处理 Azure Functions 可以处理的大规模负载。

感谢您的帮助。

【问题讨论】:

  • 它真的将是一个自定义系统,并与我们的 CMS 紧密集成。所以我们不想依赖外部组件。 “数十亿封电子邮件”听起来很吸引人……亚马逊 SES 又会扼杀你。我们也是 .NET / Azure 商店,希望仅通过 .NET API 与其他云提供商合作。不过感谢您的建议。

标签: azure azure-functions amazon-ses


【解决方案1】:

如果我正确理解您的问题,最简单的方法是自定义队列限制解决方案。

基本上,您的 AF 只需检索所有邮件请求的调用,然后将它们排队到队列系统(例如 ServiceBus / EventHub / IoTHub),然后您可以拥有另一个按 x 分钟间隔运行的 Azure 函数,这将拉最多 y 条消息并将其推送到 SES。您的控制点变成了时钟功能,并且由于队列系统将帮助您确保您知道您的消息传递状态(已发送到 SES)并且您可以在完成后弹出队列,它可以让您确保最终完成任务已处理。

【讨论】:

  • 这是个好建议。我们已经考虑过这样做。实际上有一种方法可以将消息排入队列,并让它们在特定时间出现在队列中。所以这就是我们可能会采用的方法。仍然不是一个完美的解决方案,因为不时会出现限制异常......但是使用队列,我们​​可以通过不将该消息标记为已处理并让它回来来重试。我投票赞成你的建议..谢谢你的时间:) 希望亚马逊和 Azure 的人可以发表评论..我很惊讶还没有人发表评论。
【解决方案2】:

您应该能够在函数的 host.json 文件中将 maxConcurrentCalls 设置为 1;这将确保在任何给定时间仅发生 1 个函数执行,并且应该将您的处理速率限制在从 AWS 的角度来看每秒发送数更合适的水平:

host.json

{
    // The unique ID for this job host. Can be a lower case GUID
    // with dashes removed. When running in Azure Functions, the id can be omitted, and one gets generated automatically.
    "id": "9f4ea53c5136457d883d685e57164f08",
    // Configuration settings for 'serviceBus' triggers. (Optional)
    "serviceBus": {
      // The maximum number of concurrent calls to the callback the message
      // pump should initiate. The default is 16.
      "maxConcurrentCalls": 1,
      ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多