控制xxl-job下次执行时间
项目场景:
目前项目引入了 xxl-job 来跑定时任务,但是存在一个问题,项目执行结束的时间不固定,有峰值,在高峰期的时候会出现长阻塞一直排队等待,如图:
问题描述需要做一种策略来解决长阻塞问题,精准控制下一次执行时间,尽量保证不空档
原因分析:1.上游接口的接口限流或者峰值压力导致返回超时2.高峰期数据量达到峰值处理不过来3.设置的执行间隔太短,执行不过来
解决方案:思路 编写一个cron表达式,时间一分钟一次,直接获取当前时间的下一次执行时间,并且更新到xxl-job的执行日志里面
注意 1.因为设置的1分钟59秒,所以在秒的位置设置了59,防止在59秒执行完更新超时,导致定时任务执行过时间
2.xxlJobInfo.setTriggerStatus(1); 设置这个,只需要点击立即执行就可以让它运行,但是后续可能需要加一个开关来控制需要执行的策略是一次或者多次
3.在xxl_job_info中schedule_conf是编写cron表达式,但是trigger_next_time才是下次执行时间,需要转为时间戳更新
实现方法12345678910111213 ...
秒杀架构
什么是秒杀(seckill)seckill是一个老生常谈的场景它一般出现在电商系统中,在某些特定的节日,限定特定商品数量以超低折扣进行促销引流按照秒杀的特性,特价商品一般在一两秒内被抢光,剩下的人只会出现售罄页面这一两秒会出现一个瞬间峰值,因为是短暂的活动,不能消耗太多服务器资源,所以需要达到最小代价做到最大的抗压,不直接冲垮服务器,还得保证不超卖,不丢单,不宕机等问题
seckill需要注意哪些问题幂等
多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致
描述
前端重复提交:前端瞬间点击多次造成表单重复提交
接口超时重试:接口可能会因为某些原因而调用失败,处于容错性考虑会加上失败重试的机制。如果接口调用一半,再次调用就会因为脏数据的存在而产生异常
消息重复消费:在使用消息中间件来处理消息队列,且手动ack确认消息被正常消费时。如果消费者突然断开链接,那么已经执行了一半的消息会重新放回队列。被其他消费者重新消费时就会导致结果异常,如数据库重复数据, 数据库数据冲突,资源重复等
请求重发:网络抖动引发的nginx重发请求,造成重复调用解决方案
给前端点 ...
实体类设计
DDD领域驱动设计(Domain-driven design)介绍领域驱动设计:是一种通过将实现连接到持续进化的模型来满足复杂需求的软件开发方法(一种解决业务复杂性的设计思想,不是一种标准规则的解决方法)领域模型是对业务模型的抽象,DDD是把业务模型翻译成系统架构设计的一种方式
失血模型
模型仅仅包含对象属性的定义和操作对象的getter/setter方法其它所有的业务逻辑完全由业务逻辑层去实现,这种类叫POJO
优点:对象结构简单缺点:会导致业务逻辑层臃肿,难于理解和维护,无法良好的扩展复杂业务逻辑和场景
123456@Datapublic class person { private String name; private String sex; private Integer age;}
贫血模型
模型包含了对象属性的定义和操作对象的getter/setter方法并且包含了对象的行为【是完整的一个对象】属性:姓名,性别,年龄等行为:走路,吃饭,睡觉等不包括依赖持久层的业务逻辑,这部分持久层的数据还是在业务逻辑层去实现,组合逻辑也是服务类负 ...
Vector
什么是Vector类似于ArrayList,Vector也是由数组组成,默认的初始化大小是【10】但是Vector是线程安全的,在大多数的方法上面都存在synchronized关键字如果需要进行扩容,每次扩容大小默认为【2】,注意(capacityIncrement > 0)是双括号条件
Vector和ArrayList的区别1.vector默认构造还是饿汉式,而arrayList在1.8后改为了懒汉式2.Vector 是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果,而 ArrayList 不是,这个可以从源码中看出,Vector 类中的方法很多有 synchronized 进行修饰,这样就导致了 Vector 在效率上无法与 ArrayList 相比【第二张图能体现】3.vector可以设置增长因子【默认0】
以2倍的方式扩容,导致下一次申请的内存必然大于之前分配内存的总和,导致之前分配的内存不能再被使用,所以最好倍增长因子设置为(1,2)之间
4.因为考虑到线程安全的问题,效率比较低可以用什么代替VectorCopyOnWriteArrayList ...
ArrayList和LinkedList区别
这是一道比较经典的面试题
主要不同点:
数据结构不同
效率不同
空间灵活性和占用内存不同
注意点:
在新建ArrayList的时候最好指定初始化大小,防止频繁扩容影响效率
在jdk1.7中ArrayList默认初始化大小为10,每次扩容0.5(1.5倍)【饿汉式】
在jdk1.8中ArrayList默认为空数组,第一次add的时候会设置为10,如果满了再自动扩容【懒汉式】
1.LinkedList实现了Deque接口,可以作为双端队列使用
2.因为数据结构不同,ArrayList是数组结构,LinkedList是双向链表结构
ArrayList指定下标查询的时候有优势,因为数组是提前分配好内存空间的
LinkedList指定下标(get)查询时候需要去遍历这个链表,才能找到指定下标位置
当Linkedlist获取第一个元素(getFirst)和最后一个元素(getLast)的速度也是非常快的
原因:在LinkedList中有两个属性,first和last它俩会一直持续记录着第一个元素和最后一个元素的位置(不会涉及到遍历操作)3.由于底层数据结构不同,ArrayList ...
驼峰命名转换工具类
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136package com.tiantai.policys.commons.utils.common;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; import java.util.*; /** * @Description JOSNObject 驼峰转换工具 * @Author WangKu ...
IDEA自定义注释模版
1.配置模板组
2.填写参数
1234567** * TODO * @Author:Foam * @Date:$date$ $time$$param$ * @return $return$ **/
3.设置表达式
param表达式1groovyScript("def result='';def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList();for(i = 0; i < params.size();i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\n':'')}; return result", methodParameters())
return表达式1groov ...
对象转MAP工具类
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849package com.service.zxing.util;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.HashMap;import java.util.Map;public class BeanMapUtilByReflect { /** * 对象转Map * @param object * @return * @throws IllegalAccessException */ public static Map beanToMap(Object object) throws IllegalAccessException { Map<String, Object> map = new Hash ...
JVM的组成
Java Virtual Machine虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现,java虚拟机有自己完善的硬件架构,如处理器,堆栈,寄存器等,还具有相应的指令系统
一次编译,到处运行Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行
开篇程序在执行之前,先要把Java代码编译成字节码(.class文件),JVM首先需要把字节码通过类加载器把文件加载到内存中的运行时数据区中。因为字节码文件是JVM的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要执行引擎将字节码翻译成底层系统指令再交由CPU去执行,而这个过程中需要调用本地库接口来实现整个程序的功能。我们通常所说的JVM组成指的是运行时数据区,因为通常需要程序员调试分析的区域就是运行时数据区,或者更具体地说是运行时数据区里面的堆(Heap)模块。
完整构成
基本构成
类加载器-ClassLoaderClassLoader 负责加载字节码文件即 class 文件class 文件在 ...
openFeign引入失败
最近用nacos集成openFeign的时候,遇到一直引入不了依赖
12345<!-- 添加 openfeign 框架依赖 --><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
一开始以为是maven源的问题,所以加了特别多的仓库都没有解决,后面试着加版本号,没想到就解决了
123456<!-- 添加 openfeign 框架依赖 --><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.1.RELEASE</ve ...