最全第一次尝试为Apache顶级开源项目贡献代码(3),zookeeper面试题总结

最后

ActiveMQ消息中间件面试专题

  • 什么是ActiveMQ?
  • ActiveMQ服务器宕机怎么办?
  • 丢消息怎么办?
  • 持久化消息非常慢怎么办?
  • 消息的不均匀消费怎么办?
  • 死信队列怎么办?
  • ActiveMQ中的消息重发时间间隔和重发次数吗?

ActiveMQ消息中间件面试专题解析拓展:

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


redis面试专题及答案

  • 支持一致性哈希的客户端有哪些?
  • Redis与其他key-value存储有什么不同?
  • Redis的内存占用情况怎么样?
  • 都有哪些办法可以降低Redis的内存使用情况呢?
  • 查看Redis使用情况及状态信息用什么命令?
  • Redis的内存用完了会发生什么?
  • Redis是单线程的,如何提高多核CPU的利用率?

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


Spring面试专题及答案

  • 谈谈你对 Spring 的理解
  • Spring 有哪些优点?
  • Spring 中的设计模式
  • 怎样开启注解装配以及常用注解
  • 简单介绍下 Spring bean 的生命周期

Spring面试答案解析拓展

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


高并发多线程面试专题

  • 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
  • Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
  • Java 中 wait 和 sleep 方法有什么区别?
  • 如何在 Java 中实现一个阻塞队列?
  • 如何在 Java 中编写代码解决生产者消费者问题?
  • 写一段死锁代码。你在 Java 中如何解决死锁?

高并发多线程面试解析与拓展

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


jvm面试专题与解析

  • JVM 由哪些部分组成?
  • JVM 内存划分?
  • Java 的内存模型?
  • 引用的分类?
  • GC什么时候开始?

JVM面试专题解析与拓展!

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

sh ./mqadmin // 该命令会罗列所支持的运维命令列表即概要说明,如下图所示:

在这里插入图片描述

1、官方命令及其缺陷


看到曙光了,接下来先简单介绍一下官方提供的命令与使用详解。

1.1 producerConnection概述

在这里插入图片描述

其参数说明如下:

  • -n name server 服务器地址

  • -g

生产者组名称

  • -t

topic名称,值得说明的是这个topic的作用并不是必须传入生产者组对应的消息发送topic,而是用于路由寻址,即该命令需要发送到哪些Broker上执行。

基本的使用示例如下:

在这里插入图片描述

输出列依次为序号、客户端ID(clientId)、客户端IP与端口号、客户端语言、客户端版本。

上述功能非常实用,但在实际的使用过程中,特别是开源版本的MQ,生产者组的概念比较弱化,在运维层面也不向消费者组这样可管控,故这个命令中的 -g 参数,其实在实际过程中要统一采集就变的非常困难,而且RocketMQ并没有提供一个获取所有生产者组的功能,从而无法通过脚本化语言迅速提取相关信息。

在介绍如何解决该问题后,我们继续看一下获取消费组相关的信息。

1.2 consumerConnection概述

通过consumerConnection可以获取消费组的相关信息,其使用示例如下:

在这里插入图片描述

由于消费组在实际生产中都会加以控制,并且是可运维的(可以关闭自动创建消费组,项目组只有申请后才可使用),并且尽管rocketmq同样没有提供获取消费组列表的命令,但提供了对应的API。

可以通过rocketmq-console中提供的命令,获取所有的消费组列表,然后遍历并依次通过命令提取消费组的详情,从而可以得知当前集群所有的客户端连接方式,对兼容性缩写测试范围打下坚实基础。

2、解决方案


通过上面的介绍得知由于开源版本的RocketMQ弱化了生产者组(Producer Group)的概念,目前只有在事务消息时会被使用到,故在实际生产实践过程中发现无法实现对生产者组进行强管控,比较难获取集群中当前所有的生产者信息。

为了解决版本升级需要进行兼容性测试缩写测试范围的问题,我们希望能够有一个运维命令,能够获取当前集群中所有的客户端连接信息。

那我们能否定制化一个运维命令实现获取所有生产者的连接信息,既然官方提供了producerConnection命令获取单个生产者组信息,服务端应该是会存储所有生产者组的连接信息,只是官方没有提供相关的命令而已,为了验证,我们可以去看一下producerConnection命令在服务端的处理逻辑。

在这里插入图片描述

从服务端代码可知,在服务端会使用一个Map存储所有的生产者客户端连接,其键为生产者组名称,其值为Map键值对(通道对象(Channel),客户端信息(ClientChannelInfo)),其中客户端信息就包含了客户端ID,客户端使用的语言以及版本等信息。

经过上面分析,实现一个获取全部生产者连接信息将变得非常简单。

本文由于篇幅问题,不展示全部代码,主要总结一下开发一个RocketMQ的几个核心步骤,代码已提交到github仓库:

链接:https://github.com/apache/rocketmq/pull/2940

首先我们看一下该命令在IDEA中的测试效果,运行命令如下:

在这里插入图片描述

命令运行输出为:

在这里插入图片描述

打包部署后命令的使用说明如下:

在这里插入图片描述其中-b broker地址与-c cluster集群名称两个参数二选一,主用用于路由。

最后

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。

我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。

不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值