Python 此任务队列设置有什么问题?
我已经在我为客户托管的站点上设置了此任务队列实现,它有一个Python 此任务队列设置有什么问题?,python,google-app-engine,Python,Google App Engine,我已经在我为客户托管的站点上设置了此任务队列实现,它有一个cron作业,每天凌晨2点运行“/admin/tasks/queue”,它将要发送的电子邮件排队,“/admin/tasks/email”,并使用游标,以便进行小批量排队。由于某种原因,昨晚/admin/tasks/queue一直被这个代码运行,所以发送了我的全部电子邮件配额:/。我对这个代码做了什么错误吗 class QueueUpEmail(webapp.RequestHandler): def post(self):
cron作业
,每天凌晨2点运行“/admin/tasks/queue
”,它将要发送的电子邮件排队,“/admin/tasks/email
”,并使用游标
,以便进行小批量排队。由于某种原因,昨晚/admin/tasks/queue
一直被这个代码运行,所以发送了我的全部电子邮件配额:/
。我对这个代码做了什么错误吗
class QueueUpEmail(webapp.RequestHandler):
def post(self):
subscribers = Subscriber.all()
subscribers.filter("verified =", True)
last_cursor = memcache.get('daily_email_cursor')
if last_cursor:
subscribers.with_cursor(last_cursor)
subs = subscribers.fetch(10)
logging.debug("POST - subs count = %i" % len(subs))
if len(subs) < 10:
logging.debug("POST - Less than 10 subscribers in subs")
# Subscribers left is less than 10, don't reschedule the task
for sub in subs:
task = taskqueue.Task(url='/admin/tasks/email', params={'email': sub.emailaddress, 'day': sub.day_no})
task.add("email")
memcache.delete('daily_email_cursor')
else:
logging.debug("POST - Greater than 10 subscibers left in subs - reschedule")
# Subscribers is 10 or greater, reschedule
for sub in subs:
task = taskqueue.Task(url='/admin/tasks/email', params={'email': sub.emailaddress, 'day': sub.day_no})
task.add("email")
cursor = subscribers.cursor()
memcache.set('daily_email_cursor', cursor)
task = taskqueue.Task(url="/admin/tasks/queue", params={})
task.add("queueup")
class QueueUpEmail(webapp.RequestHandler):
def post(自我):
subscribers=Subscriber.all()
subscribers.filter(“verified=,True)
last\u cursor=memcache.get('daily\u email\u cursor')
如果最后一个光标:
订阅服务器。带\u光标(最后一个\u光标)
subs=subscribers.fetch(10)
debug(“POST-subs count=%i”%len(subs))
如果len(subs)<10:
调试(“POST-SUB中少于10个订户”)
#剩余订户少于10个,请不要重新安排任务
对于sub中的sub:
task=taskqueue.task(url='/admin/tasks/email',params={'email':sub.emailaddress,'day':sub.day_no})
任务。添加(“电子邮件”)
memcache.delete('daily\u email\u cursor')
其他:
调试(“POST-子系统中剩余的子系统数量超过10个-重新调度”)
#订阅服务器为10或更大,请重新安排
对于sub中的sub:
task=taskqueue.task(url='/admin/tasks/email',params={'email':sub.emailaddress,'day':sub.day_no})
任务。添加(“电子邮件”)
cursor=subscribers.cursor()
memcache.set('daily\u email\u cursor',cursor)
task=taskqueue.task(url=“/admin/tasks/queue”,params={})
任务。添加(“排队”)
我可以看到一些潜在的问题。首先,您将光标存储在memcache中,而memcache不能保证保存任何内容。如果在处理过程中出现缓存丢失,您将再次发送每条消息
其次,如果任务因任何原因失败,它们将被重新尝试;因为这个原因,它们应该被设计成幂等的。当然,在发送电子邮件的情况下,这几乎是不可能的,因为一旦发送了一条消息,如果您的任务在发送后由于其他原因死亡,它就无法回滚。至少,我建议在发送消息后,尝试更新每个订户实体上的“上次电子邮件发送日期”字段。当然,这本身并不是万无一失的,因为电子邮件发送可能会成功,实体更新可能会失败。这也会增加整个过程的开销,因为您将为每个订户进行写操作。感谢您的分析,我最初的想法是memcache可能是一个问题。memcache可能是您遇到问题的直接原因,是的。最好的方法是将光标作为参数从每个任务传递到下一个任务。