NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Nextdoor 分布式任务队列系统的演进

  • 2014-08-21
  • 本文字数:1637 字

    阅读完需:约 5 分钟

近日,私密社交网络 Nextdoor 在其官方博客发表了一篇文章,介绍其分布式任务队列系统的演进过程。该系统每天要处理数以百万计的异步任务,包括向数以百万计的邻居发送内容通知、创建搜索索引、以及其它应该从交互式Web 和移动应用程序解耦的耗时的处理过程。它由两部分组成:消息代理(队列)和一组任务工作进程。像其它许多系统一样,他们使用 RabbitMQ 作为消息代理,使用 Celery 作为任务工作进程。在公司规模较小的时候,这些开源项目提供了很大的帮助。但随着用户数的增多,不久前,他们在 Celery 的稳定性方面遇到了问题。即使得到了 Celery 创建者 Ask Solem 本人的支持,但他们仍然会遇到一些问题。最终,他们决定用他们自己开发的项目 Taskworker 替换 Celery。同时,为了减少运维开销,他们用 Amazon SQS 替换了 RabbitMQ。他们的理由是,Amazon SQS 容易理解,具有高可扩展性,而且完全由 Amazon 管理。

文章首先列出了他们在使用 Celery 时面临的三个主要问题:

  1. Celery 工作进程在他们系统的现有规模下不稳定。工作进程经常莫名其妙地宕掉,而且由于其代码库很复杂,很难进行故障排除。
  2. Celery 工作进程无法有效利用系统的计算资源。由于 Celery 不支持优先级队列,所以许多工作进程节点要么未充分利用,要么出现了过载。
  3. Celery 工作进程处理任务的延时经常非常高。

由于上述问题的存在,他们为 Taskworker 设定了三个目标:

  1. 简单:故障排除要简单。
  2. 高效:计算资源的利用要尽可能的高效。
  3. 可扩展:系统应该是完全分布式的,并可横向扩展。

文章接下来详细介绍了 Taskworker 设计及应用到生产环境过程中的一些关键点。

设计决策

基于上述三个目标,他们提出了一种很简单的设计,用 Python 伪代码表示(不包括错误处理和重试逻辑)如下:

复制代码
def run_taskworker():
while True:
queue = select_queue()
tasks = queue.get_tasks()
for task in tasks:
task.run()

在底层,他们会在每个工作进程节点上运行一组 Taskworker 进程,每个进程都运行上面所示的循环。所有进程都是完全独立的。select_queue()函数根据队列的优先级决定从哪个队列获取任务。它既要能优先处理高优先级队列的任务,又要能避免低优先级队列挨饿。

在通过模拟生产负载进行了十多次基准测试后,他们最终选用了一个彩票算法的变体,如下所示:

复制代码
def select_queue():
candidate_queues = get_all_queues()
while not candidate_queues.empty():
queue = run_lottery(candidate_queues)
if queue.empty():
candidate_queues.remove(queue)
else:
return queue
return run_lottery(get_all_queues())

文中还提到,他们要管理十几个或更多不同种类的队列,每个队列包含的任务具有相同的优先级和相似的运行时间。他们在队列层面进行配置设定,包括优先级、SQS 可见性超时以及一次任务处理循环获取的任务数。另外,SQS 在向工作进程发送任务时遵循“至少一次”的语义,这就需要任务必须是幂等的。

应用到生产环境

在这一部分,文章介绍了以下三个方面:

  1. 发布过程:为了保持兼容,SQS 队列和 Taskworker 的版本总是相同。
  2. 能力计划:他们使用 Taskworker 模拟生产负载,以决定在一天中的不同时段如何设置工作进程的能力。
  3. 任务迁移:他们基于每个任务增加了自己开发的开关功能,用于决定是将任务发布到 RabbitMQ 还是 SQS。当开始迁移的时候,他们只需要简单地、一个任务接一个任务地开启开关功能。

结论

截止博文发表时,Taskworker 已经在生产环境中运行了三个多月。他们没有再遇到稳定性问题。在运行相同数量的工作进程节点的情况下, Celery 系统队列中的任务忙时平均延时是 Taskworker 系统的 40 倍。

文章最后指出,Taskworker 还有许多可以改进的地方,而且正在准备开源。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-08-21 08:292461
用户头像

发布了 256 篇内容, 共 81.8 次阅读, 收获喜欢 11 次。

关注

评论

发布
暂无评论
发现更多内容

智能连接,助力教育培训公司实现人事管理信息自动同步

聚道云软件连接器

案例分享

现代应用的定义

NGINX开源社区

弹性 应用开发 应用架构 可扩展性 可移植性

音频修复和增强工具iZotope RX10 破解下载

影影绰绰一往直前

代码检查规则运营需关注的10大指标

华为云开发者联盟

开发 华为云 华为云开发者联盟 华为云CodeArts

低代码开发平台的实践应用:加速软件开发的利器

EquatorCoco

软件开发 低代码 数字化转型 低代码开发

TDD、BDD、ATDD都是什么、有什么区别?(下)

禅道项目管理

TDD 自动化测试 BDD ATDD

OmniReader Pro for mac(专业的电子书阅读器)v2.6.7激活版

影影绰绰一往直前

Axure RP 9 for mac授权密钥激活版下载

影影绰绰一往直前

Redis桌面管理工具-Redis Desktop Manager for mac中文版

影影绰绰一往直前

旅游宣传二维码系统:扫码查看景点介绍、报名旅游活动

草料二维码

二维码 草料二维码

光学专家:非成像光学创新技术,儿童近视防控新护航

电子信息发烧客

专访 | STIF2023第四届国际科创节访第七在线CEO赵嘉程

第七在线

天谋科技工业物联网时序数据库 IoTDB 获 IT168 2023 技术卓越奖年度创新产品|技术&商品化双向认可

Apache IoTDB

IntelliJ IDEA 2023.3.2 for Mac破解版下载

影影绰绰一往直前

Beyond Compare 4 for Mac v4.4.7(28397)中文版下载

影影绰绰一往直前

Weather Widget free for mac(时尚桌面天气预报工具) 5.1.0永久激活版

mac

苹果mac Windows软件 Weather Widget free

通过聚道云软件连接器实现农民工信息管理系统与郑州银行网银系统的完美对接

聚道云软件连接器

案例分享

2023 Gartner 云数据库魔力象限发布 PingCAP 入选“荣誉提及”

编程猫

Premiere Pro 2023 for mac(pr)v23.6中文激活版

影影绰绰一往直前

揭秘计算机内部通信:探秘数据、地址与控制信号的奥秘

快乐非自愿限量之名

通信 计算机 计算机系统

dubbo线程池打满问题解决-服务重启期间 mapstruct导致

常清静

dubbo 线程池 MapStruct

使用 KubeSphere 与极狐GitLab 打造云原生持续交付系统

极狐GitLab

基于AIoT物联平台的设备预防型维护助力光伏单晶行业实现设备精准维护!

用友BIP

资产管理 光伏单晶行业

PVP2 ProVideoPlayer2中文激活版下载

影影绰绰一往直前

京东sku属性数据接口(JD.item_sku)丨京东API接口

tbapi

京东API接口 京东商品数据接口 京东商品sku信息接口 京东商品属性接口 京东API

通过聚道云软件连接器打通浦发银行CBS系统与易快报,助力生物科技公司提升财务效率

聚道云软件连接器

案例分享

舞台LED显示屏使用禁忌

Dylan

视频 LED显示屏 户外LED显示屏 led显示屏厂家

Apache IoTDB v1.3.0 发布|增加客户端服务器 SSL 通讯加密、写入负数时间戳等功能

Apache IoTDB

深入解析云原生与Kubernetes:现代化应用开发的未来

快乐非自愿限量之名

国内用户怎么申请Fomepay虚拟卡,支持ChatGPT、Facebook、亚马逊、google play、Apple id、奈飞

跨境

Google Cloud 亚马逊 openai ChatGPT 奈飞客户端

Google SEO: 创建最佳SEO网站结构(20多个技巧)

九凌网络

Nextdoor分布式任务队列系统的演进_语言 & 开发_马德奎_InfoQ精选文章