消息队列MQ

1 消息队列概述

1.1 消息队列MQ 全称:Message Queue

消息队列是应用程序与应用程序之间的通信方法,也可以理解为项目之间的通信方法

  • 项目之间为什么要使用消息队列呢?
    在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大节省了服务器的请求响应时间,从而提高了系统的吞吐量。
    这个异步处理的意思就是:我们在一个系统中,发一个消息到MQ,然后再由另外一个系统从MQ中去取出来消息,系统相互之间是不知道的,所以叫异步处理。异步处理因为不需要等待,所以提高了系统的吞吐量。
  • 开发中消息队列的使用场景:
    1、任务异步处理
    将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
    2、应用程序解耦合
    MQ相当于一个中介(其实它叫中间件,因为它是介于生产者与消费者之间的一个组件。),生产方通过MQ与消费方交互,它将应用程序进行解耦合。
    因为生产方不知道消费方的存在,所以它根本无法去调用消费方,即无法去调用这个项目的代码,通过发消息取消息,从而实现项目之间的解耦合。

1.2 AMQP 和 JMS

消息队列两种常见的实现方式:AMQP和JMS
MQ是消息通信的模型;实现MQ大致有两种主流方式:AMQP、JMS

1.2.1 AMQP

AMQP是一种协议,更准确的说是一种binary write-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。
也就是说它没有指定说你应该要怎么样去利用某一个方法或某一个类去怎么操作,它只是定义了这个数据的格式。

1.2.2 JMS

JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

1.2.2 AMQP 和 JMS 区别
  • JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交换的格式
  • JMA限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的
  • JMS规定了两种消息模式(其实不是两种,只是大范围上这么划分);而AMQP的消息模式更加丰富

1.3 消息队列产品

市场上常见的消息队列有如下:

  • ActiveMQ:Java语言写的,基于JMS实现的一个消息队列,用的比较广,模式较少,比较简单实用
  • ZeroMQ:基于C语言开发,比较小巧,速度操作非常快
  • RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好,应用比较广。本次要讲的消息中间件
  • RocketMQ:基于JMS,阿里巴巴产品,阿里巴巴的消息队列中间件,已经贡献给Apache开源基金会组织,成为一个顶级的开源项目
  • Kafka:类似MQ的产品;用在分布式消息系统,或是高吞吐量的场景,一般用在大数据的项目中去采集和传输数据

1.4 RabbitMQ

RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。
不管是不是分布式系统,都可以使用消息队列,只是在分布式系统中,消息队列的应用更加广泛一些
RabbitMQ官方地址:http://www.rabbitmq.com/

RabbitMQ提供了6中模式:简单模式,work模式(工作队列模式),Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程调用,不太算MQ,不太算一般的消息队列模式,它是一个远程服务调用,不做介绍)
官网对应模式介绍:https://www.rabbitmq.com/getstarted.html

小结:
1、什么是消息队列?
消息队列是应用程序之间的通信方法。
2、为什么使用消息队列?
无需即时返回的且耗时的操作进行异步处理,从而提高系统的吞吐量,可以实现程序之间的解耦合。
因为生产者不知道消费者的存在,更加不可能做到去调用代码,所以他们之间是可以实现程序解耦合的。
3、实现方式有哪些?
常见的实现方式:AMQP、JMS
AMQP是协议,JMS是API接口。主要区别是JMS是在Java平台中使用的,AMQP不限制语言。
4、常见消息队列产品有哪些?
ActiveMQ
ZeroMQ
RabbitMQ
RocketMQ
Kafka(一般用在大数据的项目中,采集和传输数据)

rabbitmq和rocketmq的区别
rabbitmq不保证消息的顺序性,rocketmq可以有顺序
– rabbitmq顺序性解决方案:保证 生产者 - broker - queue - 消费者 是一对一对一对一的关系,但是这样性能瓶颈就有了
– rocketmq的解决方案:使用订单号来做取模操作,这样保证同一个订单号的消息,会被发送到同一个队列中
rabbitmq和rocketmq都不保证消息不重复,由消息消费者自己去做幂等判断或者记录消息的id来做去重判断
rabbitmq和rocketmq均会持久化消息到磁盘
rabbitmq的消费者拿到消息处理成功后会发送回执(ack)给到broker,而rocketmq仅仅只是知道消息是否发送成功
rabbitmq不支持事务,而rocketmq支持事务(可以用来解决分布式事务)
rabbitmq本身不支持消息重试(可以使用死信队列来重新消费队列),rocketmq支持消息重试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值