专栏首页每日面试Java面试:2021.05.29
原创

Java面试:2021.05.29

1、Kafka的架构是怎样的?

Kafka 的整体架构非常简单,是分布式架构,Producer、Broker 和Consumer 都可以有多个。 1.Producer,Consumer 实现 Kafka 注册的接口。 

2.数据从 Producer 发送到 Broker 中,Broker 承担一个中间缓存和分发的作用。 

3.Broker 分发注册到系统中的 Consumer。Broker 的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。 

4.客户端和服务器端的通信,是基于简单,高性能,且与编程语言无关的 TCP 协议。 几个重要的基本概念: Topic:特指 Kafka 处理的消息源(feeds of messages)的不同分类。 Partition:Topic 物理上的分组(分区),一个 Topic 可以分为多个 Partition 。每个 Partition 都是一个有序 的队列。Partition 中的每条消息都会被分配一个有序的 id(offset)。 

replicas:Partition 的副本集,保障 Partition 的高可用。  leader:replicas 中的一个角色,Producer 和 Consumer 只跟 Leader 交互。  follower:replicas 中的一个角色,从 leader 中复制数据,作为副本,一旦 leader 挂掉,会从它 的 followers 中选举出一个新的 leader 继续提供服务。

Message:消息,是通信的基本单位,每个 Producer 可以向一个Topic(主题)发布一些消息。 

Producers:消息和数据生产者,向 Kafka 的一个 Topic 发布消息的过程,叫做 producers 。 

Consumers:消息和数据消费者,订阅 Topic ,并处理其发布的消息的过程,叫做 consumers 。 

Consumer group:每个 Consumer 都属于一个 Consumer group,每条消息只能被 Consumer group 中的一个 Consumer 消费,但可以被多个 Consumer group 消费。

Broker:缓存代理,Kafka 集群中的一台或多台服务器统称为 broker 。

Controller:Kafka 集群中,通过 Zookeeper 选举某个 Broker 作为 Controller ,用来进行 leader election 以及 各种 failover 。

ZooKeeper:Kafka 通过 ZooKeeper 来存储集群的 Topic、Partition 等元信息等。

2、Kafka 和 RocketMQ的区别。

😈 单纯角色来说,Kafka 和 RocketMQ 是基本一致的。比较明显的差异是: RocketMQ 从 Kafka 演化而来。 

1、Kafka 使用 Zookeeper 作为命名服务;RocketMQ 自己实现了一个轻量级的 Namesrv 。 

2、Kafka Broker 的每个分区都有一个首领分区;RocketMQ 每个分区的“首领”分区,都在 Broker Master 节 点上。

RocketMQ 没有首领分区一说,所以打上了引号。

3、Kafka Consumer 使用 poll 的方式拉取消息;RocketMQ Consumer 提供 poll 的方式的同时,封装了一 个 push 的方式。 

RocketMQ 的 push 的方式,也是基于 poll 的方式的封装。

… 当然还有其它 …

3、Kafka的应用场景有那些?

1)消息队列 

比起大多数的消息系统来说,Kafka 有更好的吞吐量,内置的分区,冗余及容错性,这让 Kafka 成为了一个很好的 大规模消息处理应用的解决方案。消息系统一般吞吐量相对较低,但是需要更小的端到端延时,并常常依赖于 Kafka 提供的强大的持久性保障。在这个领域,Kafka 足以媲美传统消息系统,如 ActiveMQ 或 RabbitMQ 。 

2)行为跟踪 Kafka 的另一个应用场景,是跟踪用户浏览页面、搜索及其他行为,以发布订阅的模式实时记录到对应的 Topic 里。那么这些结果被订阅者拿到后,就可以做进一步的实时处理,或实时监控,或放到 Hadoop / 离线数据仓库里 处理。

3)元信息监控 作为操作记录的监控模块来使用,即汇集记录一些操作信息,可以理解为运维性质的数据监控吧。

4)日志收集 

日志收集方面,其实开源产品有很多,包括 Scribe、Apache Flume 。很多人使用 Kafka 代替日志聚合(log aggregation)。日志聚合一般来说是从服务器上收集日志文件,然后放到一个集中的位置(文件服务器或 HDFS)进行处理。 然而, Kafka 忽略掉文件的细节,将其更清晰地抽象成一个个日志或事件的消息流。这就让 Kafka 处理过程延迟更 低,更容易支持多数据源和分布式数据处理。比起以日志为中心的系统比如 Scribe 或者 Flume 来说,Kafka 提供 同样高效的性能和因为复制导致的更高的耐用性保证,以及更低的端到端延迟。

5)流处理 这个场景可能比较多,也很好理解。保存收集流数据,以提供之后对接的 Storm 或其他流式计算框架进行处理。 很多用户会将那些从原始 Topic 来的数据进行阶段性处理,汇总,扩充或者以其他的方式转换到新的 Topic 下再继 续后面的处理。 例如一个文章推荐的处理流程,可能是先从 RSS 数据源中抓取文章的内容,然后将其丢入一个叫做“文章”的 Topic 中。后续操作可能是需要对这个内容进行清理,比如回复正常数据或者删除重复数据,后再将内容匹配的结果返 还给用户。这就在一个独立的 Topic 之外,产生了一系列的实时数据处理的流程。Strom 和 Samza 是非常著名的 实现这种类型数据转换的框架。

6)事件源 

事件源,是一种应用程序设计的方式。该方式的状态转移被记录为按时间顺序排序的记录序列。Kafka 可以存储大 量的日志数据,这使得它成为一个对这种方式的应用来说绝佳的后台。比如动态汇总(News feed)。

7)持久性日志(Commit Log) 

Kafka 可以为一种外部的持久性日志的分布式系统提供服务。这种日志可以在节点间备份数据,并为故障节点数据 回复提供一种重新同步的机制。Kafka 中日志压缩功能为这种用法提供了条件。在这种用法中,Kafka 类似于 Apache BookKeeper 项目。

4、mybatis中当实体类中的属性名和表中的字段名不一样,怎么办?

第一种, 通过在查询的 SQL 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。代码如下:

<select id="selectOrder" parameterType="Integer" resultType="Order">     SELECT order_id AS id, order_no AS orderno, order_price AS price    FROM orders         WHERE order_id = #{id} </select>

这里,还有几点建议: 

1、数据库的关键字,统一使用大写,例如: SELECT 、 AS 、 FROM 、 WHERE 。 

2、每 5 个查询字段换一行,保持整齐。 

3、 , 的后面,和 = 的前后,需要有空格,更加清晰。 

4、 SELECT 、 FROM 、 WHERE 等,单独一行,高端大气。

第二种,是第一种的特殊情况。大多数场景下,数据库字段名和实体类中的属性名差,主要是前者为下划线风格, 后者为驼峰风格。在这种情况下,可以直接配置如下,实现自动的下划线转驼峰的功能。

<setting name="logImpl" value="LOG4J"/>    <setting name="mapUnderscoreToCamelCase" value="true" /></settings>

😈 也就说,约定大于配置。非常推荐!

第三种,通过 <resultMap> 来映射字段名和实体类属性名的一一对应的关系。代码如下:

<resultMap type="me.gacl.domain.Order" id=”OrderResultMap”>     <!–- 用 id 属性来映射主键字段 -–>     <id property="id" column="order_id">     <!–- 用 result 属性来映射非主键字段,property 为实体类属性名,column 为数据表中的属性 -–>     <result property="orderNo" column ="order_no" />     <result property="price" column="order_price" /></resultMap>
<select id="getOrder" parameterType="Integer" resultMap="OrderResultMap">         SELECT *          FROM orders          WHERE order_id = #{id} </select>

此处 SELECT * 仅仅作为示例只用,实际场景下,千万千万千万不要这么干。用多少字段,查询多少字段。 相比第一种,第三种的重用性会一些。

5、Mybatis 动态 SQL 是做什么的?都有哪些动态 SQL ?能简述一 下动态 SQL 的执行原理吗?

Mybatis 动态 SQL ,可以让我们在 XML 映射文件内,以 XML 标签的形式编写动态 SQL ,完成逻辑判断和动 态拼接 SQL 的功能。 

Mybatis 提供了 9 种动态 SQL 标签: <if /> 、 <choose /> 、 <when /> 、 <otherwise /> 、 <trim /> 、 <where /> 、 <set /> 、 <foreach /> 、 <bind /> 。 

其执行原理为,使用 OGNL 的表达式,从 SQL 参数对象中计算表达式的值,根据表达式的值动态拼接 SQL ,以此来完成动态 SQL 的功能。

6、MySQL 中 varchar 与 char 的区别?varchar(50) 中的 50 代表的涵义?

1、varchar 与 char 的区别,char 是一种固定长度的类型,varchar 则是一种可变长度的类型。 

2、varchar(50) 中 50 的涵义多存放 50 个字符。varchar(50) 和 (200) 存储 hello 所占空间一样,

但后者在排序时会消耗更多内存,因为 ORDER BY col 采用 fixed_length 计算 col 长度(memory引擎也一 样) 。

所以,实际场景下,选择合适的 varchar 长度还是有必要的。

7、一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 MySQL 重启, 再 insert 一条记录,这条记录的 ID 是 18 还是 15?

一般情况下,我们创建的表的类型是 InnoDB ,如果新增一条记录(不重启 MySQL 的情况下),这条记录的 ID 是18 ;但是如果重启 MySQL 的话,这条记录的 ID 是 15 。因为 InnoDB 表只把自增主键的大 ID 记录 到内存中,所以重启数据库或者对表 OPTIMIZE 操作,都会使大 ID 丢失。 

但是,如果我们使用表的类型是 MyISAM ,那么这条记录的 ID 就是 18 。因为 MyISAM 表会把自增主键的 大 ID 记录到数据文件里面,重启 MYSQL 后,自增主键的大 ID 也不会丢失。

最后,还可以跟面试官装个 x ,生产数据,不建议进行物理删除记录。

8、为什么 SELECT COUNT(*) FROM table 在 InnoDB 比 MyISAM 慢?

对于 SELECT COUNT(*) FROM table 语句,在没有 WHERE 条件的情况下,InnoDB 比 MyISAM 可能会慢很 多,尤其在大表的情况下。因为,InnoDB 是去实时统计结果,会全表扫描;而 MyISAM 内部维持了一个计数器, 预存了结果,所以直接返回即可。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java面试

    自己经验有限,篇幅也有限,这里只是记录一些比较容易混淆或有难度和一些易忘的技术知识点,里面有一些也是面试阿里经常会被问到的问题,但是不保证答案全部正确,有错误的...

    MasterVin
  • java面试

    当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方...

    大学里的混子
  • JAVA面试

    不是,String是一个类 而java的8大基本数据类型分别是: 逻辑类 boolean 文本类 char 整数类 byte, short, int, long...

    用户7886150
  • Java 面试题 —— 零度 Java 面试题系列

    芋道源码
  • Java面试——Java基础

    Java语言中一共提供了8种原始的数据类型(byte,short,int,long,float,double,char,boolean),这些数据类型不是对象,...

    Java架构师必看
  • Java面试 | 002

    由于静态块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态块实现输出“HELLO WORLD”的功能。

    Java猫说
  • Java面试-interrupt

    我们都知道,Java中停止一个线程不能用stop,因为stop会瞬间强行停止一个线程,且该线程持有的锁并不能释放。大家多习惯于用interrupt,那么使用它又...

    健程之道
  • java面试题

    当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)...

    黑泽君
  • Java面试题

    抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。

    闲花手札
  • Java面试:2021.05.30

    1、什么是悲观锁?什么是乐观锁? 1)悲观锁 它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在 整个数据...

    夕梦
  • Java面试:2021.05.31

    用mybatis对第三条数据进行修改时,希望赋值的更改,未赋值的不更改,测试运行;

    夕梦
  • Java面试:2021.06.01

    每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程...

    夕梦
  • Java面试:2021.05.26

    springmvc4.2版本以上解决跨域问题只需要在controller中添加@CrossOrigin注解就可以解决跨域问题,前端正常发出ajxa请求的时候,返...

    夕梦
  • Java面试:2021.05.27

    2. IOC 的意思是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到 Spring 容器中,并由容器根据...

    夕梦
  • Java面试:2021.05.28

    大体来说,经历以下过程:接口需求调研、接口测试工具选择、接口测试用例编写、接口测试执行、接口测试回归、接口测试自动化持续集成。具体来说,接口测试流程分成以下九步...

    夕梦
  • Java面试:2021.05.18

    线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。

    夕梦
  • Java面试:2021.05.19

    在微服务架构下,多个服务之间通常会定义明确上下游关系,下游系统可以依赖上游系统,下游系统可以通过API查询或修改上游系统的数据;反过来则不然,上游系统不应该知道...

    夕梦
  • Java面试:2021.05.21

    TCP/IP 模型将 OSI 模型由七层简化为四层,传输层和网络层被完整保留,因此网络中最核心的技术就是传输层和网络层技术。

    夕梦
  • Java面试:2021.05.22

    对于springboot而言可以讲解一下自动装配、微服务与分布式的区别这两个点,有的可能会涉及与spring等框架的区别和常用注解。

    夕梦

扫码关注云+社区

领取腾讯云代金券