RocketMQ问题集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RocketMQ问题集相关的知识,希望对你有一定的参考价值。

参考技术A

RocketMQ单机可以支撑10万+的并发访问,集群部署可以让流量分散在多台机器上来支撑高并发。

MQ会收到大量的消息,并不是立马就会被所有的消费方获取过去消费的,所以一般MQ都得把消息在自己本地磁盘存储起来,然后等待消费方获取消息去处理。
本质上RocketMQ存储海量消息的机制就是分布式的存储。所谓分布式存储,就是把数据分散在多台机器上来存储,每台机器存储一部分消息,这样多台机器加起来就可以存储海量消息了

Broker主从架构以及多副本策略,Master Broker收到消息之后会同步给Slave Broker,这样Slave Broker上就能有一模一样的一份副本数据。即使Master出现故障,还有Slave上有一份数据副本,可以保证数据不丢失,继续对外提供服务,保证了MQ的可靠性和高可用性。

RocketMQ为了解决这个问题,有一个NameServer的概念,他也是独立部署在几台机器上的,然后所有的Broker都会把自己注册到NameServer上去,对于系统而言,如果他要发送消息到Broker,会找NameServer去获取路由信息,就是集群里有哪些Broker等信息.如果系统要从Broker获取消息,也会找NameServer获取路由信息,去找到对应的Broker获取消息。

NameServer支持部署多台机器的,起到高可用的效果,保证任何一台机器宕机,其他机器上的NameServer可以继续对外提供服务。

每个Broker启动都得向所有的NameServer进行注册也就是说,每个NameServer都会有一份集群中所有Broker的信息。

系统自己每隔一段时间,定时发送请求到NameServer去拉取最新的集群Broker信息。

在RocketMQ的实现中,采用的是 TCP长连接 进行通信。 Broker会跟每个NameServer都建立一个TCP长连接 ,然后定时通过TCP长连接发送心跳请求过去靠的是Broker跟NameServer之间的心跳机制,Broker会每隔 30s 给所有的NameServer发送心跳,告诉每个NameServer自己目前还活着。每次NameServer收到一个Broker的心跳,就可以更新一下他的最近一次心跳的时间。然后NameServer会每隔 10s 运行一个任务,去检查一下各个Broker的最近一次心跳时间,如果某个Broker超过 120s 都没发送心跳了,那么就认为这个Broker已经挂掉了。

如果Broker挂掉了,那么作为生产者和消费者的系统是怎么感知到的呢?有两种解决办法。
首先,你可以考虑不发送消息到那台Broker,改成发到其他Broker上去。
其次,假设你必须要发送消息给那台Broker,那么他挂了,他的Slave机器是一个备份,可以继续使用,可以考虑等一会儿去跟他的Slave进行通信。
总之,这些都是思路,但是现在我们先知道,对于生产者而言,他是有一套容错机制的,即使一下子没感知到某个Broker挂了,他可以有别的方案去应对。而且过一会儿,系统又会重新从NameServer拉取最新的路由信息了,此时就会知道有一个Broker已经宕机了。

RocketMQ的Master-Slave模式采取的是Slave Broker不停的发送请求到Master Broker去拉取消息。Pull模式拉取消息

Master Broker主要是接收系统的消息写入,然后会同步给Slave Broker,那么其实本质上Slave Broker也应该有一份一样的数据。而系统在获取消息的时候, 有可能从Master Broker获取消息,也有可能从Slave Broker获取消息

Slave Broke挂掉有一点影响,但是影响不太大
因为消息写入全部是发送到Master Broker的,然后消息获取也可以走Master Broker,只不过有一些消息获取可能是从Slave Broker去走的。所以如果Slave Broker挂了,那么此时无论消息写入还是消息拉取,还是可以继续从Master Broke去走,对整体运行不影响。
只不过少了Slave Broker,会导致所有读写压力都集中在Master Broker上。

Master Broker挂掉 对消息的写入和获取都有一定的影响了。但是其实本质上而言,Slave Broker也是跟Master Broker一样有一份数据在的,只不过Slave Broker上的数据可能有部分没来得及从Master Broker同步。

在RocketMQ的实现中,采用的是TCP长连接进行通信。
也就是说,Broker会跟每个NameServer都建立一个TCP长连接,然后定时通过TCP长连接发送心跳请求过去

MQ中的核心数据模型Topic,表达的意思就是一个数据集合的意思。我们可以在创建Topic的时候指定让他里面的数据分散存储在多台Broker机器上,比如一个Topic里有1000万条数据,此时有2台Broker,那么就可以让每台Broker上都放500万条数据。这样就可以把一个Topic代表的数据集合分布式存储在多台机器上了。

发送消息之前需要先有一个Topic,然后在发送消息的时候指定要发送到哪个Topic。既然已经知道要发送的Topic,那么就可以跟NameServer建立一个TCP长连接,然后定时从他那里拉取到最新的路由信息,包括集群里有哪些Broker,集群里有哪些Topic,每个Topic都存储在哪些Broker上。然后生产者系统自然就可以通过路由信息找到自己要投递消息的Topic分布在哪几台Broker上,此时可以根据负载均衡算法,从里面选择一台Broke机器出来,比如round robine轮询算法,或者是hash算法。
注意 :生产者一定是投递消息到Master Broker的,然后Master Broker会同步数据给他的Slave Brokers,实现一份数据多份副本,保证Master故障的时候数据不丢失,而且可以自动把Slave切换为Master提供服务。

消费者系统其实跟生产者系统原理是类似的,他们也会跟NameServer建立长连接,然后拉取路由信息,接着找到自己要获取消息的Topic在哪几台Broker上,就可以跟Broker建立长连接,从里面拉取消息

原来RocketMQ中间件可以这么玩

前言

都知道MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

所以作为一名开发人员,掌握好MyBatis的使用是非常有必要的,特别是像阿里、腾讯等大厂都使用广泛,那么如何能够达到“精通”MyBatis的程度?今天就来好好谈谈。

下面简单介绍一下这份MyBatis源码笔记,每个章节都是深入解析了源码底层在PDF里边有。为了让大家更好的学习MyBatis技术,我也是第一时间展示给大家了!

一面

  1. 自我介绍

  2. 项目难度介绍

  3. 如何实现延时任务

  4. 如何实现限流

  5. 线程池的参数

  6. 能不能自己实现一个java.lang.String并加载

  7. Redis为什么这么快

  8. epoll和poll的区别

  9. 进程同步的方式

二面

  1. MySQL的索引机制

  2. 如何自己实现内存分配和管理?不太懂,然后说了jvm的垃圾回收机制

  3. 你们公司内部的RPC框架,介绍一下

  4. Redis的key过期策略

  5. 缓存穿透和缓存雪崩

  6. 分布式锁

  7. 如何实现全局的id生成策略

  8. 悲观锁和乐观锁

  9. 红黑树了解么

三面

  1. 如何实现群消息已读

  2. 消息推送如何保证不重复

  3. Kafka如何保证消息的可靠性

  4. RPC是什么,和http调用有什么区别

  5. 说一说你项目的架构

  6. GC

  7. MySQL的索引原理,给了一个场景,如何优化

  8. 。。。。。。

面完3面后居然又来了一个笔试题(内心无比崩溃~~)

附加笔试

  1. producer-consumer

  2. 两线程交替打印

  3. 多线程模拟100分钱随机分给20个人,每个人最少分配到2分钱

四面

  1. 写个producer-consumer吧,我说上次写过了。。傻了。。不该说的,然后面试官换了一道题,还好比较简单,写个二分查找,2分钟写完完事。

  2. 项目难点

  3. MVCC

  4. HTTPS

  5. ElasticSearch的查询过程

  6. Kafka如何保证高可用

  7. Reids的集群和选主

  8. 知道什么分布式一致性算法

  9. 如何实现定时关单

  10. 。。。。。。

HR面(唉,阿里的hr面真是让我难忘。。。)

  • 说说看,假如你是部门技术经理,线上商户数据丢失怎么办

  • 怎么将一个产品推荐给其他的团队,怎么界定边界

  • 怎么样协调关系(到这里我已经快冒汗了,生怕最后一关毙掉了)

  • 你和同事相处的情况怎么样,说说你帮助同事的一次经历

  • 薪资

说真的,阿里面试流程很长,而且一个部门挂了以后,会被另一个部门捞起来,不停的面。总之来说,阿里的面试体验也还不错,这次虽然面的忐忑,最终三天内还是收到了offer,真的很庆幸。

惊喜

最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

image.png

image.png

备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

[外链图片转存中…(img-PdpPynx3-1624696307876)]

[外链图片转存中…(img-P75aEdBu-1624696307880)]

资料获取方式:戳这里免费领取

以上是关于RocketMQ问题集的主要内容,如果未能解决你的问题,请参考以下文章

原来RocketMQ中间件可以这么玩

报名 | Apache RocketMQ 开发者沙龙 · 杭州站

为啥 Monk 的问题的测试集比他们的训练集大?

程序集加载的问题?

如何将数据集划分为训练集和测试集?

奇怪的问题:找不到 Bigquery 数据集