当前位置:   article > 正文

RocketMQ(浅谈异步,字节跳动三场技术面+HR面_rocketmq最终一致性 是异步场景么

rocketmq最终一致性 是异步场景么

RocketMQ 是一个 队列模型消息中间件,具有高性能高可靠高实时分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统,由阿里巴巴团队开发,在2016年底贡献给 Apache ,成为了 Apache 的一个顶级项目。 在阿里内部, RocketMQ 很好地服务了集团大大小小上千个应用,在每年的双十一当天,更有不可思议的万亿级消息通过 RocketMQ 流转。

废话不多说,想要了解 RocketMQ 历史的同学可以自己去搜寻资料。听完上面的介绍,你只要知道RocketMQ 很快、很牛、而且经历过双十一的实践就行了!

三、队列模型和主题模型

在谈 RocketMQ 的技术架构之前,我们先来了解一下两个名词概念——队列模型主题模型

首先我问一个问题,消息队列为什么要叫消息队列?

你可能觉得很弱智,这玩意不就是存放消息的队列嘛?不叫消息队列叫什么?

的确,早期的消息中间件是通过 队列 这一模型来实现的,可能是历史原因,我们都习惯把消息中间件成为消息队列。

但是,如今例如 RocketMQKafka 这些优秀的消息中间件不仅仅是通过一个 队列 来实现消息存储的。

1.队列模型

就像我们理解队列一样,消息中间件的队列模型就真的只是一个队列。。。我画一张图给大家理解。

在一开始我跟你提到了一个 “广播” 的概念,也就是说如果我们此时我们需要将一个消息发送给多个消费者(比如此时我需要将信息发送给短信系统和邮件系统),这个时候单个队列即不能满足需求了。

当然你可以让 Producer 生产消息放入多个队列中,然后每个队列去对应每一个消费者。问题是可以解决,创建多个队列并且复制多份消息是会很影响资源和性能的。而且,这样子就会导致生产者需要知道具体消费者个数然后去复制对应数量的消息队列,这就违背我们消息中间件的 解耦 这一原则。

2.主题模型

那么有没有好的方法去解决这一个问题呢?有,那就是 主题模型 或者可以称为 发布订阅模型

感兴趣的同学可以去了解一下设计模式里面的观察者模式并且手动实现一下,我相信你会有所收获的。

在主题模型中,消息的生产者称为 发布者(Publisher) ,消息的消费者称为 订阅者(Subscriber) ,存放消息的容器称为 主题(Topic)

其中,发布者将消息发送到指定主题中,订阅者需要 提前订阅主题 才能接受特定主题的消息。

3.RocketMQ中的消息模型

RockerMQ 中的消息模型就是按照 主题模型 所实现的。你可能会好奇这个 主题 到底是怎么实现的呢?你上面也没有讲到呀!

其实对于主题模型的实现来说每个消息中间件的底层设计都是不一样的,就比如 Kafka 中的 分区RocketMQ 中的 队列RabbitMQ 中的 Exchange 。我们可以理解为 主题模型/发布订阅模型 就是一个标准,那些中间件只不过照着这个标准去实现而已。

所以, RocketMQ 中的 主题模型 到底是如何实现的呢?首先我画一张图,大家尝试着去理解一下。

我们可以看到在整个图中有 Producer GroupTopicConsumer Group 三个角色,我来分别介绍一下他们。

  • Producer Group 生产者组: 代表某一类的生产者,比如我们有多个秒杀系统作为生产者,这多个合在一起就是一个 Producer Group 生产者组,它们一般生产相同的消息。
  • Consumer Group 消费者组: 代表某一类的消费者,比如我们有多个短信系统作为消费者,这多个合在一起就是一个 Consumer Group 消费者组,它们一般消费相同的消息。
  • Topic 主题: 代表一类消息,比如订单消息,物流消息等等。

你可以看到图中生产者组中的生产者会向主题发送消息,而 主题中存在多个队列,生产者每次生产消息之后是指定主题中的某个队列发送消息的。

每个主题中都有多个队列(这里还不涉及到 Broker ),集群消费模式下,一个消费者集群多台机器共同消费一个 topic 的多个队

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/624692
推荐阅读
相关标签
  

闽ICP备14008679号