资讯专栏INFORMATION COLUMN

简述消息队列在电商系统使用场景以及工作模式

Honwhy / 1354人阅读

摘要:概述概述消息队列,是分布式系统中重要的组件,是一种进程间通信或者是同一进程的不同线程的通信方式。消息队列的使用场景消息队列的使用场景异步处理流量控制应用解耦应用解耦应用解耦消息队列的一个作用就是实现系统应用之间的解耦。

概述

消息队列(Message Queue),是分布式系统中重要的组件,是一种进程间通信或者是同一进程的不同线程的通信方式。和 http 同步协议不同的是,消息队列是一种异步的通信协议,不需要立即获得结果。

消息队列的使用场景

  • 异步处理
  • 流量控制
  • 应用解耦

应用解耦

消息队列的一个作用就是实现系统应用之间的解耦。举例一下电商系统的中的订单系统。
当创建一个订单时:

  1. 发起支付
  2. 扣减库存
  3. 发消息告知用户
  4. 更新统计数据

这些订单下游的系统都需要实时获得订单数据,随着业务量的增大和业务的变更,有一段时间不需要发消息给客户,或者需要添加功能,每次都需要不断的调式订单系统和下游系统。

引入消息队列后,订单服务在创建订单时发送一条信息到消息队列主题 Order 中,所有的下游都订阅主题Order,这样无论增加、减少下游系统还是下游系统的功能如何变化,订单服务都不需要做更改了,实现了订单服务和下游服务的解耦。

异步处理

异步处理是将很多串行进行的步骤转成异步处理,还是已订单系统为例,下单订单需要创建订单和锁定库存,确定本次请求后马上给用户返回响应,然后把后续请求的数据的都在消息队列,由消息队列异步处理。

这样把五个步骤减少为两个步骤,假设每个步骤处理时间需要500ms,在不考虑网络延迟的情况下:

串行处理: 500 * 5 = 2500ms
并行处理:500 * 2 = 1000ms

系统响应时间缩短一半以上。这样响应速度更快,而且把请求放在后续操作,可以充分利用更多的资源处理请求。
所以我们可以看到,实现异步操作的服务:

  • 更快地返回结果
  • 减少等待时间,提升系统总体性能

流量控制

在购物网站的做一个秒杀活动,平时网站能支撑每秒1000次并发请求,但是电商秒杀一下请求猛增到每秒3000次请求,多出来的请求,可能直接让系统宕机。
所以我们就需要使用消息队列来控制流量,当系统短时间接收到大量请求时,会先将请求堆积到消息队列上,后端服务从消息队列上消费数据,消息队列相对于给后端服务做了一次缓冲。

优缺点

上面的概述总结起来有个三个优点:异步、削峰和解耦。
缺点有以下几个:

  • 系统可用性降低
  • 增加系统复杂度
  • 可能会数据一致性问题,比如数据丢失,数据重复传输

RabbitMQ消息队列五种工作模式

rabbitmq官网教程上介绍了几种工作模式,

简单(simple)模式

The simplest thing that does something

从上面的示意图看出来 simple 模式有以下几个特征:

  • 只有一个生产者、一个消费者和一个队列
  • 生产者和消费者在发送和接收消息时,只需要指定队列名称,而不需要发送那个 Exchange 交换机。

工作(Work)模式


在多个消费者之间分配任务(竞争消费者模式
创建一个工作队列,添加多个消费者共同消费工作队列上的任务。每一个消息都给一个消费者消费

发布订阅(Publish/Subscribe)模式


工作模式中每个消息只能被一个消费者消费,发布订阅模式是每个消息同时给多个消费者消费。
上图中的X表示Exchange 交换器,Exchange 类型有:Direct、Topic、Headers和Fanout。

  • 发布订阅用的是 Fanout
  • Fanout 是不需要指定具体的队列名,Exchange 会将消息转发所有的绑定的队列

路由(Routing)模式


路由模式中的交换器类型为 direct,在同一个交换器,由生产者指定指定目标队列。

  • 指定规则按照 RoutingKey 指定
  • 消费者通过 BindingKey 绑定自己接收消息队列
  • 只有 RoutingKey 和 BindingKey 匹配队列才会收到信息

RoutingKey 是生产者指定 Exchange 路由到哪个队列,BindingKey 用于消费者绑定到某个队列

主题(Topic)模式


主题模式是根据通配符绑定队列,其中 * 可以替换任务一个标识符,# 可以替换多个标识符,通配符和名称使用 . 隔开。

  • 主题模式的 Exchange 类型为 topic
  • 每个消息可以被多个队列消费

参考

如果觉得文章对你有帮助的话,请点个推荐吧!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123763.html

相关文章

  • 史上最全阿里 Java 面试题总结

    摘要:以下为大家整理了阿里巴巴史上最全的面试题,涉及大量面试知识点和相关试题。的内存结构,和比例。多线程多线程的几种实现方式,什么是线程安全。点击这里有一套答案版的多线程试题。线上系统突然变得异常缓慢,你如何查找问题。 以下为大家整理了阿里巴巴史上最全的 Java 面试题,涉及大量 Java 面试知识点和相关试题。 JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节。 S...

    winterdawn 评论0 收藏0
  • 【最全】Java 进阶面试总结

    摘要:这里有一份面试题相关总结,涉及高并发分布式高可用相关知识点,在此分享给大家,希望大家能拿到一份理想的知识点会陆续更新在上,觉得还算凑和的话可以关注一下噢高并发架构消息队列为什么使用消息队列消息队列有什么优点和缺点都有什么优点和缺点如何保证消 这里有一份面试题相关总结,涉及高并发、分布式、高可用相关知识点,在此分享给大家,希望大家能拿到一份理想的 Offer! 知识点会陆续更新在 Git...

    nifhlheimr 评论0 收藏0
  • 深入消息中间件选型分析

    摘要:是阿里开源的消息中间件,目前已经捐献个基金会,它是由语言开发的,具备高吞吐量高可用性适合大规模分布式系统应用等特点,经历过双的洗礼,实力不容小觑。 前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数...

    shevy 评论0 收藏0
  • 简述 ZAB 协议 以及 zookeeper

    摘要:只允许有一个主进程接受客户事务请求并处理,收到请求后,将其转化为事务。并开启新一轮选举,新的会和过半的进行同步数据。同步结束时,切换为消息广播模式。若非节点收到客户请求,则该节点会将该请求发送到服务器上。 zookeeper 它为分布式应用提供了高效可靠的分布式协调服务。 实现依赖于 ZAB协议,实现了主备模式架构用来保持集群中数据的一致性 Zookeeper 将所有数据存放在 内存...

    lwx12525 评论0 收藏0
  • Android 2019最新面试实战总结

    摘要:内存泄漏当应用内部不再需要某个实例后,但是这个对象却仍然被引用,这个情况就叫做内存泄露。安卓虚拟机为每一个应用分配一定的内存空间,当内存泄露到达一定的程度就会造成内存溢出。点击登录跳转页面中所有操作都与用户密切相关,是 Android: 今日头条屏幕适配的原理? 1:首先计算出 density,计算公式:当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = densit...

    whataa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<