RocketMQ问题集
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RocketMQ问题集相关的知识,希望对你有一定的参考价值。
参考技术ARocketMQ单机可以支撑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技术,我也是第一时间展示给大家了!
一面
-
自我介绍
-
项目难度介绍
-
如何实现延时任务
-
如何实现限流
-
线程池的参数
-
能不能自己实现一个java.lang.String并加载
-
Redis为什么这么快
-
epoll和poll的区别
-
进程同步的方式
二面
-
MySQL的索引机制
-
如何自己实现内存分配和管理?不太懂,然后说了jvm的垃圾回收机制
-
你们公司内部的RPC框架,介绍一下
-
Redis的key过期策略
-
缓存穿透和缓存雪崩
-
分布式锁
-
如何实现全局的id生成策略
-
悲观锁和乐观锁
-
红黑树了解么
三面
-
如何实现群消息已读
-
消息推送如何保证不重复
-
Kafka如何保证消息的可靠性
-
RPC是什么,和http调用有什么区别
-
说一说你项目的架构
-
GC
-
MySQL的索引原理,给了一个场景,如何优化
-
。。。。。。
面完3面后居然又来了一个笔试题(内心无比崩溃~~)
附加笔试
-
producer-consumer
-
两线程交替打印
-
多线程模拟100分钱随机分给20个人,每个人最少分配到2分钱
四面
-
写个producer-consumer吧,我说上次写过了。。傻了。。不该说的,然后面试官换了一道题,还好比较简单,写个二分查找,2分钟写完完事。
-
项目难点
-
MVCC
-
HTTPS
-
ElasticSearch的查询过程
-
Kafka如何保证高可用
-
Reids的集群和选主
-
知道什么分布式一致性算法
-
如何实现定时关单
-
。。。。。。
HR面(唉,阿里的hr面真是让我难忘。。。)
-
说说看,假如你是部门技术经理,线上商户数据丢失怎么办
-
怎么将一个产品推荐给其他的团队,怎么界定边界
-
怎么样协调关系(到这里我已经快冒汗了,生怕最后一关毙掉了)
-
你和同事相处的情况怎么样,说说你帮助同事的一次经历
-
薪资
说真的,阿里面试流程很长,而且一个部门挂了以后,会被另一个部门捞起来,不停的面。总之来说,阿里的面试体验也还不错,这次虽然面的忐忑,最终三天内还是收到了offer,真的很庆幸。
惊喜
最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)
备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)
[外链图片转存中…(img-PdpPynx3-1624696307876)]
[外链图片转存中…(img-P75aEdBu-1624696307880)]
以上是关于RocketMQ问题集的主要内容,如果未能解决你的问题,请参考以下文章