使用Azure功能通过Amazon SES发送电子邮件

时间:2017-01-20 16:03:38

标签: azure azure-functions amazon-ses

问题:

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

偏好工具:

  1. Amazon SES - 定价和可扩展性
  2. Azure功能 - 用于无服务器计算以发送电子邮件
  3. 亚马逊SES的限制:

    1. 亚马逊SES限制具有最大发送速率 - 亚马逊SES通过强加最大发送速率限制通过其服务发送。现在,在沙盒SES环境之外,我们的容量是14封电子邮件/秒,每天50K电子邮件上限。但是这个限制可以通过支持票来增加。
    2. Azure功能的限制:

      1. 在消费计划中,无法限制Azure功能执行的实例数量。目前,扩展由Azure内部处理,因此该功能可以在几个到几百个实例之间执行。

      2. 通过阅读Azure功能的其他帖子,Azure功能似乎有“预热”期,这意味着只要通过其中一个记录的触发器触发该功能,该功能就不会立即执行。

      3. 使用SES的Azure功能限制:

        1. 显而易见的问题是Amazon SES限制从Azure功能发送电子邮件,因为发送电子邮件的Azure功能的缩放执行将远远高于SES允许的发送速率。

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

        3. 问题:

          1. 我们如何利用Azure功能发送电子邮件,同时仍然处于SES的X电子邮件/第二限制之下?有没有办法限制Azure功能每个时间帧可以执行多少次?那么就像我们说的那样,我们不希望每秒运行超过30个Azure功能实例?
          2. 其他想法:

            1. 如果客户的实施不断达到限制限制,亚马逊SES可能不希望为客户持续限制SES。亚马逊SES人员,您能评论一下吗?

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

            3. 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您应该能够在函数的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,
      ...