mq篇幅

mq的vhost组成—rabbitMq专有—暂不涉略
mq消息如何解决重复消费

  • 也就是如何确保幂等
  1. 发送消息的时候,将此时需要的状态传入,消费时,查询数据库的时候针对该状态进行校验,且最终更新的时候采用乐观锁进行更新
  2. 造成消息重复的根本原因是:网络不可达。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?

a. 消费端处理消息的业务逻辑保持幂等性
b. 保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现
第1条解决方案,很明显应该在消费端实现,不属于消息系统要实现的功能。第2条可以消息系统实现,也可以业务端实现。正常情况下出现重复消息的概率其实很小,如果由消息系统来实现的话,肯定会对消息系统的吞吐量和高可用有影响,所以最好还是由业务端自己处理消息重复的问题,这也是RocketMQ不解决消息重复的问题的原因。
RocketMQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。
mq解决高可用

  • 消息生产的高可用:创建topic时,把topic的多个message queue创建在多个broker组上。这样当一个broker组的master不可用后,producer仍然可以给其他组的master发送消息。 rocketmq目前还不支持主从切换,需要手动切换(rocketmq从4.5开始,提供了故障自动切换功能,当主从集群中的master故障后,可自动从多个slave中选举出master,完成故障转移,不需要人工操作)
  • 消息消费的高可用:consumer并不能配置从master读还是slave读。当master不可用或者繁忙的时候consumer会被自动切换到从slave读。这样当master出现故障后,consumer仍然可以从slave读,保证了消息消费的高可用

mq顺序消费,讲到在消息放到同一队列,如何保证消费的时候的顺序消费,比如A,B两个机器消费,A效率高,B效率低,如何解决

  • 要保证消息的顺序消费,有三个关键点
  1. 消息顺序发送: 可以由业务方在单线程使用同步发送消息的方式来保证
  2. 消息顺序存储: 可以由业务方将同一个业务编号的消息发送到一个队列中来实现(采用mq的MessageQueueSelector来使用)
  3. 消息顺序消费

第一点,消息顺序发送,多线程发送的消息无法保证有序性,因此,需要业务方在发送时,针对同一个业务编号(如同一笔订单)的消息需要保证在一个线程内顺序发送,在上一个消息发送成功后,在进行下一个消息的发送。对应到mq中,消息发送方法就得使用同步发送,异步发送无法保证顺序性
第二点,消息顺序存储,mq的topic下会存在多个queue,要保证消息的顺序存储,同一个业务编号的消息需要被发送到一个queue中。对应到mq中,需要使用MessageQueueSelector来选择要发送的queue,即对业务编号进行hash,然后根据队列数量对hash值取余,将消息发送到一个queue中
第三点,消息顺序消费,要保证消息顺序消费,同一个queue就只能被一个消费者所消费,因此对broker中消费队列加锁是无法避免的。同一时刻,一个消费队列只能被一个消费者消费,消费者内部,也只能有一个消费线程来消费该队列。即,一个消费队列同一时刻,只能被一个消费者中的一个线程消费

分库分表篇幅

分库分表的原理,思想和实施策略,代表框架mycat,sharding-JDBC,设计思想

数据库索引,如何优化,索引的数据结构是什么,索引失效的场景,什么是MVCC,等等,建议看
mysql优化

redis篇幅

redis无主节点模式;
redis主从模式,其中一个节点用到分布式锁,另一个节点没有,会造成数据不一致问题怎么解决?(无法解决)

设计模式篇幅

七大设计原则

  • 单一:解耦和增强内聚性(高内聚,低耦合)。
  • 里氏替换:在任何父类出现的地方都可以用他的子类来替代(子类应当可以替换父类并出现在父类能够出现的任何地方)
  • 依赖注入:要依赖于抽象,不要依赖于具体的实现
  • 开闭:对扩展开放,对修改关闭
  • 接口分离:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口当中.
  • 合成复用:尽量使用对象组合,而不是继承来达到复用的目的。该原则就是在一个新的对象里面使用一些已有的对象
  • 迪米特:一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

设计模式,你常用的设计模式有哪些?

  • 工厂模式:Spring IOC就是使用了工厂模式.
  • 代理模式:Spring AOP就是使用的动态代理。
  • jdk1.8提供的stream提供的内部迭代方式,通过访问者模式(Visitor)实现。

    线程池篇幅

    线程池重要参数,你一般用哪些线程池
    线程池的队列你能说说有哪几个,
    ArrayBlockingQueue如何实现阻塞队列的?数据结构是什么样的,是有界队列还是无界队列?
    还有LinkedBlockingQueue.
    ConcurrentHashMap1.7和1.8源码,put过程,get过程,红黑树你了解吗?
    put是怎么保证线程安全的?如何加的锁?

    分布式篇幅

    如果你了解分布式事务,可以看看seata.我看了一遍,大致了解思想
    你如何设计一个定时任务调度框架,分布式环境呢?

    spring boot篇幅

    springboot启动原理,三大注解
    boot定义:
    Spring Boot是伴随着Spring4.0共同诞生的,它的目的就是简化spring的配置及开发,并协助开发人员可以整体管理应用程序的配置而不再像以前那样需要做大量的配置工作,它提供了很多开发组件,并且内嵌了web应用容器,如tomcat和Jetty等。其目的便是使我们的开发变得简化并且能大幅度提高开发人员的开发效率,为了简化Spring功能的配置我们可以引入或启动我们需要的Spring功能。这样做的好处就是避免开发人员过多的对框架的关注,而把更多的精力与时间放在系统的业务逻辑代码中。
    boot作用:
    Spring Boot框架,其功能非常简单,便是帮助我们实现自动配置。我们都知道Spring Boot框架的核心是自动配置。只要有相应的jar包,Spring就会帮助我们实现自动配置,而无需像以前我们使用spring框架一样要做很多配置。当默认配置不能满足我们要求的时候,我们能够用自己的配置来替换这些自动的配置类。此外,上面我们也提到Spring Boot内嵌了web应用容器,除此之外还集成了系统监控等功能,这些都可以帮助我们快速搭建企业级的应用程序并使用。
    boot核心功能:
  1. 可以不依赖tomcat等外部容器来独立运行的web项目,springboot的优点是能够以jar包的形式运行。
  2. 嵌入式的Servlet容器:我们不需要像以前那边先打个war包,然后再运行,在springboot看来这些都是多余的,我们可以选择他内嵌的tomcat、Jetty或者Undertow等容器来直接运行。
  3. 使pom文件配置更简化:我们只需要在 pom 文件中添加starter-web 依赖即可,无需像以前一样引入很多依赖而造成容易漏掉。
  4. 能够生产环境中直接使用性能指标、健康检查和应用信息等。
  5. springboot不需要任何xml文件配置而能实现所有的spring配置。

三个注解:
@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解尤为重要。

springcloud全家桶组件,最好知道源码原理,比如你说说eureka的原理,讲讲

基础

HashMap1.7和1.8源码,为什么要用红黑树,红黑树好在哪里,如何转变成红黑树的?

java1.8新特性;

  • 允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法
  • lambda表达式
  • 函数式接口

JDK 1.8 新增加的函数接口:
java.util.function

  • 方法与构造函数引用

    1. Converter<String, Integer> converter = Integer::valueOf;
    2. Integer converted = converter.convert("123");
    3. System.out.println(converted); // 123
  • 新的date APi

  • hashmap增加红黑树
  • Stream流,

    场景化系列

    数据库表设计,有user表,现在有年龄,性别,身高这几个属性,以后想加属性,你怎么设计表,使表具备良好的扩展性。
    ps:表设计,有一个具体表,user:基本属性,加两个字段:cid 自身属性(类目):.ext的属性字段,存json,{“1”:“a”,”2”:”b”}
    配置表( id,cid,属性,字段,大小,类型)
    通过cid关联。

项目中用户user,order,shop
问题:在user 手机号模糊查询查询所有订单
(1)shop 微服务表中冗余手机号
(2) 创建订单的时候,将一些频繁查询的字段比如手机号存储到es的索引中,同步更新数据库 es
(3)创建订单的时候 查询条件形成一张表