目录
一、消息队列
为什么要⽤消息队列?
- 消息 Message
⽹络中的两台计算机或者两个通讯设备之间传递的数据。例如说:⽂本、⾳乐、视频等内容。 - 队列 Queue
⼀种特殊的线性表(数据元素⾸尾相接),特殊之处在于只允许在⾸部删除元素和在尾部追加元素(FIFO)。
⼊队、出队。 - 消息队列 MQ
消息+队列,保存消息的队列。消息的传输过程中的容器;主要提供⽣产、消费接⼝供外部调⽤做数据的存 储和获取
二、消息队列的分类
MQ主要分为两类:点对点(p2p)、发布订阅(Publish/Subscribe)
- Peer-to-Peer
⼀般基于Pull 或者 Polling 接收数据
发送到队列中的消息被⼀个⽽且仅仅⼀个接收者所接受,即使有多个接收者在同⼀个队列中侦听同⼀消息 即⽀持异步“即发即收”的消息传递⽅式,也⽀持同步请求 / 应答传送⽅式
- 发布订阅
发布到同⼀个主题的消息,可被多个订阅者所接收发布 / 订阅即可基于 Push 消费数据,也可基于 Pull 或者 Polling 消费数据解耦能⼒⽐ P2P 模型更强
三、p2p和发布订阅MQ的⽐较
- 共同点:
消息⽣产者⽣产消息发送到queue中,然后消息消费者从queue中读取并且消费消息。
- 不同点:
p2p模型包括:消息队列 (Queue) 、发送者 (Sender) 、接收者 (Receiver)⼀个⽣产者⽣产的消息只有⼀个消费者(Consumer)( 即⼀旦被消费,消息就不在消息队列中 ) 。⽐如说打电 话。
pub/Sub 包含:消息队列 (Queue) 、主题 (Topic) 、发布者 (Publisher) 、订阅者 (Subscriber)
每个消息可以有多个消费者,彼此互不影响。⽐如我发布⼀个微博:关注我的⼈都能够看到。
四、消息系统的使⽤场景
- 解耦 各系统之间通过消息系统这个统⼀的接⼝交换数据,⽆须了解彼此的存在
- 冗余 部分消息系统具有消息持久化能⼒,可规避消息处理前丢失的⻛险
- 扩展 消息系统是统⼀的数据接⼝,各系统可独⽴扩展
- 峰值处理能⼒ 消息系统可顶住峰值流量,业务系统可根据处理能⼒从消息系统中获取并处理对应量的请求
- 可恢复性 系统中部分键失效并不会影响整个系统,它恢复会仍然可从消息系统中获取并处理数据
- 异步通信 在不需要⽴即处理请求的场景下,可以将请求放⼊消息系统,合适的时候再处理
五、常⻅的消息系统
- RabbitMQ Erlang编写,⽀持多协议AMQP,XMPP,SMTP,STOMP。⽀持负载均衡、数据持久化。同时⽀
- 持Peer-to-Peer和发布/订阅模式。
- Redis 基于Key-Value对的NoSQL数据库,同时⽀持MQ功能,可做轻量级队列服务使⽤。就⼊队操作⽽⾔,
- Redis对短消息(⼩于10kb)的性能⽐RabbitMQ好,⻓消息性能⽐RabbitMQ差。
- ZeroMQ 轻量级,不需要单独的消息服务器或中间件,应⽤程序本身扮演该⻆⾊,Peer-to-Peer。它实质上是
- ⼀个库,需要开发⼈员⾃⼰组合多种技术,使⽤复杂度⾼。
- ActiveMQ JMS实现,Peer-to-Peer,⽀持持久化、XA(分布式)事务
- Kafka/Jafka ⾼性能跨语⾔的分布式发布/订阅消息系统,数据持久化,全分布式,同时⽀持在线和离线处理
- MetaQ/RocketMQ 纯Java实现,发布/订阅消息系统,⽀持本地事务和XA分布式事务
六、Kafka概述
Kafka是分布式的发布
—
订阅消息系统。它最初由
LinkedIn(
领英
)
公司发布,使⽤
Scala
语⾔编写,于
2010
年
12
⽉份开源,成为Apache
的顶级项⽬。
Kafka
是⼀个⾼吞吐量的、持久性的、分布式发布订阅消息系统。它主要⽤于处理活跃live
的数据
(
登录、浏览、点击、分享、喜欢等⽤户⾏为产⽣的数据
)
。
三⼤特点:
- ⾼吞吐量
可以满⾜每秒百万级别消息的⽣产和消费——⽣产消费。 - 持久性
有⼀套完善的消息存储机制,确保数据的⾼效安全的持久化——中间存储。 - 分布式
基于分布式的扩展和容错机制;Kafka的数据都会复制到⼏台服务器上。当某⼀台故障失效时,⽣产者和消费者转⽽使⽤其它的机器——整体
七、设计⽬标
- ⾼吞吐率 在廉价的商⽤机器上单机可⽀持每秒100万条消息的读写
- 消息持久化 所有消息均被持久化到磁盘,⽆消息丢失,⽀持消息重放
- 完全分布式 Producer,Broker,Consumer均⽀持⽔平扩展
- 同时适应在线流处理和离线批处理
八、kafka核⼼的概念
⼀个MQ
需要哪些部分?⽣产、消费、消息类别、存储等等。
对于kafka
⽽⾔,
kafka
服务就像是⼀个⼤的⽔池。不断的⽣产、存储、消费着各种类别的消息。那么
kafka
由何组成呢?
Kafka服务:
- Topic:主题,Kafka处理的消息的不同分类。
- Broker:消息服务器代理,Kafka集群中的⼀个kafka服务节点称为⼀个broker,主要存储消息数据。存在硬盘中。每个topic都是有分区的。
- Partition:Topic物理上的分组,⼀个topic在broker中被分为1个或者多个partition,分区在创建topic的时候指定。
- Message:消息,是通信的基本单位,每个消息都属于⼀个partition
Kafka服务相关:
- Producer:消息和数据的⽣产者,向Kafka的⼀个topic发布消息。
- Consumer:消息和数据的消费者,定于topic并处理其发布的消息。
- Zookeeper:协调kafka的正常运⾏。