在介绍什么消息中间件之前,先介绍几个概念:
一、什么是消息#
消息是指软件对象之间进行交互作用和通讯利用的一种方式。
二、什么是中间件
非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件
三、什么是消息队列
消息队列是消息中间件的一种实现方式。
四、什么是消息中间件
关注于数据的发送和接受,利用高效可靠的异步消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
这可能比较抽象,既然消息队列是实现消息中间件的一种方式,不如我们从它的实际应用场景中,来进一步理解它,消息队列的应用场景主要有一下几个方面:
- 1) 异步处理
- 2) 应用解耦
- -3) 流量削峰
常见的消息中间件(MQ:Message Queuing)(这里只介绍我们大数据接触得比较多的)
1) RabbitMQ
使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)、数据持久化都有很好的支持。多用于进行企业级的ESB整合。
2)Redis:
使用C语言开发的一个Key-Value的NoSQL数据库,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。
补充:Redis与RabbitMQ的比较:
入队:数据大小<10K时,Redis的性能要高于RabbitMQ,数据大于10K时,RabbitMQ更胜一筹
出队:无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。
3) Kafka
使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性:
a、快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化;
b、高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;
c、高堆积:支持topic下消费者较长时间离线,消息堆积量大;
d、完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡;
e、支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。
深入理解消息队列:
消息队列的传递模型一共有两种形式:
点对点(PTP)
点对点模型的特点:
1,每个消息只有一个消费者
2,发送者和接受者没有时间依赖
3,接受者确认消息接受和处理成功
发布-订阅(Pub/Sub)
发布/ 订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进
行接收。
发布-订阅模型特点:
1,每个次消息可以有多个消费者
2,客户只有订阅后才能接收消息(只有建立订阅关系才可以接收消息 )
3,持久订阅和非持久订阅
持久订阅
订阅关系建立后(关系保存在消息中间件中),不管消费者(也就是订阅者)是否在线消息都不会消失。
非持久订阅
建立一种类似长连接关系式的订阅模式,订阅者为了接收消息必须保持一直连接的状态,如果断开连接则丢失消息。
消息队列的分类:
消息队列的应用案例:
不做赘述,这里主要为了引入kafka是一个消息队列中间件,想进一步了解消息中间件,推荐一下两篇文章
https://www.cnblogs.com/lifeibai/p/9167701.html
https://www.cnblogs.com/lifeibai/p/9167701.html