精华内容
下载资源
问答
  • 2022-01-26 07:58:56

    前言:本系列文章适合有初/中级.NET知识的同学阅读。
    (1)本系列文章,旨在讲述研发一个中大型项目所需要了解的一系列“基本构件”,并提供这些“基本构件”的【最简单】、【最快速】使用方法!!(并不深究技术原理)
    (2)通过阅读本系列文章,能让你在正规“项目研发”方面快速入门+进阶,并能达成“小团队构建大网站”的目的。
    (3)本系列文章采用的技术,已成功应用到人工智能、产业互联网、社区电商、游戏、金融风控、智慧医疗、等项目上。

    限时下载:
    nuget搜索关键字:DeveloperSharp.RabbitMQ

    RabbitMQ作为一款主流的消息队列工具早已广受欢迎。相比于其它的MQ工具,RabbitMQ支持的语言更多、功能更完善。

    本文提供一种市面上最/极简单的使用RabbitMQ的方式,只需要会调用以下三个方法,你就几乎可以掌握整个RabbitMQ的使用
    (1) SendMessage,发送一个消息
    (2) GetMessage,获取一个消息
    (3) UseMessage,使用一个消息(连续使用)

    为了调用以上三个方法,首先需要从nuget引用DeveloperSharp.RabbitMQ,并在App.config/Web.config里面添加如下配置:

      <appSettings>
        <add key="RabbitMQConnectionString" value="hostName=135.208.12.236,port=5672,userName=sa,password=aevin.gang" />
      </appSettings>
    
    

    说明:上述配置中分别设置了RabbitMQ应用所在的服务器IP地址hostName、端口port、用户名userName、密码password(请把这四项的对应值修改成你自己那边的RabbitMQ的对应值)

    下面,我们给出一个使用了上述SendMessage、GetMessage、UseMessage三个方法的示例。该示例的功能说明如下:

    • 先向RabbitMQ服务器上名为“aa”的队列发送了5个消息,
    • 然后从RabbitMQ服务器上的“aa”队列中获取,并打印出第1个消息,
    • 最后再连续从RabbitMQ服务器上的“aa”队列中获取剩余4个消息,并把它们写入名为fj.txt的文件。
      代码如下:
    using DeveloperSharp.RabbitMQ;
    --------------------------
    
            static void Main(string[] args)
            {
                //发送5个消息(使用SendMessage)
                RabbitMQHelper.SendMessage("aa", "世界1,你好!");
                RabbitMQHelper.SendMessage("aa", "世界2,你好!");
                RabbitMQHelper.SendMessage("aa", "世界3,你好!");
                RabbitMQHelper.SendMessage("aa", "世界4,你好!");
                RabbitMQHelper.SendMessage("aa", "世界5,你好!");
    
                //获取1个消息(使用GetMessage)
                string OneMessage = RabbitMQHelper.GetMessage("aa").Message;
                Console.WriteLine(OneMessage);
    
                //向fj.txt这个文本文件中写入4个消息(使用UseMessage)
                RabbitMQHelper.UseMessage("aa", t => 
                {
                    System.IO.File.AppendAllText("D:/fj.txt", t.Message);
                    return true;
                });
            }
    
    

    运行结果如下:
    【控制台显示出】:世界1,你好!
    【fj.txt文件中显示出】:世界2,你好!世界3,你好!世界4,你好!世界5,你好!

    三个方法的详细功能说明(辅助参考):

    1)发送一个消息
    void SendMessage(string QueueName, string Message, Dictionary<string, object> Header = null)2)获取一个消息
    RabbitMQMessage GetMessage(string QueueName)3)使用一个消息(连续使用)
    void UseMessage(string QueueName, Func<RabbitMQMessage, bool?> Use)
    附加说明:
        (I)Use返回值为true时,代表当前消息已被有效处理并会被服务器删除。然后程序自动进入下一条消息的使用。
             若Use返回值为false时,代表当前消息未被有效处理但仍会被服务器删除。然后程序自动进入下一条消息的使用。
             若Use返回值为null时,代表当前消息会被服务器重新队列分配到其它可用的实例上再处理。然后程序自动进入下一条消息的使用。
             若Use内部发生未被处理的异常,程序会停止。
        (II)RabbitMQMessage对象定义如下:
              public class RabbitMQMessage
              {
                 public string Message;
                 public IDictionary<string, object> Header;
                 public string Id; //此处系统自动生成的Id具有UUID的特性。
              }
        (III)RabbitMQMessage.Header字典中,实际值为string类型的object值,需要通过字节转换才能变为字符串。
               例如:Encoding.UTF8.GetString((byte[])p.Header["Content"])
    
    

    最后说明一点:一旦调用三个方法,会与RabbitMQ服务器建立“长链接”。若要结束“长链接”,可在“任务管理器”中杀死进程。

    使用消息服务对解耦分布式系统、实现发布/订阅、提高系统性能、等方面都有巨大用处,相信本文会扩展你的思维认知,让你在相关技术解决方案上有更多灵活思路+联想空间!

    【附注】:文章开头给出的下载示例,均已成功运行通过。但下载示例往往只包含“核心模板”内容,有些辅助内容需要自己建立/设置(比如:数据库创建、链接字符串设置、文件配置、路径设置、参数设定、等等…)。调式时若遇异常报错,请仔细阅读+理解本文。
    也随时欢迎联系作者,微信扫描文末二维码,获取更多技术支持!

    推荐阅读


    如果文章对你有帮助,请点赞、收藏、关注(原创内容,欢迎转载,转载请注明出处)
    出处:https://developersharp.blog.csdn.net/
    主页:http://www.365ey.net/
    【获取专业技术支持,点击下方名片联系作者】

    更多相关内容
  • 一个C#实现IBM WebSphere MQ 消息收发的实例,包含 发送接收等. 使用的时候只需要修改 appconfig 文件的内容即可. 如有问题.请留言
  • mq消息队列

    千次阅读 2022-01-07 16:07:06
    MQ 消息队列 学习-尚硅谷 1.1.什么是MQ MQ(messagequeue)a从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message而已,还是-种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是...

    MQ 消息队列 学习-尚硅谷

    1.1.什么是MQ

    MQ(messagequeue)a从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message而已,还是-种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游"逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。

    1.流量消峰:进行访问进行排队

    举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过-万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好。

    在这里插入图片描述

    2.应用解耦

    以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障,提升系统的可用性。

    在这里插入图片描述

    3.异步处理

    在这里插入图片描述

    有些服务间调用是异步的,例如A调用B, B需要花费很长时间执行,但是A需要知道B什么时候可
    以执行完,以前一般有两种方式,A过一段时间去调用B的查询api查询。或者A提供-个callback api,
    B执行完之后调用api通知A服务。这两种方式都不是很优雅,使用消息总线,可以很方便解决这个问题,
    A调用B服务后,只需要监听B处理完成的消息,当B处理完成后,会发送一条消息给 MQ, MQ会将此
    消息转发给A服务。这样A服务既不用循环调用B的查询api,也不用提供callback api。同样B服务也不
    用做这些操作。A服务还能及时的得到异步处理成功的消息。

    第1种.ActiveMQ

    优点:单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用性,消息可靠性较
    低的概率丢失数据
    缺点:官方社区现在对ActiveMQ 5.x维护越来越少,高吞吐量场景较少使用。

    第2种. Kafka

    大数据的杀手锏,谈到大数据领域内的消息传输,则绕不开Kafka,这款为大数据而生的消息中间件,
    以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥
    着举足轻重的作用。目前已经被LinkedIn, Uber, Twitter, Netlix等大公司所采纳。
    优点:性能卓越,单机写入TPS约在百万条/秒,最大的优点,就是吞吐量高。时效性ms级可用性非
    常高,kafka 是分布式的,-个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用,消费者采
    用Pull方式获取消息,消息有序,通过控制能够保证所有消息被消费且仅被消费-次;有优秀的第三方
    Kafka Web管理界面Kafka-Manager;在日志领域比较成熟,被多家公司和多个开源项目使用;功能支持:
    功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用
    缺点: Kafka 单机超过64个队列/分区,Load 会发生明显的飙高现象,队列越多, load越高,发送消
    息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试;支持消息顺序,
    但是一台代理宕机后,就会产生消息乱序,社区更新较慢;

    第3种. RocketMQ

    RocketMQ出自阿里巴巴的开源产品,用Java语言实现,在设计时参考了Kafka, 并做出了自己的一
    些改进。被阿里巴巴广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理, binglog 分发等场
    景。
    优点:单机吞吐量十万级,,可用性非常高,分布式架构,消息可以做到0丢失,MQ功能较为完善,还是分
    布式的,扩展性好,支持10亿级别的消息堆积,不会因为堆积导致性能下降,源码是java我们可以自己阅
    读源码,定制自己公司的MQ
    缺点:支持的客户端语言不多,目前是java及c++,其中c++不成熟;社区活跃度一般,没有在 MQ
    核心中去实现JMS等接口,有些系统要迁移需要修改大量代码

    第4种.RabbitMQ

    2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最
    主流的消息中间件之? -。
    优点:由于erlang语言的高并发特性,性能较好;吞吐量到万级,MQ功能比较完备,健壮、稳定、易
    用、跨平台、支持多种语言如: Python. Ruby、 .NET、 Java、 JMS、C、PHP、 ActionScript. XMPP、STOMP
    等,支持AJAX文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高
    https://www.rabbitmq.com/news.html
    缺点:商业版需要收费,学习成本较高

    MQ的选择

    在这里插入图片描述

    ActiveMQ 学习

    3、安装步骤

    3.1 官网下载
    3.2 /opt目录下面
    3.3解压缩apache activemq-5.15.9-bin. tar.gz
    3.4在根目录Fmkdir /myactiveMQ
    3.5 cp -r apache -activemq-5.15.9 /myactiveMQ/
    3.6普通启动mq: ./activemq start(开)/stop(关)
    3.7 activemq的默认进程端口是61616
    3.8复习查看后台进程的方法 :ps -ef|grep activemq | grep -v grep(去掉 本机自带的命令 );lsof 61616(查看端口号 是否存在,打印其内容)
    3.9带运行日志的启动方式(重要)
    在这里插入图片描述

    mysql的jdbc

    在这里插入图片描述

    订阅主体消费者(上手案例)

    (1)生产者将消息发布到topic中,每个消息可以有多个消费者,属于1: N的关系
    (2)生产者和消费者之间有时间上的相关性。订阅某一个主题的消费者只能消费自它订阅之后发布的消息。
    (3)生产者生产时,topic不保 存消息它是无状态的不落地,假如无人订阅就去生产,那就是一.条废消息,所以,一般

    先启动消费者再启动生产者:
    JMS规范允许客户创建持久订阅,这在- -定程度上放松了时间上的相关性要求。持久订阅允许消费者消费它在未处于激活状态时发送的消息.一句话,好比我们的微信公众号订阅。

    JMS规范

    在这里插入图片描述

    在这里插入图片描述

    消息头

    这里是引用

    消息体

    在这里插入图片描述

    1、生产者Dame

    package xyz.activemq;
    
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    import javax.jms.*;
    
    /**
     * @ClassName : JmsProduce  //类名
     * @Description : 第一次使用mq  //描述
     * @Author : W //作者
     * @Date: 2022/1/19  21:48
     */
    public class JmsProduce {
        private static final String DEFAULT_BROKER_HOST = "tcp://47.108.216.90:61616";
    
        // 消费创建者
        public static void main(String[] args) throws JMSException {
            // 1 创建连接工场,按照给定Mur地址, 采用欧认用户名和南码
            ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory (DEFAULT_BROKER_HOST);
            // 2 通过连接工场,获得连按connection 并启动访问
            Connection connection = activeMQConnectionFactory.createConnection ();
            connection.start ();
            // 3 创建会话session .
            // 两个参数, 第一个叫事务/第二个签收 DUPS_OK_ACKNOWLEDGE 允许重复消费  使用 CLIENT_ACKNOWLEDGE手动签收 要加 textMessage.acknowledge ();
            Session session = connection.createSession (true, Session.AUTO_ACKNOWLEDGE);
            // 4创造目的地
            Queue queue = session.createQueue ("国产007");
            // 5 创建消息生成者
            MessageProducer messageProducer = session.createProducer (queue);
            for (int i = 0; i < 5; i++) {
                TextMessage textMessage = session.createTextMessage ("msg----" + i);
                messageProducer.send (textMessage);
            }
            session.commit ();
            messageProducer.close ();
            session.close ();
            connection.close ();
        }
    }
    

    属性值

    JMS的可靠性:消息的持久性、事务、签收. 事务最大

    两大模式:一对一(Queue),一对多(Topic);

    // 开启事务
         Session session = connection.createSession (true, Session.AUTO_ACKNOWLEDGE);
    

    四. Spring / SpringBoot 整合 ActiveMQ

    1. 对 Spring 的整合
    1.1 所需jar 包

    <!--  activeMQ  jms 的支持  -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
        <version>4.3.23.RELEASE</version>
    </dependency>
    <dependency>    <!--  pool 池化包相关的支持  -->
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.15.9</version>
    </dependency>
    
    <!--  aop 相关的支持  -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.23.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.23.RELEASE</version>
    </dependency>
    

    1.2 写xml 文件 (applicationContext.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://camel.apache.org/schema/spring"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
    
        <context:commponent-scan base-package="com.at.activemq"/>
        <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"  destroy-method="stop">
            <property name="connectionFactory">
                <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                    <property name="brokerURL" value="tcp://192.168.17.3:61616"></property>
                </bean>
            </property>
            <property name="maxConnections" value="100"></property>
        </bean>
    
        <!-- 队列目的地 -->
        <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
            <constructor-arg index="0" value="spring-active-queue"></constructor-arg>
        </bean>
    
    
        <!--  jms 的工具类 -->
        <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
            <property name="connectionFactory" ref="jmsFactory"/>
            <property name="defaultDestination" ref="destinationQueue"/>
            <property name="messageConverter">
                <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
            </property>
        </bean>
    </beans>
    
    展开全文
  • MQ消息队列

    千次阅读 2022-02-22 10:27:16
    我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。 消息队列是分布式系统中重要的组件之一。使用消息队列主要是为了通过异步处理提高系统性能和削峰、...

    什么是消息队列

    我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。
    消息队列是分布式系统中重要的组件之一。使用消息队列主要是为了通过异步处理提高系统性能削峰降低系统耦合性

    通过异步处理提高系统性能(减少响应所需时间)

    在这里插入图片描述
    因为用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。因此使用消息队列进行异步处理之后,需要适当修改业务流程进行配合,比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就类似我们平时手机订火车票和电影票。

    削峰/限流

    先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。

    降低系统耦合性

    生产者(客户端)发送消息到消息队列中去,接受者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合, 这显然也提高了系统的扩展性。

    消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计

    另外为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其他服务器发布消息。

    使用消息队列带来的一些问题

    • 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!
    • 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题!
    • 一致性问题: 我上面讲了消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了!

    MQ 的常见问题有:

    消息的顺序问题
    消息的重复问题

    消息的顺序问题

    消息有序指的是可以按照消息的发送顺序来消费。

    解决:
    (1)保证生产者 - MQServer - 消费者是一对一对一的关系
    缺陷:

    • 并行度就会成为消息系统的瓶颈(吞吐量不够)
    • 不关注乱序的应用实际大量存在
    • 队列无序并不意味着消息无序 所以从业务层面来保证消息的顺序而不仅仅是依赖于消息系统,是一种更合理的方式。

    消息的重复问题

    造成消息重复的根本原因是:网络不可达

    消费端处理消息的业务逻辑保持幂等性只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现。利用一张日志表来记录已经处理成功的消息的 ID,如果新到的消息 ID 已经在日志表中,那么就不再处理这条消息。

    JMS vs AMQP

    在这里插入图片描述

    常见的消息队列对比

    在这里插入图片描述
    总结:

    • ActiveMQ 的社区算是比较成熟,但是较目前来说,ActiveMQ 的性能比较差,而且版本迭代很慢,不推荐使用。
    • RabbitMQ 在吞吐量方面虽然稍逊于 Kafka 和 RocketMQ ,但是由于它基于 erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为 RabbitMQ 基于 erlang 开发,所以国内很少有公司有实力做erlang源码级别的研究和定制。如果业务场景对并发量要求不是太高(十万级、百万级),那这四种消息队列中,RabbitMQ 一定是你的首选。如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
    • RocketMQ 阿里出品,Java 系开源项目,源代码我们可以直接阅读,然后可以定制自己公司的MQ,并且 RocketMQ 有阿里巴巴的实际业务场景的实战考验。RocketMQ 社区活跃度相对较为一般,不过也还可以,文档相对来说简单一些,然后接口这块不是按照标准 JMS 规范走的有些系统要迁移需要修改大量代码。还有就是阿里出台的技术,你得做好这个技术万一被抛弃,社区黄掉的风险,那如果你们公司有技术实力我觉得用RocketMQ 挺好的
    • Kafka 的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。同时 kafka 最好是支撑较少的 topic 数量即可,保证其超高吞吐量。kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集。
    展开全文
  • 消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到...
  • MQ消息队列的优缺点介绍以及对比选型

    千次阅读 多人点赞 2021-10-21 11:38:09
    详细介绍了MQ消息队列的有点和缺点,以及MQ消息队列的选型。

    详细介绍了MQ消息队列的有点和缺点,以及MQ消息队列的选型。

    MQ,即Message queue,也就是消息队列,就是一个保存消息的容器。队列是一种先进先出的数据结构,消息队列也是如此,生产者将消息按顺序放入队列,消费者在消费消息时也是按照顺序来取出的。

    1 MQ的好处

    使用消息队列的核心功能有三个:异步、削峰、解耦。

    1.1 异步

    通过消息队列异步处理可以提高系统性能,减少响应所需时间。

    如果一个接口的业务比较复杂,可以分为很多步,比如在主业务走完之后,还需要发邮件、发短信、记录日志之类的。如果按照传统处理逻辑等所有的业务处理完毕再返回的话,可能会让用户等个1s以上。互联网类的企业,对于用户直接的操作,一般要求是每个请求都必须在 200 ms 以内完成,对用户几乎是无感知的,因为每次操作等1s是不可接受的。

    如果使用MQ,在本系统的主业务处理完毕之后,将其他的非主要业务逻辑发送到消息队列中就直接返回,然后由消息队列的消费者端异步的获取消息并且做相应的业务逻辑,这样就能对用户的请求进行快速的响应,提升用户体验度。

    1.2 解耦

    通过消息队列可以实现服务之间的解耦,降低系统耦合性,提升系统扩展性。

    假设在A服务的某个接口调用成功之后需要通知B、C服务,原始的做法就是B、C服务提供一个接口,然后A服务的最后调用B、C服务的接口(比如Dubbo调用,或者Rest调用)。

    上面的做法导致A和B、C服务严重耦合,当A不需要通知B、C服务,或者B、C的接口有变化、或者A需要增加通知D服务时,都需要修改代码。

    MQ采用Pub/Sub发布-订阅模式工作,使用MQ之后,A 系统在产生一条数据发送到 MQ 里面去,哪个系统需要数据就自己去 MQ 里面消费。生产者不知道谁会消费以及具体怎么消费,消费者也不知道消息是谁生产的。A系统就不需要维护这么多对其他系统的调用,实现了系统间的解耦,提升了系统的扩展性。

    1.3 削锋

    如果你的服务器最多的QPS为5000,对于某个接口的调用,可能平时只有1000个并发,那么自然是没问题的,但是在准时秒杀、促销等特殊活动的时候,接口可能达到了10000个并发,那么突然多出了5000个请求,这时你的服务器肯定扛不住而崩溃了。

    如果使用MQ,将到来的请求先放入队列里面,然后再消费者端以一定的速度去消费它们,这个速度以你的服务器的QPS决定,当有超过服务器QPS的请求过来时,不能处理的请求都积压在了MQ中,虽然可能会导致请求的响应变慢,但是不至于打垮服务器。因为即使是一些大厂、大电商,它们在做活动的时候,用户也会感觉请求明显变慢,这是允许的。

    2 MQ的问题

    2.1 系统可用性降低

    引入MQ之后,需要考虑到MQ挂掉的情况,如果MQ服务不可用,那么整个系统几乎就不可用了,系统可用性在某种程度上降低。

    我们需要保证MQ高可用。

    2.2 系统复杂性提高

    加入MQ之后,需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题,系统复杂性提高。

    上面这些问题我们都要解决。

    2.3 数据一致性问题

    使用MQ确实具有异步和解耦等好处,但是却带来了数据一致性的问题,生产者发送消息成功后就返回了,那要是消费者消费失败了怎么办呢?如果某个生产者写库失败了,那么数据就不一致了,只有所有的服务都成功才能算这一次请求是成功的。

    我们可以使用分布式事务解决数据一致性问题。

    3 消息队列的选型

    目前在市面上比较主流的消息队列中间件主要有,Kafka、ActiveMQ、RabbitMQ、RocketMQ 等这几种。

    网上找的对比图如下:

    在这里插入图片描述

    ActiveMQ是一款很早的MQ,之前是很火的,但是由于吞吐量不高,并且数据安全性也不够,现在已经够很少有新项目用了。

    RabbitMQ基于AMQP协议来实现,AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅),消息可靠性高,基本不会丢失消息,消息延时很低,达到微秒级,基于Push的模式来处理消息消费,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。但由于RabbitMQ是使用Erlang语言开发的,目前国内很少有公司在做Erlang语言的深入研究,这必然导致二次开发-维护的成本更高,公司很难掌控,加上吞吐量也不高,现在国内已经够很少使用了。

    RocketMQ是阿里开源的消息中间件,目前归属于Apache顶级项目。具有高吞吐量、高可用性、适合大规模分布式系统应用的特点,基于Pull的模式来处理消息消费。在国内它被阿里以及其他公司大量使用,并且它是纯Java开发的,对于Java工程师来说比较好深入了解。

    Kafka使用Scala语言开发,是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。核心功能比较少,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。目前在世界范围内,Kafka都可以算作消息队列的标杆。

    Kafka和RocketMQ都是天然的分布式架构,能够做到高可用,多个副本的数据也能做到0丢失,但是ActiveMQ和RabbitMQ却不是分布式架构。

    ActiveMQ和RabbitMQ的GatHub社区活跃度也不如RocketMQ和Kafka。

    如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

    展开全文
  • 适合新手入门学习MQ消息队列,并通过最基本的方式实现p2p模式的消息传递,让新手了解mq最底层的实现方式,方便理解过程。
  • IBMMQ消息队列源码

    2017-04-24 09:42:51
    IBMMQ消息队列源码
  • MQ消息队列实例

    2017-05-05 16:49:11
    Java向MQ发送消息三种方式
  • RabbitMQ) 主要角色首先我们必须需要搞明白MQ (消息队列)中的三个基本角色ProducerBrokerConsumer整体架构如下所示 自定义协议首先从上一篇中介绍了协议的相关信息,具体厂商的MQ(消息队列)需要遵循某种协议或者...
  • 主要介绍了使用MQ消息队列的优缺点详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • MQ消息队列概述及主流MQ分析

    千次阅读 2022-04-12 15:53:21
    MQ是什么? 为什么要使用MQ 主流mq有哪些
  • 主要介绍了PHP使用php-resque库配合Redis实现MQ消息队列的教程,将展示php-resque的安装部署及一个Worker队列的运行过程,需要的朋友可以参考下
  • 打开“WebSphere MQ资源管理器”,新建队列管理器,名称为A_dlglq_name(服务器端mq队列管理器名称),其余采用默认设置; 2、创建本地队列 在A_dlglq_name(服务器端mq队列管理器名称)队列管理器中创建本地队列,名称...
  • MQ 是一款稳定、安全又可靠的消息传递中间件。它使用消息队列来支持应用程序、系统、服务和文件之间的信息交换。它可以简化和加速多个平台中不同应用程序和业务数据的集成。支持各种 API 和语言,并可以在本地、...
  • 目前在业界有哪些比较知名的消息引擎呢?如下图所示 这里面几乎完全列举了当下比较知名的消息引擎,包括: ZeroMQ 推特的Distributedlog ActiveMQ:Apache旗下的老牌消息引擎 RabbitMQ、Kafka:AMQP的默认...
  • 基于Go实现的分布式MQ消息队列
  • MQ消息队列使用场景

    万次阅读 多人点赞 2017-12-19 14:09:33
    一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,...
  • MQ消息队列常用命令

    千次阅读 2019-12-16 10:02:23
    MQ常用命令 ** 创建队列管理器 crtmqm qmgrname 删除队列管理器 dltmqm [-z] qmgrname 启动队列管理器 strmqm qmgrname 停止队列管理器 endmqm –i QmgrName 立即停止 endmqm –p QmgrName 强制停止 显示队列管理器 ...
  • 作为中间件,消息队列是分布式应用间交换信息的重要组件。消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走。通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理...
  • PHP使用MQ消息队列

    千次阅读 2020-02-02 23:04:36
    消费队列数据代码 /** * MQ消费数据 监视数据 * @param $queueName 队列名称 * @name MqConsumer * @author Admin * @return */ public function mqConsumer(){ try{ $queueName = $this->getx('queue' , 'complex_...
  • mq(4)—消息队列Mq提供一个9p文件树,该树表示通过标准read(2)和write(2)文件I / O接口可访问的多个读取器和写入器的缓冲双向数据流组。 概述流可以在任意文件树结构中进行组织,该文件树结构提供了命名空间和...
  • MQ消息队列学习教程

    2013-12-03 13:49:08
    通过文档学习 了解MQ基本原理 和基本配置实用
  • MQ消息队列在IM即时通讯的用途 1)用户聊天消息的离线存储环节:因为IM消息的发送属于高吞吐场景,直接操作DB可能会让DB崩溃,所有离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地...
  • IBMMQ消息队列整合

    2017-04-24 09:30:50
    java IBM消息队列整合

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,559
精华内容 37,823
关键字:

mq消息队列

友情链接: Zxx01_15.zip