首页 > 其他分享 >决战圣地玛丽乔亚Day08

决战圣地玛丽乔亚Day08

时间:2023-02-10 02:22:14浏览次数:33  
标签:事务 Day08 乔亚 队列 玛丽 消费 消息 RocketMQ 延迟

RocketMQ

分布式事务

 

 

 

相对于本地事务,分布式事务是为了满足跨数据源或跨服务的事务场景。上图展示了RocketMQ在分布式事务中的应用,满足CAP定理中的AP,保证最终一致性。主要工作流程就是:本地服务先发一个半消息,这个消息是不能被其他服务进行消费的,然后执行本地事务,根据本地事务执行的成功与否,决定半消息是commit还是rollback,如是commit,这个消息就能被第三方消息进行消费;如果是rollback,这个消息就会被彻底删除。消息的生产服务可能会因为网络原因、应用问题等,导致一直没有对这个半消息进行确认,那么这时候 Broker服务器会定时扫描这些半消息,主动找Producer端查询该消息的状态。当然,什么时候去扫描,包含扫描几次,我们都可以配置。对于消息的消费,在分布式事务的场景中还要考虑幂等性问题,因为RocketMQ、Kafka仅仅保证at-least-once语义,但是无法满足exactly-once(仅一次)语义。比如一个订单消息消息可能被重复消息,这时候可以通过订单处理日志/状态表来对以处理过的订单消息进行过滤。

 

延时消息

生产者把消息发送到消息队列中以后,并不期望被立即消费,而是等待指定时间后才可以被消费,这类消息通常被称为延迟消息。延时消息是一种很常用的业务场景,在RocketMQ中,只支持特定级别的延迟消息,但是不支持任意时间精度的延迟消息。如果要支持任意时间精度,不能避免在Broker层面做消息排序,再涉及到持久化的考量,那么消息排序就不可避免产生巨大的性能开销。在RocketMQ中,消息延迟级别分别为1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h,共18个级别。

 

 

如上图所示,延时消息在RocketMQ的工作流程如下:

如果消息的延迟级别大于0,则表示该消息为延迟消息,修改该消息的主题为SCHEDULE_TOPIC_XXXX,队列Id为延迟级别减1。
消息进入SCHEDULE_TOPIC_XXXX的队列中。
定时任务根据上次拉取的偏移量不断从队列中取出所有消息。
根据延时级别的时间,筛选出已经到期的消息
根据消息属性重新创建消息,清除延迟级别,恢复原主题和队列Id。
重新发送消息到原主题的队列中,供消费者进行消费。

 

顺序消息

 

对于RocketMQ中的同一个队列,消息的到达顺序决定了消息的消费顺序(FIFO),但是RocketMQ是无法保证全局消息的有序性,原因是如果读写队列有多个,

消息就会存储在多个队列中,消费者负载时可能会分配到多个消费队列同时进行消费,多队列并发消费时,无法保证消息消费顺序性。所以本文想说的是针对同一个队列如何实现顺序消息,如下图所示:

 

队列选择器(MessageQueueSelector)可以帮助我们将顺序消息发送到同一个消息队列上,如图中订单消息所示,我们仅仅在消息发送的过程实现MessageQueueSelector接口的select方法,在select方法中根据订单ID选择消息队列即可,如下面示例代码所示:

 

 保证订单消息发送到同一个消息队列之后,还需要保证顺序消息,在RocketMQ中MessageListenerOrderly自带此实现,如果使用MessageListenerConcurrently则需要使用单线程模式

 

标签:事务,Day08,乔亚,队列,玛丽,消费,消息,RocketMQ,延迟
From: https://www.cnblogs.com/dwj-ngu/p/17107632.html

相关文章

  • drf day08 三大认证源码分析、断点调试、全局异常处理
    一、后端取COOKIE的几种方式1.GET请求,数据携带在地址中 从地址栏中取 request.query_params.get('token')2.原生djagno,取出前端传入cookie,从哪取的? request.COOKIE.ge......
  • drf从入门到精通---day08
    昨日回顾#1认证的使用 -有些接口需要登录后才能访问-原生djagno如何使用的认证:auth的user表,auth自带了认证-自己登录,使用自定义的用户表-认证类的使用......
  • 【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day08
        大家好,我是陶然同学,软件工程大三明年实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题......
  • 决战圣地玛丽乔亚Day07----RocketMQ
    回顾上次的内容:NameServer、Broker、Producer、Consumer生产者向Broker发送消息,放在消息队列,消费者通过消息推过来/自己拉取的方式消费消息。 NameServer和Broker保持......
  • 超级玛丽游戏
    超级玛丽游戏题目背景本题是洛谷的试机题目,可以帮助了解洛谷的使用。建议完成本题目后继续尝试P1001、P1008。另外强烈推荐新用户必读贴题目描述超级玛丽是一个非常......
  • 决战圣地玛丽乔亚Day06-- MQ消息队列
    MQ消息队列。目前市面上流行的MQ有:RocketMQ、kafka、RabbitMQ、ActiveMQ比较一下这几个消息队列一般消息队列的作用和使用场景是:1.解耦。(本来A要调很多接口,现在A直接把......
  • 决战圣地玛丽乔亚Day05
    Zookeeper、Nacos、Eureka的比较CAP原则;Consistency:数据一致性(主要在乎数据的安全和一致,用户体验放在第二)Availability:可用性(收到请求要进行反馈,用户体验第一)Partiti......
  • 决战圣地玛丽乔亚Day04
    Sleuth分布式请求链路追踪Sleuth是一个工具,用来跟踪一个用户请求的过程提供链路追踪、性能分析、数据分析优化链路、可视化Trace:相同的TraceID的Span串联形成一个树状......
  • Day08-字典与集合
    一、字典的应用场景列表中有数据有多个元素,且有相应的对应关系时,使用列表不足够表示二、字典的创建dict_data={key:value,key1:value1}1,符号以大括号表示2,数据是以......
  • 决战圣地玛丽乔亚Day02
    OpenFeign:负载均衡+RPC调用启动类添加@EnableFeignClients,业务逻辑接口添加 @FeignClient(name="定义当前客户端client名字") 如果client同名,可以用contextId起别......