RabbitMQ简介及消息队列选型介绍

RabbitMQ简介及消息队列选型介绍

2021-05-10 14:36:27

一、MQ简介

1.消息队列 (Message Queue)

消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行,它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。

在分布式计算环境中,为了集成分布式应用,开发者需要对异构网络环境下的分布式应用提供有效的通信手段。为了管理需要共享的信息,对应用提供公共的信息交换机制是重要的。

消息队列为构造以同步或异步方式实现的分布式应用提供了松耦合方法。消息队列的API调用被嵌入到新的或现存的应用中,通过消息发送到内存或基于磁盘的队列或从它读出而提供信息交换。消息队列可用在应用中以执行多种功能,比如要求服务、交换信息或异步处理等。

MQ具有强大的跨平台性,它支持的平台数多达35种。它支持各种主流Unix、Linux和Windows操作系统平台。

2.消息中间件概述

中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络通讯。它在计算机系统中是一个关键软件,它能实现应用的互连和互操作性,能保证系统的安全、可靠、高效的运行。

中间件位于用户应用和操作系统及网络软件之间,它为应用提供了公用的通信手段,并且独立于网络和操作系统。中间件为开发者提供了公用于所有环境的应用程序接口,当应用程序中嵌入其函数调用,它便可利用其运行的特定操作系统和网络环境的功能,为应用执行通信功能。

如果没有消息中间件完成信息交换,应用开发者为了传输数据,必须要学会如何用网络和操作系统软件的功能,编写相应的应用程序来发送和接收信息,且交换信息没有标准方法,每个应用必须进行特定的编程从而和多平台、不同环境下的一个或多个应用通信。例如,为了实现网络上不同主机系统间的通信,将要求具备在网络上如何交换信息的知识(比如用TCP/IP的socket程序设计);为了实现同一主机内不同进程之间的通讯,将要求具备操作系统的消息队列或命名管道(Pipes)等知识。

二、RabbitMQ简介

1.AMQP简介

介绍RabbitMQ前先了解下什么是AMQP

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议,为面向消息的中间件设计,消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在。RabbitMQ简介及消息队列选型介绍.png工作过程:

  • 发布者(Publisher)发布消息(Message),经由交换机(Exchange);

  • 交换机根据路由规则将收到的消息分发给与该交换机绑定的队列(Queue);

  • 最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照求自行获取;

AMQP的主要特征:面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

2.什么是RabbitMQ

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

3.RabbitMQ特点

  • 可靠性: RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认及发布确认等。

  • 灵活的路由∶在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能,RabbitMQ己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的交换器。

  • 扩展性:多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。

  • 高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队列仍然可用。

  • 多种协议:RabbitMQ除了原生支持AMQP协议,还支持STOMP,MQTT等多种消息中间件协议。

  • 多语言客户端:RabbitMQ几乎支持所有常用语言,比如 Java、Python、 Ruby、 PHP、C#、JavaScript等。

  • 管理界面:RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。

  • 插件机制: RabbitMQ提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件

4.rabbitmq优点和常用场景

  • 异步处理:相比于传统的串行、并行方式,提高了系统吞吐量。

  • 应用解耦:系统间通过消息通信,不用关心其他系统的处理。

  • 流量削锋:可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。

  • 日志处理:解决大量日志传输。

  • 消息通讯:消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

三、消息队列选型

1.各个主流消息队列对比

特 性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级,比 RocketMQ 和 Kafka 低一个数量级 同 ActiveMQ 10万级,支持高吞吐 10万级,高吞吐,一般配合大数据类的系统进行实时计算、日志采集等场景
开发语言 Java Erlang Java Scala/Java
主要维护者 Apache Mozilla/Spring Alibaba Apache
时效性 毫秒级 微秒级,这是 RabbitMQ 的一大特性,低延迟 毫秒级 延迟在毫秒级以内
可用性 高,基于主从架构实现高可用 同 ActiveMQ 非常高,分布式架构 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
管理界面 一般 较好 一般
功能支持 MQ 领域中的功能极其完备 基于 erlang 开发,并发能力很强,性能极好,延时很低 MQ 功能较为完善,支持分布式扩招 功能较为简单,支持简单的 MQ 功能,主要用于大数据领域,如实时计算以及日志采集等场景

2.选型建议

  1. 1.如果消息队列不是将要构建系统的重点,对消息队列功能和性能没有很高的要求,只需要一个快速上手易于维护的消息队列,建议使用RabbitMQ。

  2. 2.如果系统使用消息队列主要场景是处理在线业务,比如在交易系统中用消息队列传递订单电要低延迟和高稳定性,建议使用RocketMQ。

  3. 3.如果需要处理海量的消息,像收集日志、监控信息或是埋点这类数据,或是你的应用场景大量使用了大数据、流计算相关的开源产品,那Kafka是最适合的消息队列。

四、RabbitMQ基本概念

RabbitMQ工作模型

d001223dac6c6ffb2a1a1dbc6d3d3195.png

Producer

生产者,创建消息Message,然后发布到RabbitMQ中。

Connection

连接,是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑,一个连接上可以有多个channel进行通信

Channel

信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。

Broker

消息队列服务器实体。中文意思:中间件。接受客户端连接,实现AMQP消息队列和路由功能的进程。一个broker里可以开设多个vhost,用作不同用户的权限分离。可以认为一个mq节点就是一个broker。

VHost

虚拟主机,用于不同业务模块的逻辑隔离,一个Virtual Host里面可以有若干个Exchange和Queue,同一个VirtualHost 里面不能有相同名称的Exchange或Queue,Virtual Host是权限控制的最小粒度。

Exchange

交换器,生产者将消息发送到 Exchange,交换器将消息路由到一个或者多个队列中。ExchangeType决定了Exchange路由消息的行为,例如,在RabbitMQ中,ExchangeType有Topic、RPC等,不同类型的Exchange路由的行为是不一样的。队列和交换机是多对多的关系。

Queue

消息队列,用于存储还未被消费者消费的消息。

Message

消息,由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的APP数据。

Binding

绑定,Exchange和Queue之间的虚拟连接,binding中可以包含routing key。

Consumer

消费者,消费队列里面的消息。

@版权声明:51CTO独家出品,未经允许不能转载,否则追究法律责任

 

版权声明:
作者:WaterBear
链接:https://l-t.top/2069.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录