nacos
服务注册:服务提供者在启动时向Nacos注册自己的服务信息,包括服务名、IP地址、端口号等信息。服务注册成功后,Nacos会将服务信息保存在自己的服务注册表中。
服务发现:服务消费者在启动时向Nacos发起服务发现请求,Nacos会返回所有可用的服务提供者列表。服务消费者可以根据自己的负载均衡策略选择其中一个服务提供者进行调用。
springboot启动流程(简)
- 加载Spring Boot启动类:
- Spring Boot通过Java的反射机制加载启动类(即带有
@SpringBootApplication
注解的类)。
- Spring Boot通过Java的反射机制加载启动类(即带有
- 初始化Spring Application上下文:
- 创建一个Spring Application上下文(ApplicationContext),用于容纳整个应用程序的Bean。
- 执行自动配置:
- Spring Boot会根据classpath下的约定配置文件或自定义配置,自动初始化各个组件和设置默认配置。
- 扫描并加载Bean定义:
- Spring Boot会扫描启动类所在包及其子包,查找带有
@Component
及其衍生注解的类,然后将其实例化为Bean。
- Spring Boot会扫描启动类所在包及其子包,查找带有
- 运行应用程序:
- Spring Boot会运行Spring Application上下文,启动Web服务器(如Tomcat、Jetty等),处理HTTP请求并执行相关业务逻辑。
什么是分布式锁?
分布式锁是一种用于在分布式系统中实现并发控制的机制。在分布式系统中,多个节点同时访问共享资源时可能会出现并发冲突的问题,分布式锁就是为了解决这个问题而设计的。
单例bean和多例bean的区别是什么?
- 创建和生命周期:
- 单例Bean在容器启动时创建,并存储在Spring容器中,容器只创建一个实例并共享给所有的依赖。
- 多例Bean在每次请求时被创建,每次获取时都会创建一个新的实例。
- 实例的共享和隔离:
- 单例Bean是共享的,所有的依赖都会共享同一个实例,因此对单例Bean的修改会影响到其他所有依赖。
- 多例Bean是隔离的,每次获取新的实例,各自独立,对多例Bean的修改不会影响其他实例。
- 状态管理:
- 单例Bean的状态是被共享的,需要注意状态的线程安全性和对共享资源的操作。
- 多例Bean的状态是独立的,不需要关注状态的线程安全性。
- 性能和资源消耗:
- 单例Bean由于只创建一次,且在容器启动时创建,可以减少多个实例创建和销毁的开销,但需要注意单例Bean的生命周期管理并避免长时间占用资源。
- 多例Bean在每次获取时都需要创建新的实例,可能增加内存消耗和对象创建的开销。
什么是服务的熔断?
务的熔断(Circuit Breaker)是一种用于保护分布式系统的设计模式。它的目的是在系统出现故障或不可用的情况下,防止故障的扩散并提供优雅的降级处理。
熔断器内部维护了一个状态,当服务调用失败的次数超过一定阈值时,熔断器会进入打开状态(Open State),此时熔断器将拒绝后续服务请求,直接返回一个预先设定的错误响应(Fallback)。在一段时间后,熔断器会进入半打开状态(Half-Open State),允许部分流量通过,如果这部分流量成功调用,则将熔断器重置为闭合状态(Close State)。如果流量调用仍然失败,熔断器将重新进入打开状态。
服务熔断的优点包括:
- 降低故障的影响范围:当某个服务出现问题时,熔断器可以快速拒绝对该服务的请求,避免出现雪崩效应,保护系统的稳定性。
- 快速响应失败:熔断器可以立即返回一个预先定义的错误响应或者默认值,而不是无限制等待超时,从而提高系统的响应速度。
- 服务降级:当熔断器进入打开状态时,可以通过设定的错误响应或者备用方法(Fallback)来提供一定程度的服务降级,保证系统的部分功能依然可用。
es的分片
ES的索引库由多个分片 shard组成,shard分为primary shard主shad和replica shard 副本,主shard承担写请求,replica副本的数据从primary复制而来,同时分担读请求,primary shard的数量设定了就不能修改,replica数量可以修改。
springboot和springcloud 区别和联系是什么_
联系:
- Spring Boot是Spring Cloud的基础,Spring Cloud构建在Spring Boot之上,利用了Spring Boot的快速启动和自动配置能力。
- Spring Boot和Spring Cloud都是由Spring团队维护和支持,它们都遵循Spring框架的设计原则和理念,因此在使用上有着很高的兼容性和一致性。
区别:
- Spring Boot关注于简化和快速构建独立的Spring应用程序,帮助开发者快速启动和配置Spring项目。
- Spring Cloud关注于构建分布式应用程序和微服务架构,提供了一整套工具和框架来实现服务注册与发现、负载均衡、断路器、分布式配置等功能。
在微服务项目中,不同服务类型的服务流程会有一些区别。
- API Gateway 服务:
- 路由和负载均衡:API Gateway 作为整个微服务架构的入口,负责接收客户端请求并进行路由和负载均衡,将请求转发到相应的微服务实例。
- 身份认证和授权:API Gateway 可以处理身份认证和授权,确保只有经过验证的请求才能访问内部微服务。
- 请求转换和聚合:API Gateway 可以对请求进行转换,将多个微服务的请求聚合为一个请求,从而减少客户端的网络开销。
- 业务微服务:
- 领域逻辑处理:业务微服务负责处理特定的业务逻辑,例如订单服务、用户服务等。它们接收来自 API Gateway 或其他微服务的请求,根据业务需求进行处理,并返回结果。
- 数据存储和访问:业务微服务可能需要与数据库或其他存储系统进行交互,包括读取和写入数据。
- 内部通信:业务微服务之间可能需要进行内部通信,例如通过消息队列或事件总线进行异步通信。
- 认证与授权服务:
- 用户认证:认证服务负责验证用户的身份,例如使用用户名密码、令牌或第三方身份提供者进行认证。
- 授权管理:授权服务负责管理用户的权限和访问控制,确定用户是否有权访问某个资源或执行某个操作。
- 配置管理服务:
- 配置存储和管理:配置管理服务用于存储和管理微服务的配置信息,例如数据库连接信息、外部服务的 URL 等。
- 配置更新和分发:配置管理服务可以检测配置的更改,并将更新的配置信息分发给相应的微服务,以便它们可以及时应用新的配置。
哪些情况下会导致redis的阻塞?
- 命令阻塞:
- 当某个客户端在执行阻塞式命令(如
BLPOP
、BRPOP
、BRPOPLPUSH
等)时,如果对应的键没有可用的数据,该命令将会阻塞等待,直到有数据可用或超过指定的超时时间。
- 当某个客户端在执行阻塞式命令(如
- 客户端阻塞:
- 当 Redis 客户端的连接池被全部占用且无可用连接时,新的客户端请求将会被阻塞,直到有可用的 Redis 连接被释放。
- 存储满阻塞:
- 当 Redis 的内存存储占满时,再执行写入操作将会阻塞,直到有足够的内存空间可用。
- 数据持久化阻塞:
- 如果 Redis 正在进行 AOF(Append Only File)或 RDB(Redis Database Dump)持久化操作,其他客户端写入操作可能会因等待持久化操作的完成而阻塞。
- 主从同步阻塞:
- 当 Redis 主节点与从节点进行数据同步时(全量复制或增量复制),主节点可能会因为同步操作而出现阻塞。
- 其他操作的阻塞:
- 在某些 Redis 服务器使用了配置选项或扩展插件,如 Lua 脚本、事务等,这些操作可能会导致 Redis 在执行期间进行阻塞。
线上redis的响应慢,处理思路_
1.查看服务器的情况,判读是是否是网络还是硬件问题
2.优化查询(批量操作,合适的数据结构)
3.优化配置(最大连接数,内存配置)
4.集群和分片 : 进行读写分离
5.数据预热
Springboot的自动装配
springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,
并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理。
这样我们就不需要手动去配置这些Bean对象,而是通过自动装配的方式来实现。
在启动类上使用注解@SpringBootApplication,可以让Spring Boot自动扫描当前包及其子包下的所有组件,并将它们注入到Spring容器中
springboot自动配置原理?
Spring Boot的自动配置是通过@EnableAutoConfiguration注解实现的
springboot的自动配置原理主要基于 条件注解@Condition和条件判断的机制,它通过扫描类路径上的依赖,通过注解和配置文件的方式来发现可用的配置类.然后再自动注册到Spring容器中. 降低了开发者的配置负担,提供了约定大于配置的方式来快速构建Spring应用程序.
使用mybatis的时候写的mapper接口方法能不能重载?
在使用MyBatis时,Mapper接口的方法是不能重载的。这是因为MyBatis通过Mapper接口的方法与SQL语句进行映射,
重载方法会导致映射关系模糊不清,无法确定具体执行哪个SQL语句。
@Bean的作用
1.标记一个方法,将方法的返回值对象,注册成Sping的对象
2.自定义bean的创建逻辑,
3.实现了依赖注入
4.可以通过@Bean注解中指定@Scope来控制bean的作用域对象
5.整合第三方库
zull和gateWay的区别
他们都是构建微服务网关的主键.
zuul是Netflix开发的 现在已经停止更新了.使用的是传统的Servlet技术栈
GateWay则使用的是Spring5 Reactor SpringBoot2做的
GateWay使用的非阻塞的IO模型 zull使用的是阻塞IO 在高并发的情况下GateWay性能比zull好
gateWay还支持 请求过滤,熔断,负载均衡等等高级功能.
为什么使用Rocetmq??
异步解耦,削峰填谷,数据收集
RocetMQ与rabbitMQ区别??
Rocketmq 底层是java语言,rabbitMQ用Erlang语言写的.
RocketMQ的可靠性和可用性都要比RabbitMQ要高.
RocketMQ支持百万级的QPS RabbitMQ只支持万级/
RocketMQ启动流程?
1.先启动NameServer,监听端口,等待Broker,Producer和Consumer的连接
2.Broker启动,与NameServer建立长连接.定时发送心跳包.里面包含了Broker的信息(ip和端口等)还有存储的topic信息
注册成功后Broker和Topic就有映射关系了
3.发送消息前都要先创建Topic 指定在哪个broker上,也可以在发送信息的自动创建.
4,生产者Producer 发送消息,先启动,与NameServer建立长连接,根据Topic信息找到对应的Broker,与Broker建立连接,轮询的选择一个队列,发信息到Broker里面
5.消费者ConSumer 消费信息是 先启动与NameServer建立长连接,根据Topic找到Broker,与Broker建立通道开始消费.
RoketMQ的消息拉取方式?
消费方式 拉取式,和推送式 默认的消息消费方式是Pull模式
拉取式pull:消费者主动的去遍历队列拿到消息.: 实时性差,但是便于控制
推送式push:封装了Queue的遍历,实时性高,但是消耗性能
消息消费模式?
广播模式:一对多, 一个消费者组所有的消费者会收到同一个topic的消息(一个消息可以被消费多次)
集群模式:一对一的消费,同一个消息只被消费一次
Queue如何分配给消费者的?
1.平局分配
2.环形分配
3.一致性Hash
4.同机房
消息的清理?
消息不会被单独清理.顺序存储到commitlog里面,以commitlog为单位进行清理.默认72小时清理
到达时间清理点,自动清理过期时间
磁盘空间到达75%,自动清理过期文件
磁盘空间85% ,从老文件开始清理
90% 就拒绝写入.
RocketMQ的消费顺序?顺序消息?
分为全局有序和部分(分区)有序
全局有序是topic下的消息都是有序被消费的,首先生产者发送消息只到一个队列中,一个消费者来消费信息.
producer.setDefaultTopicQueueNums(1); MessageListenerOrderly
部分有序:只需要保证一组的消息 是 顺序消费的 用MessageQueueSelector 来保证同类型的消息在一个队列中.
RocketMQ的延迟消息??
把消息写入Broker后需要一段时间后才能被消费.我们可以修改配置文件来修改延迟时间.
生产者发送延迟消息,指定延迟等级,
broker收到消息 并且将信息写入commit log中
broker根据消息的延迟等级放入对应的延迟队列中.
broker会创建一个定时任务,定期的扫描延迟队列中的消息,看是否到达投递时间,
到达投递时间 就将消息转移到对应的消息队列中 给消费者消费.
事务消息的原理
1.事务发起方A 向broker发送一个prepare"半事务消息"到 事务的Topic 的 Queue中,该消息对消费者不可见.
2.mq会返回一个AKC确认信息发送成功还是失败
3.消息发送成功,服务A执行业务逻辑,提交本地事务,并根据本地事务的执行结果来决定半消息的状态为 提交或是回滚
4.当本地事务提交成功,事务发起方A服务给broker发送结束半事务的消息 修改状态为 commit ,事务执行失败就rollback
5.brocker收到请求以后,将 半消息Topic 中查出来 看它3的状态为commit 者将消息转移到其对应的消息消费队列中
若是为Rollback则不管,
6.Producer的半消息发送是单向的oneWay ,无法保证消息一定被提交了, 里面有一个消息反查机制, 从半消息队列中读取
超时未完成的消息,将每一条消息都给Producer发送反查.来决定提交还是回滚.
7.消费者 消费消息,执行它的业务.
MP中主键算法有哪些??
自增主键(AUTO):即数据库自增长主键,主键由数据库自动生成。
分配器主键(ID_WORKER)
UUID主键(UUID)
全局唯一ID主键(ID_WORKER_UUID)
雪花算法主键(SNOWFLAKE):
字符串主键(ASSIGN_ID)
2PC
是一种分布式事务的解决方案,是一种协议,确保分布式系统中进行的事务的原子性和
一致性。
分为两个阶段 第一阶段 参与者会投票是否提交事务。第二阶段则会根据投票结果看是否
提交事务,大多数同意则会提交事务,否则回滚。
seata的2pc和传统2pc
架构层次上不同,传统的RM是在数据库自身,Seata的RM是以jar的
形式作为中间层部署在应用程序上。
两个提交阶段上不同,seata的在第一阶段就已经提交了。提高了效率
性能方面:seata不会长时间占用连接资源,零侵入。
Hystrix如何实现限流?
通过线程池或者信号量判断是否已满,超出容量的请求直接降级,以达到限流的作用。在springcloud架构的系统中,可以在网关启用Hystrix,进行限流处理,每个微服务也可以各自启用Hystrix进行限流
- 线程池隔离:通过将每个依赖服务的调用放入独立的线程池中,可以对每个依赖服务设置最大并发数限制,从而实现限流。当达到最大并发数时,通过 Hystrix 的线程池机制可以拒绝新的请求或者加入队列等待执行。
- 信号量隔离:与线程池隔离不同,信号量隔离是在同一个线程中处理依赖服务的调用。通过设置信号量的数量限制,可以对并发调用进行限流控制。
- Fallback: 通过在 Hystrix Command 中定义 fallback 函数,可以在服务调用失败或超时时返回一个默认值或执行备选逻辑,从而减少异常情况的影响。
- 请求缓存:对于相同的请求,可以在 Hystrix Command 中开启请求缓存来提高性能。缓存可以减少对依赖服务的调用频率,从而间接实现对依赖服务的限流。、
@Bean
是一个常用的注解,在Spring框架中用于将方法返回的对象注册为一个Bean,并交由Spring容器管理。
ES中的DSL查询
DSL就是使用json的请求体格式来实现复杂的查询
DSL有DSL查询 和 DSL过滤
DSL过滤查询文档的方式更像是对于我的条件"有"或者"没有"(等于 ;不等于),而DSL查询语句则像是"有多像"(模糊查询)。
DSL过滤和DSL查询在性能上的区别:
-
过滤结果可以缓存并应用到后续请求。-> 精确过滤后的结果拿去模糊查询性能高
-
查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。
-
过滤语句可有效地配合查询语句完成文档过滤。
总结:需要模糊查询(分词查询)的使用DSL查询 ,需要精确查询的使用DSL过滤,在开发中组合使用(组合查询) ,关键字查询使用DSL查询,其他的都是用DSL过滤。
分布式锁
为什么需要分布式锁??
因为在分布式场景中我们需要保证一个方法在同一时间段只被一个线程执行。
分布式锁实现
- 基于数据库操作
- 基于redis操作 缓存和过期时间
- 基于zookeeper 临时顺序节点+watch
原生的redis实现分布式锁??
1 setnx(如果不存在才设置成功)+del没有可以就添加 setnx goods_id = 1 del goods_id
2 expire+watchdog续约时间(不好做,我不做)
3 value是uuid,获取判断,删除
4 lua脚本(确保1,2步的原子性)
Redisson实现分布式锁?
1.引入依赖
2.创建连接
3.获取锁对象(锁资源是唯一的)
4.try…cathch…final 里面加锁 锁里面的执行逻辑
5.final里面解锁
1.Java中基本数据类型有哪些?
2.为什么要使用引用数据类型?
java是面向对象的语音,用引用类型更加符合java的规范.
引用类型里面有更多的方法,可以对值进行修改,可以设置为null
方便类型之间的转换.
3.== 和 equals 的区别是什么?
4.面向对象四大特性?
5.介绍一下Spring ?
6.怎么解决Spring循环依赖?
- 构造函数注入:
- 将依赖注入方式改为构造函数注入,即通过构造函数将依赖对象作为参数传递给其他Bean。
- 这种方式要求构造函数参数必须是依赖对象的接口或抽象类,而不能是具体的实现类。
- 使用Setter注入:
- 将依赖注入方式改为Setter注入,即通过Setter方法将依赖对象设置给其他Bean。
- 这种方式要求依赖对象的Setter方法必须定义在接口或抽象类中,而不能是具体的实现类。
- 使用@Lazy注解:
- 在依赖注入点上使用@Lazy注解,将依赖对象设置为懒加载。
- 这样可以延迟创建依赖对象的实例,从而避免循环依赖的发生。
7.@Autowaire和@Resource
8.怎么防止sql注入?
9.SpringMVC的执行原理 ?
- 客户端发送请求到前端控制器DispatcherServlet。
- DispatcherServlet接收到请求后,根据配置的处理器映射器HandlerMapping,将请求映射到对应的处理器Handler。
- HandlerAdapter将请求交给对应的处理器Handler进行处理。
- 处理器Handler执行业务逻辑,并返回ModelAndView对象,包含要渲染的数据模型和视图。
- HandlerAdapter将处理器Handler返回的ModelAndView对象传递给DispatcherServlet。
- DispatcherServlet通过视图解析器ViewResolver解析出具体的视图View。
- DispatcherServlet将处理结果Model和View传递给渲染器ViewRenderer进行视图渲染。
- 渲染后的视图响应给客户端。
10。SpringMVC的Controller是单例还是多例,有没有并发安全问题,如何解决?
11.SringBoot自动装配原理?
启动类的@SpringBootApplication注解由@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解组成,三个注解共同完成自动装配;
@SpringBootConfiguration 注解标记启动类为配置类
@ComponentScan 注解实现启动时扫描启动类所在的包以及子包下所有标记为bean的类由IOC容器注册为bean
@EnableAutoConfiguration通过 @Import 注解导入 AutoConfigurationImportSelector类,然后通过AutoConfigurationImportSelector 类的 selectImports 方法去读取需要被自动装配的组件依赖下的spring.factories文件配置的组件的类全名,并按照一定的规则过滤掉不符合要求的组件的类全名,将剩余读取到的各个组件的类全名集合返回给IOC容器并将这些组件注册为bean
12.SpringBoot启动流程?
- 加载启动类:
- Spring Boot的启动类是一个普通的Java类,通常使用
@SpringBootApplication
注解进行标记。 - 在启动过程中,首先会加载启动类,创建并启动一个Spring Application上下文。
- Spring Boot的启动类是一个普通的Java类,通常使用
- 扫描并加载配置:
- Spring Boot会扫描指定包及其子包下的所有类,查找带有Spring注解的组件。
- 同时会根据约定的配置文件位置(
application.properties
或application.yml
)加载应用程序的配置。
- 自动装配Bean:
- Spring Boot根据类路径上的依赖和自动配置机制,自动装配和创建各种Bean实例。
- 自动装配的条件是根据约定和自动配置类进行判断,只有满足条件的配置才会被加载进Spring容器。
- 初始化ApplicationContext:
- 创建并初始化Spring的ApplicationContext,其中包括创建Bean实例、处理Bean的依赖关系和执行Bean的初始化方法等。
- ApplicationContext是整个Spring应用程序的核心容器,用于管理和维护各种Bean的生命周期。
- 启动Spring Boot应用:
- 启动Spring Boot应用程序后,会执行各种配置的业务逻辑和处理请求的流程。
- 例如,启动Web应用时,会创建嵌入式的Web容器,并监听指定的端口,处理HTTP请求。
13.MyBatis对象关联查询和集合关联查询怎么做?
14.MyBatis一级缓存和二级缓存的区别?
- 一级缓存:
- 一级缓存是默认开启的,它是指在同一个SqlSession内部的缓存。
- 当执行相同的查询时,MyBatis会先从一级缓存中查找,如果找到则直接返回缓存中的结果,而不再去数据库中查询。
- 一级缓存的生命周期与SqlSession相同,当SqlSession关闭时,一级缓存也会被清空。
- 二级缓存:
- 二级缓存是跨SqlSession的缓存,在多个SqlSession之间共享。
- 二级缓存的配置是在Mapper的XML文件中进行的,需要手动开启和指定缓存的实现类。
- 当执行查询后,MyBatis会将查询结果存放到二级缓存中,下次查询相同的数据时,会先从二级缓存中查找。
- 默认情况下,MyBatis使用PerpetualCache作为二级缓存的实现类,可以通过配置其他的缓存实现类,如Ehcache、Redis等
15.MyBaits的Mapper接口没有实现类为社么可以用@Autowired直接注入?
Spring会根据配置和代理机制来创建代理对象,实现将Mapper接口和实际的SQL语句自动关联起来的功能。
16.MyBatis的动态SQL标签有哪些?
<if>
:用于判断条件是否成立,如果条件为true,则执行包含在<if>
标签内部的SQL语句。<choose>
、<when>
和<otherwise>
:用于实现多个条件的判断和选择,类似于Java中的switch-case语句。<trim>
:用于去除或添加SQL语句中的多余的内容,如去除WHERE或SET关键字,添加逗号等。<where>
:用于拼接WHERE子句,并根据条件决定是否添加WHERE关键字。<set>
:用于拼接UPDATE语句中的SET子句,并根据条件决定是否添加SET关键字。<foreach>
:用于循环遍历集合或数组,并将集合或数组中的元素作为参数,执行包含在<foreach>
标签内部的SQL语句。<bind>
:用于将表达式的值绑定到变量,在SQL语句中可以引用这些绑定的变量。<when>
:用于在XML中定义条件表达式,根据表达式的值判断是否执行相应的SQL语句。
17.为什么要用Redis?
18.怎么防止Redis宕机数据丢失问题?
19.哨兵模式?redis-cluster?
20.Redis的主从有什么优点,和缺点?
21.RabbitMQ的使用场景 ?
22.RabbitMQ如何防止消息丢失?
- 持久化消息:
- RabbitMQ支持将消息持久化到磁盘上,确保即使在RabbitMQ宕机后,消息也不会丢失。
- 在发送消息时,将消息的
delivery_mode
属性设置为2(持久化)。
- 开启事务:
- 可以通过开启事务来确保消息的可靠性投递。
- 在发送消息前,通过调用
channel.txSelect()
开启事务,然后在发送完消息后,调用channel.txCommit()
来提交事务,如果发送过程中出现异常,则调用channel.txRollback()
回滚事务。
- 设置消息确认机制(Confirm机制):
- RabbitMQ提供Confirm机制,可以确保消息的可靠性投递。
- 在发送消息前,通过
channel.confirmSelect()
开启Confirm模式,并监听ConfirmCallback
来处理确认的消息。
- 设置消息的可靠性投递(Publisher Confirms):
- RabbitMQ提供Publisher Confirms机制,可以确保消息被成功发送到Broker。
- 在发送消息前,通过
channel.confirmSelect()
开启Publisher Confirms,并监听ConfirmCallback
来处理确认的消息。同时设置channel.waitForConfirms()
来等待消息确认。
- 设置消息的备份和镜像队列:
- 可以通过设置备份交换机和备份队列来确保消息不会丢失。
- 当消息无法路由到绑定的队列时,可以将消息发送到备份交换机,并绑定备份队列,以备后续处理。
23.RabbitMQ的工作模型?
- 简单模式(Simple Mode):
- 一个生产者向一个队列发送消息,一个消费者从队列中接收并处理消息。典型的点对点模式。
- 工作模式(Work Mode):
- 一个生产者向一个队列发送消息,多个消费者从队列中竞争接收并处理消息。消息会被平均分配给各个消费者,每个消息只会被一个消费者处理。
- 发布/订阅模式(Publish/Subscribe Mode):
- 一个生产者将消息发送到交换机(Exchange),交换机根据绑定规则将消息发送给多个队列,每个队列绑定一个消费者进行处理。典型的广播模式。
- 路由模式(Routing Mode):
- 一个生产者将消息发送到交换机,交换机根据消息的路由键(Routing Key)将消息发送给指定的队列。消费者根据不同的路由键绑定到相应的队列进行处理。
- 主题模式(Topic Mode):
- 一个生产者将消息发送到交换机,交换机根据消息的主题(Topic)进行模糊匹配,并将消息发送给符合匹配规则的队列。消费者根据不同的主题绑定到相应的队列进行处理。
- RPC模式(Remote Procedure Call Mode):
- 客户端向服务端发送请求消息,服务端将响应结果返回给客户端。客户端和服务端之间通过队列进行通信,实现远程调用的功能。
24.事务消息原理?
25.rocketmq顺序消费?
26.ES的分层结构?
- 集群(Cluster)层:
- Elasticsearch集群由多个节点组成,可以是一个单独的服务器或多台服务器组成。集群层负责管理节点的发现、协调和请求转发。
- 节点(Node)层:
- 节点是集群中的一个成员,可以是一个独立的物理服务器或在同一台服务器上运行的多个进程。节点层负责处理请求、索引和搜索数据,并与其他节点进行通信。
- 索引(Index)层:
- 索引是逻辑上的数据存储单元,类似于关系型数据库中的数据库。一个索引可以包含多个文档,每个文档都有一个唯一的ID,用于进行检索和索引操作。
- 分片(Shard)层:
- 当一个索引变得很大时,Elasticsearch可以将其分成多个分片,每个分片都是一个独立的索引。分片层负责数据的分布和平衡,使得数据可以水平扩展和并行处理。
- 副本(Replica)层:
- 为了提高搜索和故障转移的可用性,Elasticsearch可以为每个分片创建多个副本。副本层负责维护分片的冗余备份,并提供故障转移和负载均衡的功能
27.ES分片?
28.ES添加文档的过程?
- 创建索引(Index):
- 首先,需要创建一个索引,用于存储相关文档。索引可以理解为类似于数据库中的表,用于组织和存储文档。
- 定义文档的映射(Mapping):
- 映射定义了文档中各个字段的数据类型和属性,相当于数据库表中的字段定义。映射可以自动创建,也可以手动创建并指定各个字段的属性。
- 添加文档(Document):
- 调用Elasticsearch的API,在指定的索引中添加文档。
- 文档是以JSON格式表示的数据,包含了各个字段的值。可以通过HTTP请求或Elasticsearch客户端库发送添加文档的请求。
- 文档的索引和存储:
- 当添加文档时,Elasticsearch会根据文档的索引名称和类型,将文档存储到相应的分片中。
- Elasticsearch使用倒排索引的方式来存储和索引文档数据,以支持快速搜索和检索。
- 检索和搜索文档:
- 添加文档后,可以通过搜索API进行文档的搜索和检索操作。可以使用查询语句或过滤器来指定搜索条件,并获取匹配条件的文档结果。
29.微服务错误定位?
30.gateway 路由,断言?
31.了解Redission的看门狗原理吗?
32.lua脚本?
33.线程池的创建方式?
34.线程池创建蟾酥?
35.InnoDB的索引结构和MyIsam的索引结构有什么区别?
36.哪些因素会造成索引失效 ?
37.Mysql的执行流程是怎么样的?
38.优化SQL你从哪些方面着手?
39.事务并发问题有哪些 ?