任务队列并发期间的变量值不一致

时间:2014-04-10 03:57:21

标签: google-app-engine task-queue amazon-ses

我正在使用拉取队列和推送队列来管理我调用Amazon SES发送电子邮件的速率。我注意到,在10个收件人的样本列表中,一些收件人将收到重复的电子邮件,而其他收件人收到0.电子邮件总数仍然相当于10封电子邮件。

这是我目前的设置。

  1. 上传收件人的csv。每行包含收件人电子邮件地址以及他们收到的电子邮件广告系列模板Web处理程序读取csv并将每行添加为拉取队列中的任务。
  2. 工作人员从拉动中租用10个任务,并将每个任务添加到推送队列中。
  3. 推送队列工作人员获取包含收件人电子邮件地址和电子邮件模板广告系列名称的参数。广告系列名称决定了电子邮件的主题行。该数据在ses.py中映射到CAMPAIGNS字典中。它通过查找与广告系列名称对应的键来查找广告系列的主题行。主题行以及收件人地址和活动被放入“数据”字典中,该字典被传递到通过SES发送电子邮件的帮助函数中。推送队列配置的速率为10 / s,桶大小为10,max_concurrent_requests为10,task_retry_limit为0.这是为了限制它,使其在我的SES发送速率限制内,每秒10封电子邮件。
  4. 以下是发送电子邮件工作人员的代码。我记录了“data”变量在传递到send_announce_email函数之前的含义。

    import ses
    
    class SendEmailWorker(webapp2.RequestHandler):
      def post(self):
        payload = json.loads(self.request.get('data'))
        # The value of payload is {'email': 'bob@gmail.com', 'campaign': 'version_a'}
        CAMPAIGNS = ses.CAMPAIGNS
        data = CAMPAIGNS[payload['campaign']]
        data['campaign'] = payload['campaign']
        data['email'] = payload['email']
    
        logging.info('Data before ses function: %s' % data)
        ses.send_announce_email(data)
    

    这是ses.py中ses.send_announce_email的代码。我做的第一件事就是记录“数据”是什么。

    CAMPAIGNS = {'version_a': {'subject': 'Email subject line 1'},
                 'version_b': {'subject': 'Email subject line 2'},
                 'version_c': {'subject': 'Email subject line 3'}}
    
    
    def send_announce_email(data):
      logging.info('Data during ses function: %s' % data)
    
      text_template = render_template('emails/announce_2.txt', data=data)
      html_template = render_template('emails/announce_2.html', data=data)
    
      send_email(
        sender='Hello <hello@example.com>',
        subject=data['subject'],
        body=html_template,
        to_addresses=data['email'],
        format='html',
        reply_addresses='hello@example.com',
        text_body=text_template)
    

    令我难以理解的是,在将数据传递给发送功能之前和发送功能的开头之前,我记录了什么是“数据”。它们通常是平等的,但大约20%的时间,它们是不同的!

    当我将max_concurrent_requests设置为1时,我没有看到这种情况发生。由于并发,变量值是否会混淆?

    此外,在send_announce_email函数中记录的电子邮件地址与Amazon SES实际发送到的电子邮件地址不匹配。某些收件人可能会收到重复的电子邮件。我正在使用boto ses库。

0 个答案:

没有答案