搞懂消息队列基本概念,异步处理,削峰/限流,降低系统耦合性、消息队列一致性问题、JMS VS AMQP、常见的消息队列对比

一、 什么是消息队列

  • 把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。

二、为什么要用消息队列

通常来说,使用消息队列能为我们的系统带来下面三点好处:(结合项目)

  1. 通过异步处理提高系统性能(减少响应所需时间)。
  2. 削峰/限流
  3. 降低系统耦合性。

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

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

2.2 削峰/限流

  1. 转移:先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。
  2. 用途:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。

转移压力:

2.3 降低系统耦合性

  • 把用户请求扔到消息队列中:
  • 消息队列使用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 从上图可以看到消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,
  • 对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。
  • 安全性:为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。

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

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

四、JMS VS AMQP

JMS(JAVA Message Service,java 消息服务)API 是一个消息服务的标准或者说是规范,它使分布式通信耦合度更低,消息服务更加可靠以及异步性。

JMS的两种消息模型

① 点到点(P2P)模型

② 发布/订阅(Pub/Sub)模型

发布订阅模型(Pub/Sub) 使用主题(Topic)作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息广播之后才订阅的用户则是收不到该条消息的。

正文格式:允许你发送并接收以一些不同形式的数据:

  • StreamMessage -- Java 原始值的数据流
  • MapMessage--一套名称-值对
  • TextMessage--一个字符串对象
  • ObjectMessage--一个序列化的 Java 对象
  • BytesMessage--一个字节的数据流

AMQP(消息模型跟JMS不一样)

AMQP,即 Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准 高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准。

为面向消息的中间件设计,兼容 JMS。基于此协议的客户端与消息中间件传递消息,不受客户端/中间件同产品,不同的开发语言等条件的限制。

JMS vs AMQP

  • AMQP 为消息定义了线路层(wire-level protocol)的协议,而 JMS 所定义的是 API 规范。
  • 在 Java 体系中,多个 client 均可以通过 JMS 进行交互,不需要应用修改代码,但是其对跨平台的支持较差。而 AMQP 天然具有跨平台、跨语言特性。
  • JMS 支持 TextMessage、MapMessage 等复杂的消息类型;而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)。
  • 由于 Exchange 提供的路由算法,AMQP 可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持 队列 和 主题/订阅 方式两种。

五 常见的消息队列对比

吞吐量:kafka和RocketMQ 比 RabbitMQ大一个数量级

可用性:都是高可用,kafka和RocketMQ基于分布式结构,一个数据多个副本,少数机器宕机会不会丢失数据而不可用

时效性:RabbitMQ基于erlang开发,并发能力很好,达到微妙级

功能支持:kafka功能简单,支持简单MQ功能,在大数据领域的实时计算以及日志采集被大规模使用

可靠性:kafka和RocketMQ丢失可能性低,理论上不会丢失

选择:

  1. 如果业务场景对并发量要求太高(十万级、百万级)RabbitMQ 一定是你的首选。
  2. 如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
  3. Kafka 的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。
  4. kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值