RabbitMQ面试复习笔记(一)

一、什么是RabbitMQ?

RabbitMQ是一个基于AMQP协议的一个软件间通信的消息队列中间件。AMQP的一个具体工作机制非常简单,生产者把消息发送到一个rabbitmq broker中的一个exchange交换机上,然后交换机根据路由规则将消息发送到绑定的队列中,最后把这个消息投递给订阅了这个队列的消费者,最后实现异步通信。它常用在服务间解耦流量削峰实现异步通信这三个方面,它有四大核心:

生产者:提供消息的应用程序;

消费者:处理消息的应用程序;

队列:存储消息的区域;

交换机:消息路由的核心组件,将生产者发送的消息路由到相应的队列当中。

绑定关系(BindingKey):

表示建立queue和exchange之间的一个绑定关系,每一个关系会有一个BindingKey,通过这种方式,相当于在exchange里面建立了一个路由关系表,生产者发送消息的时候,需要声明一个routingKey,交换机拿到消息之后根据routingKey跟关系表里面的bingdingKey进行匹配,匹配的方式是根据exchangeType来决定的。

三种交换机类型(ExchangeType):

1、direct:完整的匹配,只有bindingKey和routingKey完全匹配的时候才能发送,相当于消息点对点的发送

2、fanout:广播,这种类型的交换机不会根据routingKey来进行匹配,而是将消息广播到所有跟交换机绑定了的队列

3、topic:正则表达式匹配,根据routingKey使用正则表达式去匹配bindingKey

二、RabbitMQ的应用场景

1、秒杀系统

2、服务限流

3、下单系统

三、在RabbitMQ中如何保证顺序消费?

使用一个队列作为顺序消费的队列,然后只分配一个消费者取消费这个队列。

优点是保证了消息的顺序消费,但是会降低系统的一个吞吐量。

四、RabbitMQ如何保证高可用?

RabbitMQ提供了两种集群模式:普通集群模式、镜像集群模式。

普通集群模式中,rabbitmq各个节点只同步元数据,不会同步消息数据,元数据包含队列的名称、交换机的名称和属性、交换机与队列的绑定关系。

当我们发送消息或者消费消息的时候,不管请求发送到rabbitMQ中的哪一个节点,最终都会通过元数据去定位到队列所在的节点去存储和拉取数据。

这种集群模式的架构有点类似没有主从的redis cluster集群,并没有提供高可用的能力,而仅仅是分担了流量压力、提升了消息的吞吐能力,因为一旦其中一个节点宕机了,就会有一部分数据没有办法访问到。

镜像集群模式下,因为每一个节点都会把数据全部拷贝一份,所以无论是哪一个节点出现了问题,都能访问到,并能正常的消费。

优点:实现了高可用

缺点:数据副本的同步会有性能损耗

我们还可以通过keepalived+HAProxy去实现rabbitMQ集群的负载均衡。

其中HAProxy是一个负载均衡器,可以实现rabbitmq镜像集群模式的一个负载均衡,同时为了防止HAProxy的一个单点故障,所以在HAProxy之前增加一个keepalived去实现HAProxy的主备,如果HAProxy主节点出现了故障,那么备节点就会接管继续提供服务,keepalived提供一个虚拟IP,生产者只需要连接到虚拟IP即可。

五、什么情况下,rabbitmq的消息会丢失?

1、生产者没有成功的把消息发送到rabbitmq服务;

2、生产者发送消息成功,但是rabbitmq服务在持久化未完成的时候宕机;

3、消费者在处理消息之前宕机了,rabbitmq服务以为消息已经签收。

六、如何保证消息不丢失(可靠性)?

在生产者的角度,rabbitmq提供了一个confirm消息确认机制,就是生产者向server端发送消息之后,如果消息处理成功,server端会向生产者返回一个ack消息,生产者可以根据消息的结果决定消息是否要重新发送。

在服务端的角度,需要把收到的消息持久化到磁盘。那么创建Queue的时候需要把Queue设置为持久化,生产者发送消息的时候,需要把消息的投递模式设置为持久化。(刷盘的时候还是可能会丢失,所以需要跟确认机制一起配合)

在消费者的角度,需要把消息的自动确认,从自动确认改为手动确认,这样消费者需要手动调用确认消费方法,才能表示这条消息已经签收,但是会出现重复消费的问题,所以要考虑幂等性的设计。

全部评论
Mark
点赞 回复 分享
发布于 2023-06-25 17:17 湖南

相关推荐

今天 12:15
门头沟学院 Java
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
15
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务