专栏首页终身幼稚园消息队列简介(MQ)

消息队列简介(MQ)

一、什么是消息队列

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

二、队列的特点

  • 先进先出
  • 发布订阅
  • 持久化
  • 分布式

三、消息队列的优势

在现代云架构中,应用程序被分解为多个规模较小且更易于开发、部署和维护的独立构建块。消息队列可为这些分布式应用程序提供通信和协调。

消息队列可以显著简化分离应用程序的编码,同时提高性能、可靠性和可扩展性。此外,您还可以采用扇出设计模式将消息队列与发布/订阅消息收发结合起来。

1.提高性能 消息队列支持异步通信,这意味着创建和处理消息的终端节点将与队列进行交互,而不是彼此交互。创建器可以将请求添加到队列中,无需再等待这些请求接受处理。处理器仅在消息可用时才会处理消息。系统中的任何组件都不会停下等待其他组件,从而优化了数据流。

2.增强可靠性 队列可永久保留您的数据,并减少系统的不同部件离线时发生的错误。通过利用消息队列分离不同的组件,可以提高容错性。即使系统的某一部分无法访问,其他部分也仍可继续与队列进行交互。队列本身也可以进行镜像,以提供更高的可用性。

3.可拓展性 消息队列可根据您的需要精确扩展。当工作负载到达峰值时,应用程序的多个实例都可以将请求添加到队列,而且不会产生冲突。随着队列因这些传入请求的增多而越来越长,您可以将这些工作负载分发给一组处理器。创建器、处理器和队列本身都可以按需扩展和缩减。

4.分离解耦 消息队列消除了组件之间的依赖关系,并显著简化了分离应用程序的编码。软件组件不必承担通信代码的重压,而是可以在经过设计后执行离散的业务功能。

无论您使用的是整体式应用程序、微服务还是无服务器架构,消息队列都是一种简单且出色的应用程序分离方法。

四、几种常见的MQ队列

1.RabbitMQ

官网: http://www.rabbitmq.com/ 开发语言: Erlang 支持客户端语言言: Erlang,java,Ruby等 协议: AMQP, STOMP, XMPP, SMTP 消息推拉模式: pull/push均支持 数据可靠性: 保证数据不丢,有Slave用作备份 单机吞吐量: 万级 持久化能力: 内存, 文件

RabbitMQ是一个消息传递代理—消息传递的中介。它为您的应用程序提供了一个发送和接收消息的公共平台,并为您的消息提供了一个安全的地方,直到收到消息为止。它的特性包括可靠性、高可用性、集群和联合。RabbitMQ附带一个易于使用的管理UI,允许您监视和控制消息代理的各个方面。几乎任何您能想到的语言都有RabbitMQ客户机。

2.RocketMQ

官网: https://rocketmq.incubator.apache.org/ 开发语言: Java 支持客户端语言: Java, C++, Go 协议: JMS,MQTT 消息推拉模式: pull/push均支持 数据可靠性: 支持异步实时刷盘,同步刷盘,同步复制,异步复制 单机吞吐量:十万级 持久化能力: 磁盘文件

其中

NameServer: 为 producer 和 consumer 提供路由信息 Producer: 为消息生产者,生产者的作用就是将消息发送到MQ,生产者本身既可以产生消息 Consumer: 为消息消费者,消费 MQ 上的消息的应用程序就是消费者 Broker: RocketMQ系统的主要角色,及队列。Broker接收来自生产者的消息,储存以及为消费者拉取消息的请求做好准备。

Apache RocketMQ是一个低延迟、可靠、可伸缩、易于使用的消息中间件,诞生于阿里巴巴庞大的消息业务。它提供的各种功能如下:

  • 发布/订阅和P2P消息传递模型
  • 在同一队列中可靠的FIFO和严格的顺序消息传递
  • 支持pull和push模式
  • 单一队列百万消息堆积能力
  • 支持各种消息传递协议。例如JMS、MQTT等。
  • 功能丰富的管理仪表板的配置,指标和监测
  • 分布式高可用的部署架构,满足至少一次消息传递语义
  • 提供 docker 镜像用于隔离测试和云集群部署

3.ActiveMQ

官网: http://activemq.apache.org/ 开发语言: Java 支持客户端语言: Java, .NET, C++ 等 协议: OpenWire, STOMP, REST, XMPP, AMQP 消息推拉模式: pull/push均支持 数据可靠性: master/slave 单机吞吐量:万级 持久化能力: 内存, 文件, 数据库

p2p模式:

pub/sub模式:

Apache ActiveMQ是最流行、功能最强大的开源消息传递和集成模式提供者。Apache ActiveMQ速度快,支持许多跨语言客户机和协议,具有易于使用的企业集成模式和许多高级特性,同时完全支持JMS 1.1和J2EE 1.4。

4.Kafka

官网: http://kafka.apache.org/ 开发语言: Java & Scala 支持客户端语言: Java, Scala 等 协议:自有协议 消息推拉模式: pull 数据可靠性: 数据可靠,并有replication机制,有容错容灾能力 单机吞吐量:十万级 持久化能力: 磁盘文件,可以做到无限消息堆积

内部结构图:

如上图所示,一个典型的kafka集群中包含若干producer,若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个Zookeeper 集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。


喜欢可以关注公众号: 终身幼稚园

本文分享自微信公众号 - 终身幼稚园(gh_642061c72cce),作者:园长

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊一聊Java枚举(enmu)的使用

    枚举可以被认为是一个密封类的语法糖,该类在编译时仅实例化了若干次,以定义一组常量。

    终身幼稚园
  • UML类图简单介绍

    一个项目初期,我们往往对业务一无所知,我们最急迫需要解决的问题就是理清楚这些业务概念以及它们的关系,如果能用好类图,你将能深入地剖析系统业务。

    终身幼稚园
  • Python使用Tor作为代理进行网页抓取

    在网络抓取的过程中,我们经常会遇见很多网站采取了防爬取技术,或者说因为自己采集网站信息的强度和采集速度太大,给对方服务器带去了太多的压力,所以你一直用同一个代理...

    终身幼稚园
  • JMS中间件ActiveMQ详解

    Java Message Service(JMS)是SUN提出的旨在统一各种MOM(Message-Oriented Middleware )系统接口的规范,它...

    烂猪皮
  • 【SpringBoot MQ 系列】RabbitMq 核心知识点小结

    RabbitMQ 是一个基于 AMQP 协议实现的企业级消息系统,想要顺畅的玩耍的前提是得先了解它,本文将主要介绍 rabbitmq 的一些基本知识点

    小灰灰
  • 快速学习-RabbitMQ基本介绍

    MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消...

    cwl_java
  • 分布式消息中间件 — MQ

    消息队列(Message Queue,简称 MQ)是阿里巴巴集团中间件技术部自主研发的专业消息中间件。用于保证异构应用之间的消息传递。应用程序通过MQ接口进行互...

    AI乔治
  • 分布式消息中间件 — MQ

    消息队列(Message Queue,简称 MQ)是阿里巴巴集团中间件技术部自主研发的专业消息中间件。用于保证异构应用之间的消息传递。应用程序通过MQ接口进行互...

    烂猪皮
  • 陌陌通讯协议的学习

    陌陌发展刚开始由于规模小,30-40W的连接数(包括Android后台长连接用户),也使用XMPP;由于XMPP的缺点:流量大(基于XML),不可靠(为传统固定...

    哲洛不闹
  • 这次真的忽略了一些ActiveMQ内心的娇艳

    首先ActiveMQ有俩种消息队列模式:点对点和发布订阅,这俩种都有不可替代的应用场景,前者适用于消息唯一传递的业务,后者适用于分布式环境下进行多面数据同步的...

    赵小忠

扫码关注云+社区

领取腾讯云代金券