当前位置: 首页 > news >正文

09-微服务原理篇(XXLJOB-幂等-MySQL)

学习目标

  1. 能够说出xxl-job任务调度的优势
  2. 能说出xxl-job的组成结构
  3. 能够编写热点商品更新缓存任务
  4. 能够说出什么是幂等,常见幂等解决方案
  5. 能够说出数据库常见存储引擎的核心区别
  6. 能够说出索引失效的场景
  7. 能够说出回表、覆盖索引
  8. 能够说出SQL调优的方案
  9. 能够说出常见分库分表的方案

1 任务调度方案

1.1 什么是任务调度

1.1.1 概念

我们可以先思考一下下面业务场景的解决方案:

  • 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。
  • 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。
  • 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。
  • 12306会根据车次的不同,而设置某几个时间点进行分批放票。
  • 某网站为了实现天气实时展示,每隔5分钟就去天气服务器获取最新的实时天气信息。

以上场景就是任务调度所需要解决的问题。

任务调度是指系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人 力由系统自动去执行任务。

在解决缓存击穿方案中,通过缓存定时预热避免缓存击穿。

1.1.2 技术方案

如何实现任务调度?

1、使用jdk提供的Timer定时器

示例代码如下:

每个Timer对应一个线程,可以同时启动多个Timer定时执行多个任务。

public static void main(String[] args){  Timer timer = new Timer();  timer.schedule(new TimerTask(){@Override  public void run() {  //TODO:something}  }, 1000, 2000);  //1秒后开始调度,每2秒执行一次
}

Time使用简单,可以实现每隔一定的时间去执行任务,但无法实现每天凌晨去执行任务,即在某个时间点去执行任务。

2、使用第三方Quartz方式实现

Quartz 是一个功能强大的任务调度框架(项目地址:链接 ),它可以满足更多更复杂的调度需求,Quartz 设计的核心类包括 Scheduler, Job 以及 Trigger。其中,Job 负责定义需要执行的任务,Trigger 负责设置调度策略,Scheduler 将二者组装在一起,并触发任务开始执行。Quartz支持简单的按时间间隔调度、还支持按日历调度方式,通过设置CronTrigger表达式(包括:秒、分、时、日、月、周、年)进行任务调度。

虽然Quartz可以实现按日历调度的方式,但无法支持分布式环境下任务调度。分布式环境下通常一个服务部署多个实例即多个jvm进程,假设一个项目的微服务部署两个实例每个实例定时执行更新缓存的任务,两个实例就会重复执行。如下图:

3、使用分布式调度平台XXL-JOB

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

官网:https://www.xuxueli.com/xxl-job/

文档:https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B9%B3%E5%8F%B0XXL-JOB%E3%80%8B

XXL-JOB主要有调度中心、执行器、任务:

调度中心:

负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码;

主要职责为执行器管理、任务管理、监控运维、日志管理等

任务执行器:

负责接收调度请求并执行任务逻辑;

主要职责是执行任务、执行结果上报、日志服务等

使用XXL-JOB可以解决多个jvm进程重复执行任务的问题,如下图:

XXL-JOB调度中心可以配置路由策略,比如:第一个、轮询策略、分片等,它们分别表示的意义如下:

  • 第一个:即每次执行任务都由第一个执行器去执行。
  • 轮询:即执行器轮番执行。
  • 分片:每次执行任务广播给每个执行器让他们同时执行任务。

如果根据需求每次执行任务仅由一个执行器去执行任务可以设置路由策略:第一个、轮询。

如果根据需求每次执行任务由多个执行器同时执行可以设置路由策略为:分片。

xxl-job分布式任务调度系统具体有以下优势:

1、并行任务调度

并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。

如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。

2、高可用

若某一个实例宕机,不影响其他实例来执行任务。

3、弹性扩容

当集群中增加实例就可以提高并执行任务的处理效率。

4、任务管理与监测

对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。

5、避免任务重复执行

当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次。

1.1.3 小结

xxl-job任务调度与第三方Quartz或timer定时器实现任务调度有什么优势?

1.2 搭建XXL-JOB

1.2.1 组成结构

XXL-JOB由两部分组成:

  • 调度模块(调度中心): 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
  • 执行模块(执行器): 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等。

1.2.2 部署调度中心

1.查阅xxl-job的源码

首先下载XXL-JOB

GitHub:https://github.com/xuxueli/xxl-job

码云:https://gitee.com/xuxueli0323/xxl-job

项目使用2.3.1版本: https://github.com/xuxueli/xxl-job/releases/tag/2.3.1

也可从课程资料目录获取,解压xxl-job-2.3.1.zip

使用IDEA打开解压后的目录

xxl-job-admin:调度中心

xxl-job-core:公共依赖

xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用)

:xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;

:xxl-job-executor-sample-frameless:无框架版本;

doc :文档资料,包含数据库脚本

在下发的虚拟机的MySQL中已经创建了xxl_job_2.3.1数据库

如下图:

安装xxl-job

没有使用下发虚拟机的同学请自行安装xxl-job。

拉取镜像:

docker pull xuxueli/xxl-job-admin:2.3.1

创建数据库:xxl_job_2.3.1

导入xxl_job_2.3.1.sql,如下:

创建目录:

/data/soft/xxl-job

/data/soft/xxl-job/applogs

创建配置文件:/data/soft/xxl-job/application.properties,内容如下:

### web
server.port=8080
server.servlet.context-path=/xxl-job-admin### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.############# mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model### xxl-job, datasource
spring.datasource.url=jdbc:mysql://192.168.101.68:3306/xxl_job_2.3.1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory### xxl-job, access token
xxl.job.accessToken=default_token### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100### xxl-job, log retention days
xxl.job.logretentiondays=30

创建容器:

docker run -d -e \--restart=always \-v /data/soft/xxl-job/applogs:/data/applogs \-v /data/soft/xxl-job/application.properties:/application.properties \-p 8088:8080 \--name xxl-job-admin \xuxueli/xxl-job-admin:2.3.1

启动成功进入管理界面:

http://192.168.101.68:8088/xxl-job-admin

账号/密码:admin/123456

2.启动xxl-job

执行docker start xxl-job-admin 启动xxl-job

访问:http://192.168.101.68:8088/xxl-job-admin/

账号和密码:admin/123456

1.2.3 执行器

1.添加执行器依赖

下边配置执行器,执行器负责与调度中心通信接收调度中心发起的任务调度请求,执行器负责执行微服务中定义的任务,执行器程序由xxl-job提供,在微服务中引入下边的依赖即加入了执行器的程序。

我们在商品服务中引入xxl-job执行器依赖。

<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version>
</dependency>

参考源代码中的XxlJobConfig去编写xxl-job的配置类,此配置类已提供,将课程资料中xxl-job下的配置类和模型类拷贝到商品服务的config包下:

2.配置xxl-job

在application.yaml下配置xxl-job

xxl-job:enable: trueport: 11603access-token: default_tokenadmin:address: http://192.168.101.68:8088/xxl-job-adminexecutor:appName: ${spring.application.name}#ip: 172.17.0.170port: ${xxl-job.port}# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能log-retention-days: 30

说明:

address:调度中心的地址

http://www.dtcms.com/a/606849.html

相关文章:

  • 代码随想录训练营打卡Day45| 动态规划part12
  • 网站开发要考什么证wordpress xy 变装
  • 已知两个端点的位置、切矢量和曲率,构造一条五阶Bézier 曲线实现 G² 连续的方法
  • 显示 Markdown 的文件
  • 算法学习入门---模拟(C++)
  • 列表网做优化网站怎么样成都网站注册
  • 文库网站开发教程wordpress 绑定熊掌号
  • C语言在线编译器网站 | 提供快速、便捷的在线编程与调试平台
  • 免费高清视频素材网站品牌网站建设定制
  • 个人做的卖货网站团购网站开发
  • C++---const关键字 编译期约束保证数据的 只读性
  • 算法基础入门第一章
  • 家用除湿机方案开发,除湿机MCU控制方案设计
  • 搜狗推广做网站要钱吗wordpress首页调用指定文章
  • wordpress使用人数宁波seo在线优化公司
  • YOLO系列发展史与应用现状:从开山之作到实时目标检测的基石
  • 【电商微服务日志处理全方案】从MySQL瓶颈到大数据架构的实战转型
  • 蔬菜配送网站建设网络系统脆弱性的不安全因素
  • 常州想做个企业的网站找谁做注册公司需要交多少税
  • 反编译易语言程序 | 如何安全有效地进行易语言程序的反编译操作
  • 刺猬猫网站维护wordpress $post->id
  • 商城网站开发项目描述嘉兴建站公司
  • 从爆款到厂牌:解读游戏工业化的业务持续增长道路
  • 深度学习:学习率衰减(Learning Rate Decay)
  • 深度学习:RMSprop 优化算法详解
  • 盐城网站建设费用怎么判断一个网站是否使用帝国做的
  • 企业电子商务网站设计的原则做旅游宣传哪个网站好
  • 进程程序替换函数(Linux)
  • [特殊字符] 莫生指纹浏览器 v1.0.1 - 专业的浏览器指纹管理工具
  • 广州网站运营专业乐云seo58网络门店管理系统