当前位置: 首页 > news >正文

网站建设汇报方案ppt模板德州鲁企动力网站优化中心

网站建设汇报方案ppt模板,德州鲁企动力网站优化中心,制作ppt模板的软件,凡客诚品售后服务官方本博客为个人学习笔记,学习网站:2023黑马程序员RabbitMQ入门到实战教程 高级篇章节 目录 延迟消息 死信交换机 延迟消息插件 下载安装 延迟交换机声明 ​编辑 发送延迟消息 订单状态同步问题 延迟消息 在电商的支付业务中,对于一些库…

 本博客为个人学习笔记,学习网站:2023黑马程序员RabbitMQ入门到实战教程 高级篇章节

目录

延迟消息

死信交换机

延迟消息插件

下载安装

延迟交换机声明

​编辑

发送延迟消息

订单状态同步问题


延迟消息

在电商的支付业务中,对于一些库存有限的商品,为了更好的用户体验,通常都会在用户下单时立刻扣减商品库存。例如电影院购票、高铁购票,下单后就会锁定座位资源,其他人无法重复购买。
但是这样就存在一个问题,假如用户下单后一直不付款,就会一直占有库存资源,导致其他客户无法正常交易,最终导致商户利益受损!

因此,电商中通常的做法就是:对于超过一定时间未支付的订单,应该立刻取消订单并释放占用的库存

例如,订单支付超时时间为30分钟,则我们应该在用户下单后的第30分钟检查订单支付状态,如果发现未支付,应该立刻取消订单,释放库存。

但问题来了:如何才能准确的实现在下单后第30分钟去检查支付状态呢?
像这种在一段时间以后才执行的任务,我们称之为延迟任务,而要实现延迟任务,最简单的方案就是利用MQ的延迟消息了。

在RabbitMQ中实现延迟消息也有两种方案:
1. 死信交换机+TTL
2. 延迟消息插件


死信交换机

什么是死信?
当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter):
1. 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false
2. 消息是一个过期消息,超时无人消费
3. 要投递的队列消息满了,无法投递

如果一个队列中的消息已经成为死信,并且这个队列通过dead-letter-exchange属性指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机就称为死信交换机(Dead Letter Exchange)。而此时如果将一个队列与死信交换机绑定,则最终死信就会被投递到这个队列中。

死信交换机有什么作用呢?
收集那些因处理失败而被拒绝的消息
收集那些因队列满了而被拒绝的消息
收集因TTL(有效期)到期的消息

应用:通过死信交换机完成在消费者下单一段时间(假设为5秒)后,对支付状态进行检查

由于死信交换机能够收集因TTL(有效期)到期的消息,因此我们可以创建一个消息队列ttl.queue,并且不给它指定w消费者。之后,我们设置发送消息的有效时间为5秒,我们将消息通过ttl.fanout交换机发送至ttl.queue,由于没有消费者消费这条消息,在有效期5秒到期时,该消息会成为死信,并投递到所绑定的死性交换机hmall.direct中,之后再由该交换机发送到队列direct.queue1中,最后被消息者消费。而当这条消息从发布者发出直到消费者通过死信交换机接收到时,经历了有效期5秒的等待时间,从而实现了延迟消息。

注意:
1. 尽管这里的ttl.fanout不需要RoutingKey,但是当消息变为死信并投递到死信交换机时,会沿用之前的RoutingKey,这样hmall.direct才能正确路由消息。

缺点
RabbitMQ的消息过期是基于追溯方式来实现的,也就是说当一个消息的TTL到期以后不一定会被移除或投递到死信交换机,而是在消息恰好处于队首时才会被处理。 当队列中消息堆积很多的时候,过期消息可能不会被按时处理,因此你设置的TTL时间不一定准确。

在MQ管理平台设置死信交换机方法

消息有效时间设置


延迟消息插件

下载安装

基于死信队列虽然可以实现延迟消息,但是太麻烦了。因此RabbitMQ社区提供了一个延迟消息插件来实现相同的效果。

插件下载地址: GitHub - rabbitmq/rabbitmq-delayed-message-exchange: Delayed Messaging for RabbitMQ 由于我们安装的MQ是3.8版本,因此这里下载3.8.17版本:

因为我们是基于Docker安装,所以需要先查看RabbitMQ的插件目录对应的数据卷。

docker volume inspect mq-plugins

结果如下:
[
    {
        "CreatedAt": "2024-06-19T09:22:59+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mq-plugins/_data",
        "Name": "mq-plugins",
        "Options": null,
        "Scope": "local"
    }

插件目录被挂载到了`/var/lib/docker/volumes/mq-plugins/_data`这个目录,我们上传插件到该目录下。

接下来执行命令,安装插件:

docker exec -it mq rabbitmq-plugins enable rabbitmq_delayed_message_exchange

运行结果如下:


延迟交换机声明

基于注解与Bean方式声明延迟交换机:


发送延迟消息

发送消息时,必须通过x-delay属性设定延迟时间:

@Test
void testPublisherDelayMessage() {// 1.创建消息String message = "hello, delayed message";// 2.发送消息,利用消息后置处理器添加消息头rabbitTemplate.convertAndSend("delay.direct", "delay", message, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {// 添加延迟消息属性message.getMessageProperties().setDelay(5000);return message;}});
}

注意
延迟消息插件内部会维护一个本地数据库表,同时使用Elang Timers功能实现计时。如果消息的延迟时间设置较长,可能会导致堆积的延迟消息非常多,会带来较大的CPU开销,同时延迟消息的时间会存在误差。 因此,不建议设置延迟时间过长的延迟消息。  


订单状态同步问题

接下来,我们就在交易服务中利用延迟消息实现订单支付状态的同步。其大概思路如下:

假如订单超时支付时间为30分钟,理论上说我们应该在下单时发送一条延迟消息,延迟时间为30分钟。这样就可以在接收到消息时检验订单支付状态,关闭未支付订单。 但是大多数情况下用户支付都会在1分钟内完成,我们发送的消息却要在MQ中停留30分钟,额外消耗了MQ的资源。因此,我们最好多检测几次订单支付状态,而不是在最后第30分钟才检测。 例如:我们在用户下单后的第10秒、20秒、30秒、45秒、60秒、1分30秒、2分、...30分分别设置延迟消息,如果提前发现订单已经支付,则后续的检测取消即可。 这样就可以有效避免对MQ资源的浪费了。

优化后的实现思路如下:

详细代码见  黑马程序员官方—微服务框架笔记  中day07MQ高级4.3

http://www.yayakq.cn/news/879631/

相关文章:

  • 前端工程师是做网站网站建设有几块
  • 重庆哪里做网站定制网站建设的释义
  • 鹿泉微信网站建设网站域名com和cn的差别在哪里
  • 网站建站 宝网站建设信息表
  • 学院网站的作用重庆十大房地产公司
  • 北京网站设计制作教程wordpress链接自定义后文章打不开
  • 榆林北京网站建设网站建设到上线的步骤过程
  • 网站开发工程师发展趋势大规模网站开发语言
  • 郑州网站设计制作哪家好摄影网站设计与实现
  • 网站打开是404青岛网站设计模板
  • android网站开发个人网页制作方案
  • 深圳网站建设-中国互联福建省建住房建设部网站
  • 2018年公司做网站注意事项wordpress建站行吗
  • 网站信息平台建设方案在线crm在线oa免费观看
  • 铜山徐州网站开发O2O网站开发工程师
  • 湖南众诚建设网站怎么降低wordpress版本
  • 用ps做网站首页一级工程造价师
  • 广州万户网站公司濮阳建设企业网站公司
  • 网站优化排名方法有哪些怎么建设空包网站
  • 保定的网站建设前端开发线上培训
  • 网站建设有什么证dede淘宝客网站模板
  • 婚礼策划网站建设如何做自己的淘宝网站
  • 哪个网站是做包装材料珍珠棉包管国家建筑工程网查询证书
  • 被骗去国外做网站网站推广东莞网络推广网络推广
  • 佛山用户网站建站品牌设计公司深圳
  • 公司做网站需要哪些资料企业管理平台软件
  • 南阳商都网站做网站大数据获客
  • 一般网站开发公司新办公司流程及资料
  • 深圳app客户端做网站聚名网app下载
  • 湘潭网站建设公司有哪些软件开发工程师需要什么证书