精华内容
下载资源
问答
  • MQ消息队列

    2016-04-05 10:54:23
    MQ消息队列
  • mq消息队列

    2007-12-10 16:04:24
    MQ消息队列的java应用
  • 消息队列(MQ,Message Queue)在消息数据传输中的保存作用为数据通信提供了保障和实时处理上的便利,这里我们就来看一下Python中线程的MQ消息队列实现以及消息队列的优点解析
  • IBMMQ消息队列源码

    2017-04-24 09:42:51
    IBMMQ消息队列源码
  • Spring Boot整合Rabbit MQ消息队列(一)

    万次阅读 2020-08-19 10:45:37
    消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程则可以从消息队列中读走消息,而消息队列就是在消息的传输过程中保存消息的容器,你可以简单的把消息队列理解为类似...

    综合概述

    消息队列

    消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程则可以从消息队列中读走消息,而消息队列就是在消息的传输过程中保存消息的容器,你可以简单的把消息队列理解为类似快递柜,快递员(消息发布者)往快递柜(消息队列)投递物件(消息),接受者(消息订阅者)从快递柜(消息队列)接收物件(消息),当然消息队列往往还包含一些特定的消息传递和接收机制。

    消息队列作为分布式系统中重要的组件,可以有效解决应用耦合,异步消息,流量削锋等系列问题,有利于实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等,各种消息队列也都各有特点,比如Kafka提供高性能、高吞吐量,但可靠性有所欠缺,所以比较适合像日志处理这类对性能要求高但对可靠性要求没那么严格的业务,再比如RabbitMQ支持了各种协议,实现较为臃肿,性能和吞吐量都一般,但却提供了很好的可靠性,比较适合像银行金融一类对可靠性要求较高的业务。

    应用场景

    以下简单介绍几个消息队列在实际应用中的使用场景(以下场景资料引用自网络)。

    1 异步处理

    场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式

    (1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

     

    (2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间

     

    假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。

    因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100)

    小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢?

    引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:

     

    按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍

    2 应用解耦

    场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图

     

    传统模式的缺点:

    • 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败

    • 订单系统与库存系统耦合

    如何解决以上问题呢?引入应用消息队列后的方案,如下图:

     

    • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功

    • 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作

    • 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦

    3 流量削锋

    流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛

    应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

    • 可以控制活动的人数

    • 可以缓解短时间内高流量压垮应用

     

    • 用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面

    • 秒杀业务根据消息队列中的请求信息,再做后续处理

    4 日志处理

    日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。架构简化如下

     

    • 日志采集客户端,负责日志数据采集,定时写受写入Kafka队列

    • Kafka消息队列,负责日志数据的接收,存储和转发

    • 日志处理应用:订阅并消费kafka队列中的日志数据

    以下是新浪kafka日志处理应用案例:

     

    (1)Kafka:接收用户日志的消息队列

    (2)Logstash:做日志解析,统一成JSON输出给Elasticsearch

    (3)Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能

    (4)Kibana:基于Elasticsearch的数据可视化组件,超强的数据可视化能力是众多公司选择ELK stack的重要原因

    5 消息通讯

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

    点对点通讯:

     

    客户端A和客户端B使用同一队列,进行消息通讯。

    聊天室通讯:

     

    客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。

    以上实际是消息队列的两种消息模式,点对点或发布订阅模式。模型为示意图,供参考。

    Rabbit MQ

    AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦和通讯。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性和安全。

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

     

    接下来,我们先来了解几个相关概念(以下相关介绍资料引用自网络)。

    ConnectionFactory、Connection、Channel

    ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。ConnectionFactory为Connection的制造工厂。 Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。

    Queue

    Queue(队列)是RabbitMQ的内部对象,用于存储消息。

    RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费。

    生产者Send Message “A”被传送到Queue中,消费者发现消息队列Queue中有订阅的消息,就会将这条消息A读取出来进行一些列的业务操作。这里只是一个消费正对应一个队列Queue,也可以多个消费者订阅同一个队列Queue,当然这里就会将Queue里面的消息平分给其他的消费者,但是会存在一个一个问题就是如果每个消息的处理时间不同,就会导致某些消费者一直在忙碌中,而有的消费者处理完了消息后一直处于空闲状态,因为前面已经提及到了Queue会平分这些消息给相应的消费者。这里我们就可以使用prefetchCount来限制每次发送给消费者消息的个数。详情见下图所示:

    这里的prefetchCount=1是指每次从Queue中发送一条消息来。等消费者处理完这条消息后Queue会再发送一条消息给消费者。

    Message acknowledgment

    在实际应用中,可能会发生消费者收到Queue中的消息,但没有处理完成就宕机(或出现其他意外)的情况,这种情况下就可能会导致消息丢失。为了避免这种情况发生,我们可以要求消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除;如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,则RabbitMQ会将该消息发送给其他消费者(如果存在多个消费者)进行处理。这里不存在timeout概念,一个消费者处理消息时间再长也不会导致该消息被发送给其他消费者,除非它的RabbitMQ连接断开。 这里会产生另外一个问题,如果我们的开发人员在处理完业务逻辑后,忘记发送回执给RabbitMQ,这将会导致严重的bug——Queue中堆积的消息会越来越多;消费者重启后会重复消费这些消息并重复执行业务逻辑…

    另外pub message是没有ack的。

    Message durability

    如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。但依然解决不了小概率丢失事件的发生(比如RabbitMQ服务器已经接收到生产者的消息,但还没来得及持久化该消息时RabbitMQ服务器就断电了),如果我们需要对这种小概率事件也要管理起来,那么我们要用到事务。由于这里仅为RabbitMQ的简单介绍,所以这里将不讲解RabbitMQ相关的事务。

    Exchange

    首先明确一点就是生产者产生的消息并不是直接发送给消息队列Queue的,而是要经过Exchange(交换器),由Exchange再将消息路由到一个或多个Queue,当然这里还会对不符合路由规则的消息进行丢弃掉,这里指的是后续要谈到的Exchange Type。那么Exchange是怎样将消息准确的推送到对应的Queue的呢?那么这里的功劳最大的当属Binding,RabbitMQ是通过Binding将Exchange和Queue链接在一起,这样Exchange就知道如何将消息准确的推送到Queue中去。简单示意图如下所示:

            

    在绑定(Binding)Exchange和Queue的同时,一般会指定一个Binding Key,生产者将消息发送给Exchange的时候,一般会产生一个Routing Key,当Routing Key和Binding Key对应上的时候,消息就会发送到对应的Queue中去。那么Exchange有四种类型,不同的类型有着不同的策略。也就是表明不同的类型将决定绑定的Queue不同,换言之就是说生产者发送了一个消息,Routing Key的规则是A,那么生产者会将Routing Key=A的消息推送到Exchange中,这时候Exchange中会有自己的规则,对应的规则去筛选生产者发来的消息,如果能够对应上Exchange的内部规则就将消息推送到对应的Queue中去。那么接下来就来详细讲解下Exchange里面类型。

    Exchange Types

    • fanout

            fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。

           

        上图所示,生产者(P)生产消息1将消息1推送到Exchange,由于Exchange Type=fanout这时候会遵循fanout的规则将消息推送到所有与它绑定Queue,也就是图上的两个Queue最后两个消费者消费。

    • direct

            direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中

             

         当生产者(P)发送消息时Rotuing key=booking时,这时候将消息传送给Exchange,Exchange获取到生产者发送过来消息后,会根据自身的规则进行与匹配相应的Queue,这时发现Queue1和Queue2都符合,就会将消息传送给这两个队列,如果我们以Rotuing key=create和Rotuing key=confirm发送消息时,这时消息只会被推送到Queue2队列中,其他Routing Key的消息将会被丢弃。

    • topic

          前面提到的direct规则是严格意义上的匹配,换言之Routing Key必须与Binding Key相匹配的时候才将消息传送给Queue,那么topic这个规则就是模糊匹配,可以通过通配符满足一部分规则就可以传送。它的约定是:

    1. routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
    2. binding key与routing key一样也是句点号“. ”分隔的字符串
    3. binding key中可以存在两种特殊字符“*”与“#”,用于做模糊匹配,其中“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

          

      当生产者发送消息Routing Key=F.C.E的时候,这时候只满足Queue1,所以会被路由到Queue中,如果Routing Key=A.C.E这时候会被同是路由到Queue1和Queue2中,如果Routing Key=A.F.B时,这里只会发送一条消息到Queue2中。

    • headers

            headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
    在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。

    展开全文
  • 安装MQ消息队列的博客挺多的,随便找找都是这个就不说明了 打开MQ消息队列控制面试的挺少,有时候突然迷糊了,找不到控制台。百度了一下,都是一些安装MQ消息队列的文章,所以记录一下打开MQ消息队列的方法。 win+R...

    安装MQ消息队列的博客挺多的,随便找找都是这个就不说明了

    打开MQ消息队列控制面试的挺少,有时候突然迷糊了,找不到控制台。百度了一下,都是一些安装MQ消息队列的文章,所以记录一下打开MQ消息队列的方法。

    1. win+R键打开运行,输入mmc打开控制台
    2. 左边有一个树形图,控制台根节点,看下列表中是否存在 【 计算机管理(本地)】
    3. 不存在就选择 文件-> 添加或删除管理单元 ->选择计算机管理(本地)->确定
    4. 左边树形菜单选择 计算机管理(本地) -> 服务和应用程序 ->消息队列
    展开全文
  • MQ消息队列介绍

    2019-06-29 13:33:21
    MQ消息中间件 --》RocketMQ --》MQ消息队列介绍 在学习消息队列前有必要了解一下它。知己知彼才能百战不殆 为什么突然就写这个技术的博客了呢,是因为项目需要引入MQ,负责MQ落地,所以就好好的研究下。 当然也...

    今天的博客主题

          MQ消息中间件 --》RocketMQ --》MQ消息队列介绍


    在学习消息队列前有必要了解一下它。知己知彼才能百战不殆

    为什么突然就写这个技术的博客了呢,是因为项目需要引入MQ,负责MQ落地,所以就好好的研究下。

    当然也要吧学习的步骤记录下来

     

    消息队列

    Message Queue (消息队列)简称MQ。

    可以看做它是服务与服务的一种通信方式。

    这个消息就是它们通信的内容,可以是简短的文本字符,也可以是复杂的对象嵌套。

    这个队列就是在服务与服务中间的一个协调者(中间人),那么这个协调者也有一个名词就是“消息中间件”

     

    消息中间件

    消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。

    通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

    这个中间件可以进行即时通讯,也可以进行异步通讯。

    消息中间件肯定是面向消息的中间件(Message-Oriented Middleware MOM )

    这个图可以说就是一个简单的消息队列一个处理流程。当然在实际的使用过程,不是这样的。

    我们要保证消息队列的的高可用,保证消息的可靠性/顺序性,保证消息不被重复消费等等一系列的因素要考虑进去。

    如果对于这个很难是理解,切入一个生活中的例子。

    从某宝某东买东西,和卖家沟通完成下单了。卖家发货(卖家就是一个消息的生产者),发货要通过快递公司发快递啊(快递公司就是消息队列)你在这边等着收货,快递员告诉你有个快递过来取一下(你就成了这个消息的消费者)。这样整个一个流程下来是不是和上边的就一样了。

    只是融入到实际项目中我们要考虑的因素众多。

    网上所找的消息队列介绍都是很长一段话,对于新接触MQ的小白是很难理解的。

    我这里也有摘抄,但是不理解的内容一点不抄。

    这里只是简单介绍了消息队列,了解了一个消息队列的概念。

    但是为什么用MQ?MQ能干什么?什么时候用?用了有什么影响吗?优点在哪?缺点在哪?MQ产品众多怎么选择?又一无所知》。。

    来吧,开启MQ之旅....

     

    为什么用MQ?

    当有了场景才会用MQ,那什么场景下用呢?

    四个主要的场景,当然还有其他的。

    场景一:

    解耦,降低系统与系统之间的耦合性。

    场景二

    异步,减少非必要性的业务逻辑处理时间。

     

    场景三

    削峰,降低系统并发量所带来的一系列问题

     

    场景四

    保证数据一致性

     

    MQ能干什么?

    通过上面的场景介绍那MQ能干什么不就得知了吗?

    降低系统之间的耦合性

    减少业务处理时间

    缓解并发为数据库带来的压力

    保证数据的一致性

    当然除了列出来这些还可以做一些别的。

     

    什么时候用MQ呢?

    这个就好说了啊,当你设计的系统出现可如上所描述的情况,那就需要加入MQ或者别的技术来解决系统中出现的问题。

     

    加入MQ有什么影响么?

    影响肯定会有的。

    假如你的系统正常运行没问题,引入了一个消息队列进来,结果消息队列挂了,那你的服务系统不也就挂了。

    本来是想解决问题,没想到创造问题出来了。

    加入消息队列之后,考虑的因素都考虑到了吗?消息对列的可用性?数据一致性?数据不被重复消费?这样一来

    系统的复杂度就高了。

    所以说当给项目引入一个新技术的时候,一定要对这个技术的弊端有充分的了解,才能预防突发问题,不挖坑出来。

     

    那MQ优缺点是什么呢?

    上边列出的场景都是MQ的优点

    解耦、异步、削峰、保证数据一致性

    有影响的就是缺点喽

    降低系统可用性、增加系统复杂性

     

    MQ如何选型?

    现在的MQ产品众多比如 ActiveMQ、RabbitMQ、RocketMQ、kafka等等,这些比较知名的,还有一些别的MQ,也有再用。

    通过对比在进行逐个分析

    产品

    ActiveMQ

    RabbitMQ

    RocketMQ

    Kafka

    开发语言

    Java

    Erlang

    Java

    Scala

    单机吞吐量

    万级

    万级

    十万级

    十万级

    协议和规范

    OpenWire, STOMP, AMQP, MQTT, JMS

    AMQP

    TCP, JMS, OpenMessaging

    TCP

    时效性

    MS

    US

    MS

    MS

    可用性

    高(主从架构)

    高(主从架构)

    非常高(分布式架构)

    非常高(分布式架构)

    消息跟踪

    不支持

    支持

    支持

    不支持

    消息持久化

    支持

    支持

       

    消息存储

    支持使用JDBC和高性能日志(如LEVELDB、KAHADB)快速持久化

    DISC和RAM

    高性能和低延迟文件存储

    高性能文件存储

    特性

    产品成熟,在很多公司得到应用;有较多的文档;各种协议支持较好

    基于erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富

    各个环节分布式扩展设计,主从 HA;支持上万个队列;多种消费模式;性能很好

    只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广

    做大数据或者日志采集首选Kafka。

    RabbitMQ开发语言是Erlang,而对这个语言熟悉的人不是太多,虽然是开源,但是语言是障碍,学起来比较吃力。对于一些有能力的公司可选。支持消息持久化。

    ActiveMQ久远的一个开源项目,用的比较多,比较成熟,文档多学起来较容易。没有经过很高的验证,有反应数据会丢失。实现JMS协议。同样支持消息持久化。

    RocketMQ阿里自主研发的中间件,在双十一应该会拿出来使用的哈,稳定性比较强了就,数据理论上不会丢失掉。

    当然这些只是一些简单对比,如果真要慎选的话那就通过综合实力来选。

    比如从MQ的可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统等等这些去分析。

    反正都是各有优点,还是要依据系统需求而选。

     

    以至于在引入MQ到系统中对于引发的一些问题,我们要从选的MQ上进行解决

    比如

    如何保证消息队列是高可用的?

    如何保证消息不被重复消费?

    如何保证消费的可靠性传输?

    如何保证消息的顺序性?

    如何保证消息的幂等性?

    这些问题都是我们在选择了某MQ之后,所需要研究的。

     

    结束语

    说到这里是不是就能知道MQ是做什么的了吧?如果还不知道,请把你的疑问评论下方》。。

     

     

    展开全文
  • MQ消息队列简要

    2019-12-23 16:34:00
    MQ消息队列 什么是消息队列 消息队列就像是一个放东西的容器,当我们需要读取消息的时候就自己取出来供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是通过异步处理提高系统性能和削锋、降低系统...
  • 主要介绍了使用MQ消息队列的优缺点详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 基于Go实现的分布式MQ消息队列
  • MQ消息队列的作用

    2020-06-27 10:48:20
    MQ消息队列的作用解耦广播削峰流控 解耦 解耦是消息队列要解决的最根本的问题。 广播 消息队列的基本功能之一是消息广播。 有了消息队列,我们只需要关心消息是否送达了队列,具体谁在订阅,有几个订阅是下游的事情...
  • 消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一。 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要。 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具备...
  • 初识MQ消息队列

    2018-06-29 12:38:00
    MQ 消息队列  消息队列(Message Queue)简称MQ,是阿里巴巴集团中间件技术部自主研发的专业消息中间件。产品基于高可用分布式集群技术,提供消息发布订阅、消息轨迹查询、定时(延时)消息、资源统计、监控报警等一...
  • 最全MQ消息队列有哪些 那么目前在业界有哪些比较知名的消息引擎呢?如下图所示 这里面几乎完全列举了当下比较知名的消息引擎,包括: ZeroMQ 推特的Distributedlog ActiveMQ:Apache旗下的老牌消息引擎 Rabbit...
  • 适合新手入门学习MQ消息队列,并通过最基本的方式实现p2p模式的消息传递,让新手了解mq最底层的实现方式,方便理解过程。
  • MQ消息队列--学习笔记

    2020-06-19 17:56:31
    MQ消息队列--学习笔记什么是消息队列为什么需要消息队列主流中间件的优缺点二级目录消息队列带来的问题 什么是消息队列 直白来说就是对消息进行排列,把接收到的请求按照先后顺序进行排列 为什么需要消息队列 服务器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,925
精华内容 3,970
关键字:

mq消息队列