2011-05-24 50 views
5

preguntando si alguno de ustedes se ha encontrado con esto. Estoy jugando con la API de correo de Python en Google App Engine y creé una aplicación que acepta un cuerpo y dirección de mensaje a través de POST, crea una entidad en el almacén de datos, luego se ejecuta un trabajo cron cada minuto, capta 200 entidades y envía los correos electrónicos, luego elimina las entidades.Google App Engine Locking

Ejecuté un experimento con 1500 correos electrónicos, tenía 1500 entidades creadas en el almacén de datos y se enviaron 1500 correos electrónicos. Luego miro mis estadísticas y veo que aprox. 45,000 destinatarios fueron utilizados de la cuota, ¿cómo es posible?

Así que mi pregunta es en qué punto realmente cuenta la cuota de "destinatarios por correo electrónico"? En el punto donde creo un objeto de correo o cuando realmente send() es? Esperaba el segundo, pero las cuotas parecen mostrar algo diferente. Paso el objeto de correo entre crons y tareas, etc. ¿Alguien tiene información sobre esto?

Gracias.

actualización: Resulta que yo en realidad estaba enviando mensajes de correo electrónico 45k con una cola de sólo el 1500. Parece que una tarea de cron se ejecuta hasta que el anterior está terminado y se resuelve con las mismas entidades. Entonces, la pregunta cambia a "¿cómo bloqueo las entidades y me aseguro de que nadie las seleccione antes de enviar los correos electrónicos"?

¡Gracias nuevamente!

+1

¿Cómo verificó que se enviaron 1500 correos electrónicos? ¿Estás seguro de que las 200 entidades fueron enviadas y eliminadas antes del siguiente trabajo? –

+0

@Grzegorz buena pregunta, se enterará. – kovshenin

Respuesta

2

La creación de instancias de un objeto de correo electrónico ciertamente no cuenta en contra de su cuota de "destinatarios por correo electrónico". Al igual que otros servicios de App Engine, consume una cuota cuando activa un RPC, es decir, llame al send().

Si tenía la intención de enviar por correo electrónico 1500 destinatarios y App Engine dice que envió 45,000 por correo electrónico, su código tiene un error.

+0

Pensé en eso, voy a hacer algunos experimentos hoy para ver lo que estoy haciendo mal, con suerte no alcanzará la barrera libre de 2000;) – kovshenin

+0

Enviado una actualización, gracias por su respuesta, la pregunta ha cambiado;) – kovshenin

3

Use tareas para enviar el correo electrónico.

Crea una tarea que toma una tecla como argumento, recupera la entidad almacenada para esa clave y luego envía el correo electrónico.

Cuando su controlador recibe el cuerpo y la dirección, almacénelo como lo hace ahora pero luego encuestre una tarea para enviar y pasar la clave del objeto del almacén de datos a la tarea para saber para qué objeto enviar un correo electrónico.

Puede encontrar que el cuerpo y la dirección son lo suficientemente pequeños como para pasarlos simplemente como argumentos a una tarea y hacer que la tarea envíe el correo electrónico sin tener que almacenar nada directamente en el almacén de datos.

Esto también tiene la ventaja de que si desea imponer un límite en el número de correos electrónicos enviados dentro de un período de tiempo determinado (cuota) puede configurar una cola de tareas con esa tasa.

+0

Sí , ese es el camino a seguir. Puede agregar algún campo de estado a su modelo en el almacén de datos para establecer si el correo electrónico se ha puesto en cola, de modo que no está haciendo cola en los mismos correos electrónicos cada vez que la tarea cron comprueba si hay nuevos correos electrónicos para enviar. –