在介绍什么消息中间件之前,先介绍几个概念: 一、什么是消息# 消息是指软件对象之间进行交互作用和通讯利用的一种方式。
二、什么是中间件 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件
三、什么是消息队列 消息队列是消息中间件的一种实现方式。
四、什么是消息中间件 关注于数据的发送和接受,利用高效可靠的异步消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 这可能比较抽象,既然消息队列是实现消息中间件的一种方式,不如我们从它的实际应用场景中,来进一步理解它,消息队列的应用场景主要有一下几个方面:
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