消息队列和任务队列有什么区别?

前言

昨天发了一篇文章是关于machinery的入门教程,有一位读者在留言中问我 这个和kafka有什么区别?一时我也有点懵,这两个的概念很近,到底有什么不一样呢?根据我本身的理解,简单分析了一下,有不足之处欢迎指出。golang

消息队列

消息队列这个概念其实在我以前的文章:手把手教姐姐写消息队列,本身动手用go写一个简易版的消息队列,有兴趣的小伙伴们能够看一下这篇文章。回归正题,咱们再来介绍一下什么是消息队列。web

消息队列,通常咱们会简称它为MQ(Message Queue)。他是由两个单词组成,咱们应该对队列(Queue)很熟悉吧。队列是一种先进先出的数据结构。再配合上消息,消息队列能够简单理解为:把要传输的数据放在队列中。使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。这里咱们就不具体讲解消息队列实现细节,这不是本文的主题,只知道概念就能够了。了解了什么是消息队列,咱们一块儿来看看他在什么场景使用。面试

场景

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。这里举一个消息队列的使用场景:日志处理。redis

日志处理是指将消息队列用在日志处理中,好比Kafka的应用,解决大量日志传输的问题。架构简化以下:设计模式

  • 日志采集客户端,负责日志数据采集,定时写入 Kfaka队列。
  • Kfaka消息队列,负责日志数据的接收,存储和转发。
  • 日志处理应用,订阅并消费kafka队列中日志数据。

任务队列

既然消息队列称为MQ,那么任务队列咱们就能够叫其TQ(Task Message)。任务队列能够简单理解为:把要执行的任务放在队列中。使用较多的任务队列有machineyCelerygoWorkerYTask。每个任务队列都有本身的特色,这里就不细讲了。我写了一篇machinery入门教程,而且翻译了一篇machinery中文文档,有须要的公众号自取。具体任务队列的细节就不讲了。这不是本文的主题,下面咱们看一看任务队列的使用场景。缓存

场景

任务队列是用来执行一个耗时任务。你们可能都使用过马爸爸的花呗,每当咱们还款时,就会增长本身的芝麻信用分。这就能够用到任务队列来计算用户的积分和等级了。架构简化以下:微信

  • 用户还款,当用户还款成功时,发送一个计算用户积分计算的任务到任务队列。网络

  • 任务队列,能够是mq,也但是redis,用来存储任务。数据结构

  • 任务执行者,任务的执行者,监放任务队列,当任务队列中有任务时,便会执行。架构

区别

消息队列和任务队列,我以为最大的不一样就是理念的不一样:任务队列传递的是"任务",消息队列传递的是"消息"。任务队列能够说是消息队列的二次开发。

经过上面两个场景例子,咱们能够总结一下二者区别:

  • 消息队列更侧重于消息的吞吐、处理,具备有处理海量信息的能力。另外利用消息队列的生产者和消费者的概念,也能够实现任务队列的功能,可是还须要进行额外的开发处理。
  • 任务队列则提供了执行任务所需的功能,好比任务的重试,结果的返回,任务状态记录等。虽然也有并发的处理能力,但通常不适用于高吞吐量快速消费的场景。其实任务队列和远程函数调用很像,不过和rpc调用不一样,他的调用不是网络请求的方式,而是经过利用消息队列传递任务信息。

综上所述,我的认为任务队列就是消息队列在异步场景下的深度二次开发,根据实际项目开发根据实际场景作相应选择便可。

后言

以上全是我的理解,有什么不对的,欢迎指出。

好啦,这一篇文章到这就结束了,咱们下期见~~。但愿对大家有用。可添加个人golang交流群,咱们一块儿学习交流。

结尾给你们发一个小福利吧,最近我在看[微服务架构设计模式]这一本书,讲的很好,本身也收集了一本PDF,有须要的小伙能够到自行下载。获取方式:关注公众号:[Golang梦工厂],后台回复:[微服务],便可获取。

我翻译了一份GIN中文文档,会按期进行维护,有须要的小伙伴后台回复[gin]便可下载。

本身翻译了一份machinery官方中文文档,会按期维护,有须要的小伙伴后台回复[machinery]便可下载。

我是asong,一名普普统统的程序猿,让gi我一块儿慢慢变强吧。我本身建了一个golang交流群,有须要的小伙伴加我vx,我拉你入群。欢迎各位的关注,咱们下期见~~~

推荐往期文章:


本文分享自微信公众号 - Golang梦工厂(AsongDream)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索