2021腾讯Java面试题精选,2021大厂Java面试题精选,

2021年09月15日 阅读数:1
这篇文章主要向大家介绍2021腾讯Java面试题精选,2021大厂Java面试题精选,,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

一、PTP模型

Point-to-Point,点对点通讯模型。PTP是基于队列(Queue)的,一个队列能够有多个生产者,和多个消费者。消息服务器按照收到消息的前后顺序,将消息放到队列中。队列中的每一条消息,只能由一个消费者进行消费,消费以后就会从队列中移除。面试

2021腾讯Java面试题精选,2021大厂Java面试题精选,

须要注意的是,尽管这里使用Queue的概念,但并非先进入队列消息,必定会被先消费。在存在多个下游Consumer状况下,一些消息中间件,例如ActiveMQ,为了提高消费能力,会将队列中的消息分发到不一样Consumer并行进行处理。这意味着消息发送的时候多是有序的,可是在消费的时候,就变成无序了。为了保证消费的有序,一些MQ提供了"专有消费者”或者"排他消费者”的概念,在这种状况下,队列中的消息仅容许一个消费者进行消费,若是存在多个消费者,那么从中选择一个。可是,这意味着在消息在处理中没有了并行性。若是消息量不少的状况下,将会产生消息积压。为了解决"专有消费者”的性能问题,一些消息中间件采用分区的概念来解决性能问题,咱们将在后文进行介绍。sql

二、Pub/Sub模型

publish-and- subscribe, 即发布订阅模型。在Pub/Sub模型中,生产者将消息发布到一个主题(Topic)中,订阅了该Topic的全部下游消费者,均可以接收到这条消息。以下图:编程

2021腾讯Java面试题精选,2021大厂Java面试题精选,

一般状况下,一个条消息只要被消费一次就好了,那么什么状况下须要全部的消费者都对这条消息进行消费呢?最典型的状况就是须要在内存中对数据进行缓存,并须要实时进行更新。例如,笔者作过一个违禁词系统,对用户输入的评论内容进行违禁词汇检测。这个违禁词系统,部署了在N台服务器上,为了提高检测性能,每台机器都会将违禁词库全量加载到内存中,词库的更新,是经过发送MQ消息来完成的。因为采用Pub/Sub模型,每台机器的consumer,均可以接收到这条消息,直接在内存中更新敏感词库便可。缓存

三、Partition模型

为了解决在PTP模型下,有序消息须要经过"专有消费者”消费带来的性能问题,一些消息中间件,如rocketmq,kafka采用了Partition模型,即分区模型,以下所示:服务器

2021腾讯Java面试题精选,2021大厂Java面试题精选,

生产者发送消息到某个Topic中时,最终选择其中一个Partition进行发送。你能够将Parition模型中的分区,理解为PTP模型的队列,不一样的是,PTP模型中的队列存储的是全部的消息,而每一个Partition只会存储部分数据。对于消息者,此时多了一个消费者组的概念,Paritition会在同一个消费者组下的消费者中进行分配,每一个消费者只消费分配给本身的Paritition。上图演示了不一样的消费者可能会分配到不一样数量的Paritition。Paritition模式巧妙的将PTP模型和Pub/Sub模型结合在了一块儿:markdown

对于PTP模型:并发

一条消息只会由一个消费者进行消费,而Partition模型中每一个分区最终也只会有一个消费者进行消费。对于经过"专有消费者"来保证全局消费有序的场景,在Partition模型中,只需保证建立的Topic只有一个Partition便可,这个Paritition最终也只会分配其中一个消费者。另外,在绝大部分场景下,咱们没有必要保证全局有序,例如一个订单产生了3条消息,分别是订单建立,订单付款,订单完成。消费时,要按照这个顺序消费才能有意义。可是订单之间是能够并行消费的,例如将订单1产生的3条消息发送到Partiton 1,将订单2产生的3条消息发送到Partition 2,如此便达到了不一样订单之间的并行消费。运维

对于Pub/Sub模型:ide

一条消息全部的下游消费者均可以进行消费。在Paritition模型中,只须要为每一个消费者设置成不一样的消费者组便可。然而,过多的消费者组,会给消息中间件运维带来麻烦。因此一些消息中间件,结合了Partition模型和Pub/Sub模型。例如RocketMQ,支持为消费者组设置消费模式,若是是集群模式,就按照上述描述进行消费,若是是广播模式,就按照Pub/Sub模型进行消费。固然,Partition模型也不全是优势,其最大的限制在于Partition数量是固定的(虽然能够调整),且只能够分配给其中一个消费者。当消费者的数量大于Partition数量时,这些多出来的消费者将没法消费到消息。一些消息中间件对此进行了优化,例如rocketmq,支持单个partition的并行消费。即在对单个消费者内,同时启动多个线程,来消费这个Partition中的数据,固然前提是要求消息不是有序的,对于有序的消息,只能使用一个线程按顺序消费这个Partition中的数据。性能

四、Transfer模型

Paritition模型中的消费者组概念颇有用,同一个Topic下的消息能够由多个不一样业务方进行消费,只要使用不一样的消费者组便可,不一样消费者组消费到的位置单独记录,互不影响。?可是,Paritition模型仍是限制了消费者数量不能多于分区数。所以,又有了另一种消费模型,笔者称之为Transfer模型,以下图所示:

2021腾讯Java面试题精选,2021大厂Java面试题精选,

生产者仍是将消息发送到Topic中,针对一个Topic,能够建立多个通道,这里称之为channel。与分区不一样的是,发送到Topic中的每条消息,都会转发到每一个channel,所以每一个channel都有这个Topic的全量数据。固然,没有必要把真的把消息体完整的拷贝一份到channel中,能够只记录一下消息元数据,表示有一条放到这个channel中了。消费者在消费消息时,必须指定从哪一个channel消费。多个消费者消费同一个channel时,每条消息只会有一个消费者消费达到,这一点与PTP模型相似。事实上,咱们能够认为,消费了同一个channel的消费者,就自动组成了一个消费者组。可是,与Partition模型不一样的是,这里没有分区的概念,所以消费者的数量能够是任意的。事实上,GO语言编写的NSQ消息中间件,采用的就是这种模型。固然,这种模型与PTP同样,也不能保证被消息有序,除非经过相似于”专用消费者”的概念。

那么如何才能正确的掌握Redis呢?

为了让你们可以在Redis上可以加深,因此此次给你们准备了一些Redis的学习资料,还有一些大厂的面试题,包括如下这些面试题

  • 并发编程面试题汇总

  • JVM面试题汇总

  • Netty常被问到的那些面试题汇总

  • Tomcat面试题整理汇总

  • Mysql面试题汇总

  • Spring源码深度解析

  • Mybatis常见面试题汇总

  • Nginx那些面试题汇总

  • Zookeeper面试题汇总

  • RabbitMQ常见面试题汇总

JVM常频面试:

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(一)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(二)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Redis常见面试题汇总(300+题)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

绝无套路!!