【问题标题】:Distributing push notifications on multiple workers在多个工作人员上分发推送通知
【发布时间】:2014-08-08 01:45:59
【问题描述】:

假设您有数百万个 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,

...等

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

【问题讨论】:

    标签: mysql django celery django-celery


    【解决方案1】:

    将任务列表创建为Celery group。另外,因为您必须从 Android 模型中检索所有记录,所以最好创建单独的 celery 任务,该任务将在后台执行:

    @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()
    

    也代替发送

    【讨论】:

    • 这个规模吗?我认为遍历数百万条记录并创建数百万个待处理任务会加载服务器,你不觉得吗?
    • 如果你使用的是 RabbitMQ,你应该没问题。但是,如果您害怕一次发送太多消息,您可以将push_notification_all() 拆分成更小的批次。
    • 我已经修改了代码以呈现不同的方法。您可以发送偏移量和限制值并循环遍历直接从数据库检索的对象,而不是从一个任务发送数千个键到另一个任务。如果消息数量将增长到很高,您可以将限制值调整为更高的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多