1.MQ使用场景

  • 异步通信 
    有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把消息放入队列,但并不立即处理它。想在队列中放入多少消息就放多少,然后在需要的时候再去处理他。

  • 解耦 
    降低工程间的强依赖程度,针对异构系统进行适配。在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。通过消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,当应用发生变化时,可以独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

  • 冗余 
    有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

  • 扩展性 
    因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。便于分布式扩容。

  • 过载保护 
    在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量无法提取预知;如果以为了能处理这类瞬间峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

  • 可恢复性 
    系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

  • 顺序保证 
    在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。

  • 缓冲 
    在任何重要的系统中,都会有需要不同的处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流经过系统的速度。以调节系统响应时间。

  • 数据流处理 
    分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,然后进行大数据分析是当前互联网的必备技术,通过消息队列完成此类数据收集是最好的选择。

2.MQ原理

2.1MQ模型

  1. Pub/Sub发布订阅(广播):使用topic作为通信载体

  2. PTP点对点:使用queue作为通信载体

2.2 MQ的组成

  • Broker:消息服务器,作为server提供消息核心服务

  • Producer:消息生产者,业务的发起方,负责生产消息传输给broker

  • Consumer:消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理

  • Topic:主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播

  • Queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收

  • Message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输

2.3 MQ常用协议

  • AMQP 
    AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议, 
    是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并 
    不受客户端/中间件不同产品,不同开发语言等条件的限制。 
    优点:可靠、通用

  • MQTT协议 
    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协 
    议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来, 
    被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。 
    优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统

  • STOMP协议 
    STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。 
    优点:命令模式(非topic\queue模式)

  • XMPP协议 
    XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操作。核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。 
    优点:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大

  • 其他基于TCP/IP自定义的协议 
    有些特殊框架(如:redis、kafka、zeroMq等)根据自身需要未严格遵循MQ规范,而是基于TCP\IP自行封装了一套协议,通过网络socket接口进行传输,实现了MQ的功能。

2.4 MQ选型

  • RabbitMQ 
    使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)、数据持久化都有很好的支持。多用于进行企业级的ESB整合。

  • ZeroMQ 
    又称ØMQ、0MQ、ZMQ,号称最快的消息队列系统,专门为高吞吐量、低延迟的场景开发,在金融界的应用中经常使用,偏重于实时数据通信场景。ZMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,开发成本高。因此ZeroMQ具有一个独特的非中间件的模式,更像一个socket library,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序本身就是使用ZeroMQ API完成逻辑服务的角色。但是ZeroMQ仅提供非持久性的队列,如果down机,数据将会丢失。如:Twitter的Storm中使用ZeroMQ作为数据流的传输。 ZeroMQ套接字是与传输层无关的:ZeroMQ套接字对所有传输层协议定义了统一的API接口。默认支持 进程内(inproc) ,进程间(IPC) ,多播 ,TCP协议,在不同的协议之间切换只要简单的改变连接字符串的前缀。可以在任何时候以最小的代价从进程间的本地通信切换到分布式下的TCP通信。ZeroMQ在背后处理连接建立,断开和重连逻辑。 
    特性:

    • 无锁的队列模型 
      对于跨线程间的交互(用户端和session)之间的数据交换通道pipe,采用无锁的队列算法CAS;在pipe的两端注册有异步事件,在读或者写消息到pipe的时,会自动触发读写事件。

    • 批量处理的算法 
      对于批量的消息,进行了适应性的优化,可以批量的接收和发送消息。

    • 多核下的线程绑定,无须CPU切换 
      区别于传统的多线程并发模式,信号量或者临界区, zeroMQ充分利用多核的优势,每个核绑定运行一个工作者线程,避免多线程之间的CPU切换开销。

  • ActiveMQ 
    Apache下的一个子项目。使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。

  • Redis 
    使用C语言开发的一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

  • Kafka 
    Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性: 快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化; 
    高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率; 
    高堆积:支持topic下消费者较长时间离线,消息堆积量大; 
    完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡; 
    支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。

    2.4MQ对比

    2.4.1使用场景建议

    MQ TPS量级(持久化) 场景 备注
    RabbitMQ 3500-4000msg/s 非海量高可靠性场景 大规模企业应用、ESB 复杂路由策略 异构系统整合 协议丰富兼容性强,功能完善,消息格式比较大,速度较慢,消息持久化对性能影响明显
    ZeroMq 大于800000msg/s 高并发连接场景,如:在线游戏 海量高实时性场景,如:股票行情 偏重于网络开发,开发成本高,高级功能需自行实现,不建议做传统MQ应用
    ActiveMq ~3600msg/s 非海量高可靠场景 企业级应用 分布式事务(XA) 异构系统整合 相对Rabbitmq较轻量级,性能相近,完整JMS支持、配置较复杂
    Redis ~15000msg/s 高吞吐低延迟 大量小消息体(<10K) 顺序性或排序要求 异构系统整合 轻量级MQ的快速简单实现,容灾与负载等功能需自行完善
    Kafka Input ~70000msg/s Output >150000msg/s 日志等海量数据流 DB数据同步 高堆积离线消息处理 非典型MQ,更偏重于流式数据批处理
  • 参考 https://blog.csdn.net/yunzhaji3762/article/details/79763660

转载于:https://www.cnblogs.com/yangk5636/p/9232183.html

消息队列(MQ)比较相关推荐

  1. java队列_RPC远程调用和消息队列MQ的区别

    RPC和MQ同样都是用于分布式系统的两个很重要的技术,都有服务提供者.消费者的概念,可在一定程度上对系统进行解耦.但两者之间还是有区别的,本篇简单介绍~ 一.RPC RPC(Remote Proced ...

  2. 消息队列的使用场景_消息队列MQ的特点、选型及应用场景

    一.什么是消息队列 消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列. 消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可 ...

  3. 后端技术:消息队列MQ/JMS/Kafka相关知识介绍

    ?今天给大家分享消息队列MQ/JMS/Kafka相关知识介绍 1.消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把我们的快递送到我们的手里.他需要什么条件嗯? 快递小哥有时间送, 我们有时 ...

  4. 详解RPC远程调用和消息队列MQ的区别

    谈到分布式架构,就不得不谈到分布式架构的基石RPC. 什么是RPC RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC服 ...

  5. 消息中间件系列(四):消息队列MQ的特点、选型、及应用场景详解

    前面集中谈了分布式缓存Redis系列: 高并发架构系列:分布式锁的由来.特点.及Redis分布式锁的实现详解 高并发架构系列:Redis并发竞争key的解决方案详解 高并发架构系列:Redis缓存和M ...

  6. 消息队列MQ夺命连环11问:kafka、rabbitmq、rocketmq、activemq

    <消息队列MQ如何保证消息的幂等性> <RabbitMQ架构> <ZeroMQ简介:一种高性能的异步消息传递库> <Rocketmq原理&最佳实践&g ...

  7. 阿里云消息队列MQ学习—阿里云大学视频课

    在刷ACE题的过程中,感觉对于消息队列部分的理解不是很深刻,这里来学习一下. 例行还是先走一遍阿里云大学的一些视频课程扫扫盲,选择如下课程: 阿里消息队列MQ简介:阿里巴巴中间件技术部自主研发的专业消 ...

  8. 消息队列MQ 之 Kafka

    目录 前言 一.消息队列 MQ 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 二.Kafka 概述 Kafka 简介 Kafka 的特性 三 实验 前言 一.消息队列 MQ MQ ...

  9. 消息队列MQ与微消息队列MQTT

    文章目录 参考文章 什么是消息队列,什么是RPC 为什么要使用MQ消息队列 1. 解耦(可用性) 2. 流量削峰 3. 数据分发 消息队列的缺点 多种主流传统消息队列MQ对比 传统消息队列Rocket ...

  10. OneNET物联网平台06 消息队列MQ服务开启与配置

    消息队列MQ可作为规则引擎对接的扩展增值服务使用,配合物联网套件,可形成具备设备接入.设备管理.消息分发.应用承载能力的高性能服务组合 消息队列MQ具有如下特点: 消息缓存 MQ服务支持消息缓存,可以 ...

最新文章

  1. 隐马尔可夫模型(Hidden Markov Model,HMM)是什么?隐马尔可夫模型(Hidden Markov Model,HMM)的三个基本问题又是什么?
  2. 比特币现金(BCH)是世界上最好货币的十大理由
  3. 用 Shell 脚本访问 MySQL 数据库
  4. 008_TreeSet使用Comparator排序
  5. python-迭代器和生成器
  6. react table里跳转页面_react路由配置基础篇:react-router4.0及以上
  7. Windows编程—Windows驱动开发环境搭建
  8. WN7 上IIS7运行asp+access网站出现错误: ADODB.Connection 错误 '800a0e7a'未找到提供程序。该程序可能未正确安装
  9. iPhone手机投屏小米盒子
  10. Struts2学习笔记(十七) 文件下载(File Download)
  11. 影像科dsa为什么必须买维修保险_DSA在医疗方面为什么重要?看这3点
  12. laravel 集合从父中移除_在 Laravel 7 中优雅使用 UUID 教程
  13. markdown模板
  14. 基于R语言的贝叶斯网络模型的实践技术
  15. ad软件画pcb方法总结_「ad」Altium Designer——AD画PCB图步骤总结 - seo实验室
  16. HTML教程笔记(菜鸟教程)
  17. mysql索引左倾_MySQL索引学习
  18. 用什么软件测试电视盒子真假,几十款电视盒子软件,只挑出6款神作,可消除一切看视频的阻碍!...
  19. 我的世界丛林风景Mac动态壁纸
  20. 微信小程序_map组件实现定位

热门文章

  1. linux 快速合并文本文件,Linux-Linux中高效合并文本文件的方法
  2. 最大连续子序列和(4种算法)
  3. NYOJ 570欧拉函数求和(欧拉函数数论入门)
  4. nyoj810 贪心的嘿嘿(想弄死这出题的)
  5. jq实现底部弹框_WPF MVVM 弹框之等待框
  6. 蓄电池单格电压多少伏_直流屏蓄电池电压的常见问题小结
  7. 【HDU5536】Chip Factory(01字典树+01字典树上删除某个数)
  8. 【python】Mac在Pycharm中导入python3.6(简单易行)
  9. STM32——库函数版——矩阵按键程序
  10. cydia无法安装卸载插件_【初识太极】CAD卸载不干净无法重新安装怎么办?