消息队列(Message Queue)

消息: 网络中的两台计算机或者两个通讯设备之间传递的数据。例如说:文本、音乐、视频等内容。

队列:一种特殊的线性表(数据元素首尾相接),特殊之处在于只允许在首部删除元素和在尾部追加元素。入队、出队。

消息队列:顾名思义,消息+队列,保存消息的队列。消息的传输过程中的容器;主要提供生产、消费接口供外部调用做数据的存储和获取。

消息队列分类

MQ分类:点对点(P2P)、发布订阅(Pub/Sub)

共同点:消息生产者生产消息发送到queue中,然后消息消费者从queue中读取并且消费消息。

不同点: P2P模型包含:消息队列(Queue)、发送者(Sender)、接收者(Receiver)一个生产者生产的消息只有一个消费者(Consumer)(即一旦被消费,消息就不在消息队列中)。打电话。

Pub/Sub包含:消息队列(Queue)、主题(Topic)、发布者(Publisher)、订阅者(Subscriber)

每个消息可以有多个消费者,彼此互不影响。比如我发布一个微博:关注我的人都能够看到。

消息队列模式

  1. 点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)

点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端。这个模型的特点是发送到队列的消息被一个且只有一个接收者接收处理,即使有多个消息监听者也是如此。

  1. 发布/订阅模式(一对多,数据生产后,推送给所有订阅者)

发布订阅模型则是一个基于推送的消息传送模型。发布订阅模型可以有多种不同的订阅者,临时订阅者只在主动监听主题时才接收消息,而持久订阅者则监听主题的所有消息,即使当前订阅者不可用,处于离线状态。

消息队列的实现原理

消息队列的好处

  • 解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
  • 冗余:消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。
  • 扩展性:因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。
  • 灵活性 & 峰值处理能力: 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
  • 可恢复性:系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
  • 顺序保证:在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。(Kafka保证一个Partition内的消息的有序性)
  • 缓冲:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。
  • 异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

!

Kafka

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

Producer :消息生产者,就是向kafka broker发消息的客户端;

  1. Consumer :消息消费者,向kafka broker取消息的客户端;
  2. Topic :可以理解为一个队列
  3. Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic;
  4. Broker :一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic;
  5. Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序;
  6. Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。

Kafka 和其他消息队列的比较

Kafka和其他消息队列相关推荐

  1. Kafka简介与消息队列

    消息队列的好处: 消息队列(Message Queue) 消息: 网络中的两台计算机或者两个通讯设备之间传递的数据.例如说:文本.音乐.视频等内容. 队列:一种特殊的线性表(数据元素首尾相接),特殊之 ...

  2. Redis、Kafka 和 Pulsar 消息队列对比

    点击关注公众号,Java干货及时送达 导语 | 市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该 ...

  3. Redis、Kafka 和 Pulsar 消息队列对比,写得太好了!

    市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该选哪个? 本文尝试通过技术演进的方式,以redi ...

  4. 简单说一下kafka 与其他消息队列

    • RabbitMQ:分布式,支持多种MQ协议,重量级 • ActiveMQ:与RabbitMQ类似 • ZeroMQ:以库的形式提供,使用复杂,无持久化 • redis:单机.纯内存性好,持久化较差 ...

  5. 面试官:请你从架构演进的角度讲讲redis、kafka和 pulsar消息队列

    导语 | 市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该选哪个?本文尝试通过技术演进的方式,以 ...

  6. Kafka:分布式消息队列的抽象模型

    最基础的分布式队列编程抽象模型是点对点模型,其他抽象构架模型居于改基本模型上各角色的数量和交互变化所导致的不同拓扑图.具体而言,不同数量的发送者.分布式队列以及接收者组合形成了不同的分布式队列编程模型 ...

  7. 常见消息队列对比(ActiveMQ、ZeroMQ、kafka、RabbitMQ)?

    常见消息队列对比? 消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走. 通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息, ...

  8. python消息队列celery_消息队列(kafka/nsq等)与任务队列(celery/ytask等)到底有什么不同?...

    写这篇博文的起因是,我在论坛宣传我开源的新项目YTask(go语言异步任务队列)时,有小伙伴在下面回了一句"为什么不用nsq?".这使我想起,我在和同事介绍celery时同事说了一 ...

  9. 消息队列 ActiveMQ 、RocketMQ 、RabbitMQ 和 Kafka 如何选择?

    消息队列(MQ) 在百度百科中,消息队列(MQ)是这么解释的:"消息队列"是在消息的传输过程中保存消息的容器(可存可取). 它是分布式系统中重要的组件,使用消息队列主要是为了通过异 ...

最新文章

  1. C++中 =defaule 和 =delete什么意思
  2. 特征工程(2):特征构建
  3. codeforces1473 E.Minimum Path(分层图最短路)
  4. Spring 3.2矩阵变量是什么? –第2部分:代码
  5. java commons logging_Java日志介绍(5)-commons-logging
  6. mysql可重复读实验_Mysql可重复读测试
  7. python exec函数和eval函数_Python exec()和eval()的使用注意事项
  8. Java通过微信公众号获取地理位置信息
  9. unity--newtonsoft.json解析
  10. 推荐一个app,收纳杭州最全登山地图!附亲测过的亲子徒步路线推荐
  11. 面向对象实现气缸吹气类的PLC逻辑
  12. android xutils3 注解,xUtils3使用简介
  13. bldc 原理 方波控制_浅析无刷直流电机FOC、方波、正弦波控制!
  14. MEM/MBA 写作-论说文(02)立意 知识练习
  15. VUE系列 ---- 网络模块axios(一 )
  16. [SSM框架]—Mybatis入门
  17. 新机器导致显示器发黄的问题
  18. 还弄不懂相对路径和绝对路径,这篇文章带你简单剖析
  19. python xlwings实例_Python与Excel交互——Xlwings
  20. 2015 数学建模 国赛(高教杯)-B题 “互联网+”时代的出租车资源配置

热门文章

  1. python java混合编程_详解java调用python的几种用法(看这篇就够了)
  2. python填空题及答案知乎_GitHub - HSINAN/zhihu-python: 获取知乎内容信息,包括问题,答案,用户,收藏夹信息...
  3. 山东自考c语言程序设计停考了吗,山东自考教育类停考专业遗留问题的通知
  4. linux制作chroot环境,Linux构造chroot环境
  5. node.js + express 初体验【hello world】
  6. Elasticsearch之中文分词器插件es-ik(博主推荐)
  7. Dubbo源码分析:ProxyFactory
  8. IOS UI UITableView
  9. 利用SuppressMessage来阻止FxCop进行代码分析时报出的警告
  10. C语言-附加-按位翻转一个unsigned int 类型的数字