1.消息队列是什么?
消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。
消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。
“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。
消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
2.消息队列的特点
1.异步:消息队列本身是异步的,不需要等待回应。(消息队列的异步特点,也造成了一个缺点,就是接收者必须轮询消息队列,才能收到最近的消息)
2.解耦:消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节,只要定义好消息的格式就行。
3.广播:消息队列的基本功能之一是进行广播。如果没有消息队列,每当一个新的业务方接入,我们都要联调一次新接口。有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,是下游的事情,无疑极大地减少了开发和联调的工作量。
4.流量削峰与流控\n当上下游系统处理能力存在差距的时候,利用消息队列做一个通用的”载体”。在下游有能力处理的时候,再进行分发与处理。
3.消息队列Kafka
Kafka用来构建实时数据管道和数据流应用。它是水平可扩展的,具有容错性的,极其快速的,并且已应用于上千家公司的产品环境中。
Kafka是一个分布式流平台【distributed streaming platform】。这到底是什么意思呢?\n\n我们认为一个流平台有3个核心能力:
它允许你发布和订阅数据流【streams of records】。在这个方面它类似于一个消息队列,或者像企业级消息系统。
它允许你以一种可容错的方式来存储数据流。
它允许你当数据出现时就能处理数据流。
Kafka在什么场景有优势?
系统或应用之间,构建实时流数据通道来可靠的获取数据。
构建实时流应用,来传输数据流,或者对数据流做出响应。
为了了解Kafka是如何做到这些的,让我们深究下去,从底层探索Kafka的能力。
首先介绍一些概念:
Kafka作为集群运行在1个或多个服务器上。
Kafka集群将数据流存储在被称为主题的类别中。
每一个数据记录都包含一个key,一个value,和一个timestamp。
Kafka有4个核心API:
生产者API:允许一个程序向一个或多个Kafka主题发布一个数据流。
消费者API:允许一个程序订阅一个或多个主题,并且能对产生过来的数据流进行处理。
流API【Streams API】:允许一个程序扮演一个流处理器【stream processor】,它可以从一个或多个主题中消费一个输入流,并产生一个输出流通向一个或多个输出主题,有效的将输入流转化为输出流。
连接器API【Connector API】:允许构建和运行可重用的发布者或者消费者,将Kafka主题连至已存在的应用中,或者数据系统中。比如说,一个和关系型数据库相连的连接器,就可以捕获一个表的每一次变化。
在Kafka中,客户端和服务器之间的通信,使用的是一个简单的,高性能的,语言无关的TCP协议。这个协议有版本控制,并且保持对老版本的向后兼容性。我们提供了Kafka的一个Java客户端,但是客户端其实可以支持多种语言。
4.RabbitMQ
RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
主要特性:
可靠性: 提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制;
灵活的路由: 消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用;
消息集群:在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用;
队列高可用:队列可以在集群中的机器上进行镜像,以确保在硬件问题下还保证消息安全;
多种协议的支持:支持多种消息队列协议;
服务器端用Erlang语言编写,支持只要是你能想到的所有编程语言;
管理界面: RabbitMQ有一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面;
跟踪机制:如果消息异常,RabbitMQ提供消息跟踪机制,使用者可以找出发生了什么;
插件机制:提供了许多插件,来从多方面进行扩展,也可以编写自己的插件;