2014-06-17 88 views
1

假设您拥有数百万个Android GCM设备密钥,并且您希望通过管理脚本发送这些密钥。该脚本将花费大量时间来完成,因为它将数据库中的键作为队列处理。在多个工作人员上分发推送通知

问题:你如何更快地实现这个?你如何并行发送这些通知?你如何获得接近实时的推送通知?

一种解决方案是实例化X个芹菜工作者,每个工人负责一个从MySQL开始获取的偏移量Y. 例子:

Worker 1: starts at offset 0, 
Worker 2: starts at offset 10,000, 
Worker 3: starts at offset 20,000, 
Worker 4: starts at offset 30,000, 
Worker 5: starts at offset 40,000, 

Worker 1: Restarts at offset 50,000, 
Worker 2: Restarts at offset 60,000, 

...等

这是一个可行的解决方案?

回答

0

将任务列表创建为Celery group。也因为你要检索Android机型中的所有记录它的好,创建单独的芹菜任务,它做它在后台:

@shared_task 
def push_notification(offset, limit): 
    for android in Android.objects.all()[offset:offset+limit]: 
     pass 

@shared_task 
def push_notification_to_all(): 
    count = Android.objects.all().count() 
    limit = 100 
    group(push_notification.s(offset, limit) for offset in range(0, count, limit)() 

push_notification_to_all.delay() 

而且不是发送

+0

这是否规模有多大?我认为循环访问数百万条记录并创建数百万个待处理任务会加载服务器,你不觉得吗? – user3470707

+0

如果你正在使用RabbitMQ,你应该没问题。然而,如果你害怕一次发送太多的消息,你可以分小批量分割'push_notification_all()'。 – daniula

+0

我修改了代码以呈现不同的方法。您可以发送偏移量和限制值,并循环访问直接从数据库中检索的对象,而不是将数千个密钥从一个任务发送到另一个任务。如果消息数量增长到较高,您可以将限制值调整为较高的值。 – daniula