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

网站建设网站推广优化阿里云可以网站备案吗

网站建设网站推广优化,阿里云可以网站备案吗,商标图案大全图片,深入理解wordpressJava 定时任务 为什么需要定时任务#xff1f; 我们来看一下几个非常常见的业务场景#xff1a; 某系统凌晨 1 点要进行数据备份。某电商平台#xff0c;用户下单半个小时未支付的情况下需要自动取消订单。某媒体聚合平台#xff0c;每 10 分钟动态抓取某某网站的数据为…Java 定时任务 为什么需要定时任务 我们来看一下几个非常常见的业务场景 某系统凌晨 1 点要进行数据备份。某电商平台用户下单半个小时未支付的情况下需要自动取消订单。某媒体聚合平台每 10 分钟动态抓取某某网站的数据为自己所用。某博客平台支持定时发送文章。某基金平台每晚定时计算用户当日收益情况并推送给用户最新的数据。 这些场景往往都要求我们在某个特定的时间去做某个事情也就是定时或者延时去做某个事情。 定时任务在指定时间点执行特定的任务例如每天早上 8 点每周一下午 3 点等。定时任务可以用来做一些周期性的工作如数据备份日志清理报表生成等。延时任务一定的延迟时间后执行特定的任务例如 10 分钟后3 小时后等。延时任务可以用来做一些异步的工作如订单取消推送通知红包撤回等。 尽管二者的适用场景有所区别但它们的核心思想都是将任务的执行时间安排在未来的某个点上以达到预期的调度效果。 单机定时任务 Timer java.util.Timer是 JDK 1.3 开始就已经支持的一种定时任务的实现方式。 Timer 内部使用一个叫做 TaskQueue 的类存放定时任务它是一个基于最小堆实现的优先级队列。TaskQueue 会按照任务距离下一次执行时间的大小将任务排序保证在堆顶的任务最先执行。这样在需要执行任务时每次只需要取出堆顶的任务运行即可 Timer 使用起来比较简单通过下面的方式我们就能创建一个 1s 之后执行的定时任务。 // 示例代码 TimerTask task new TimerTask() {public void run() {System.out.println(当前时间: new Date() n 线程名称: Thread.currentThread().getName());} }; System.out.println(当前时间: new Date() n 线程名称: Thread.currentThread().getName()); Timer timer new Timer(Timer); long delay 1000L; timer.schedule(task, delay);//输出 当前时间: Fri May 28 15:18:47 CST 2021n线程名称: main 当前时间: Fri May 28 15:18:48 CST 2021n线程名称: Timer不过其缺陷较多比如一个 Timer 一个线程这就导致 Timer 的任务的执行只能串行执行一个任务执行时间过长的话会影响其他任务性能非常差再比如发生异常时任务直接停止Timer 只捕获了 InterruptedException 。 ScheduledExecutorService ScheduledExecutorService 是一个接口有多个实现类比较常用的是 ScheduledThreadPoolExecutor 。 ScheduledThreadPoolExecutor 本身就是一个线程池支持任务并发执行。并且其内部使用 DelayedWorkQueue 作为任务队列。 // 示例代码 TimerTask repeatedTask new TimerTask() {SneakyThrowspublic void run() {System.out.println(当前时间: new Date() n 线程名称: Thread.currentThread().getName());} }; System.out.println(当前时间: new Date() n 线程名称: Thread.currentThread().getName()); ScheduledExecutorService executor Executors.newScheduledThreadPool(3); long delay 1000L; long period 1000L; executor.scheduleAtFixedRate(repeatedTask, delay, period, TimeUnit.MILLISECONDS); Thread.sleep(delay period * 5); executor.shutdown(); //输出 当前时间: Fri May 28 15:40:46 CST 2021n线程名称: main 当前时间: Fri May 28 15:40:47 CST 2021n线程名称: pool-1-thread-1 当前时间: Fri May 28 15:40:48 CST 2021n线程名称: pool-1-thread-1 当前时间: Fri May 28 15:40:49 CST 2021n线程名称: pool-1-thread-2 当前时间: Fri May 28 15:40:50 CST 2021n线程名称: pool-1-thread-2 当前时间: Fri May 28 15:40:51 CST 2021n线程名称: pool-1-thread-2 当前时间: Fri May 28 15:40:52 CST 2021n线程名称: pool-1-thread-2不论是使用 Timer 还是 ScheduledExecutorService 都无法使用 Cron 表达式指定任务执行的具体时间。 DelayQueue DelayQueue 是 JUC 包(java.util.concurrent)为我们提供的延迟队列用于实现延时任务比如订单下单 15 分钟未支付直接取消。它是 BlockingQueue 的一种底层是一个基于 PriorityQueue 实现的一个无界队列是线程安全的。 DelayQueue 和 Timer/TimerTask 都可以用于实现定时任务调度但是它们的实现方式不同。DelayQueue 是基于优先级队列和堆排序算法实现的可以实现多个任务按照时间先后顺序执行而 Timer/TimerTask 是基于单线程实现的只能按照任务的执行顺序依次执行如果某个任务执行时间过长会影响其他任务的执行。另外DelayQueue 还支持动态添加和移除任务而 Timer/TimerTask 只能在创建时指定任务。 Spring Task 我们直接通过 Spring 提供的 Scheduled 注解即可定义定时任务非常方便 /*** cron使用Cron表达式。 每分钟的12秒运行*/ Scheduled(cron 1-2 * * * * ? ) public void reportCurrentTimeWithCronExpression() {log.info(Cron Expression: The time is now {}, dateFormat.format(new Date())); }我在大学那会做的一个 SSM 的企业级项目就是用的 Spring Task 来做的定时任务。 并且Spring Task 还是支持 Cron 表达式 的。Cron 表达式主要用于定时作业(定时任务)系统定义执行时间或执行频率的表达式非常厉害你可以通过 Cron 表达式进行设置定时任务每天或者每个月什么时候执行等等操作。 Spring Task 底层是基于 JDK 的 ScheduledThreadPoolExecutor 线程池来实现的。 优缺点总结 优点简单轻量支持 Cron 表达式缺点功能单一 时间轮 Kafka、Dubbo、ZooKeeper、Netty、Caffeine、Akka 中都有对时间轮的实现。 时间轮简单来说就是一个环形的队列底层一般基于数组实现队列中的每一个元素时间格都可以存放一个定时任务列表。 时间轮中的每个时间格代表了时间轮的基本时间跨度或者说时间精度假如时间一秒走一个时间格的话那么这个时间轮的最高精度就是 1 秒也就是说 3 s 和 3.9s 会在同一个时间格中。 下图是一个有 12 个时间格的时间轮转完一圈需要 12 s。当我们需要新建一个 3s 后执行的定时任务只需要将定时任务放在下标为 3 的时间格中即可。当我们需要新建一个 9s 后执行的定时任务只需要将定时任务放在下标为 9 的时间格中即可。 那当我们需要创建一个 13s 后执行的定时任务怎么办呢这个时候可以引入一叫做 圈数/轮数 的概念也就是说这个任务还是放在下标为 1 的时间格中 不过它的圈数为 2 。 除了增加圈数这种方法之外还有一种 多层次时间轮 类似手表Kafka 采用的就是这种方案。 针对下图的时间轮我来举一个例子便于大家理解。 上图的时间轮(ms - s)第 1 层的时间精度为 1 第 2 层的时间精度为 20 第 3 层的时间精度为 400。假如我们需要添加一个 350s 后执行的任务 A 的话当前时间是 0s这个任务会被放在第 2 层因为第二层的时间跨度为 20*20400350的第 350/2017 个时间格子。 当第一层转了 17 圈之后时间过去了 340s 第 2 层的指针此时来到第 17 个时间格子。此时第 2 层第 17 个格子的任务会被移动到第 1 层。 任务 A 当前是 10s 之后执行因此它会被移动到第 1 层的第 10 个时间格子。 这里在层与层之间的移动也叫做时间轮的升降级。参考手表来理解就好 时间轮比较适合任务数量比较多的定时任务场景它的任务写入和执行的时间复杂度都是 01。 分布式定时任务 Redis Redis 是可以用来做延时任务的基于 Redis 实现延时任务的功能无非就下面两种方案 Redis 过期事件监听Redisson 内置的延时队列 MQ 大部分消息队列例如 RocketMQ、RabbitMQ都支持定时/延时消息。定时消息和延时消息本质其实是相同的都是服务端根据消息设置的定时时间在某一固定时刻将消息投递给消费者消费。 不过在使用 MQ 定时消息之前一定要看清楚其使用限制以免不适合项目需求例如 RocketMQ 定时时长最大值默认为 24 小时且不支持自定义修改、只支持 18 个 Level 的延时并不支持任意时间。 优缺点总结 优点可以与 Spring 集成、支持分布式、支持集群、性能不错缺点功能性较差、不灵活、需要保障消息可靠性 分布式任务调度框架 如果我们需要一些高级特性比如支持任务在分布式场景下的分片和高可用的话我们就需要用到分布式任务调度框架了。 通常情况下一个分布式定时任务的执行往往涉及到下面这些角色 任务首先肯定是要执行的任务这个任务就是具体的业务逻辑比如定时发送文章。调度器其次是调度中心调度中心主要负责任务管理会分配任务给执行器。执行器最后就是执行器执行器接收调度器分派的任务并执行。 Quartz 一个很火的开源任务调度框架完全由 Java 写成。Quartz 可以说是 Java 定时任务领域的老大哥或者说参考标准其他的任务调度框架基本都是基于 Quartz 开发的比如当当网的elastic-job就是基于 Quartz 二次开发之后的分布式调度解决方案。 使用 Quartz 可以很方便地与 Spring 集成并且支持动态添加任务和集群。但是Quartz 使用起来也比较麻烦API 繁琐。 并且Quartz 并没有内置 UI 管理控制台。另外Quartz 虽然也支持分布式任务。但是它是在数据库层面通过数据库的锁机制做的有非常多的弊端比如系统侵入性严重、节点负载不均衡。有点伪分布式的味道。 优缺点总结 优点可以与 Spring 集成并且支持动态添加任务和集群。缺点分布式支持不友好不支持任务可视化管理、使用麻烦相比于其他同类型框架来说 Elastic-Job ElasticJob 当当网开源的一个面向互联网生态和海量任务的分布式调度解决方案由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 ElasticJob-Lite 和 ElasticJob-Cloud 两者的对比如下 ElasticJob-LiteElasticJob-Cloud无中心化是否资源分配不支持支持作业模式常驻常驻 瞬时部署依赖ZooKeeperZooKeeper Mesos ElasticJob 支持任务在分布式场景下的分片和高可用、任务可视化管理等功能。 lasticJob-Lite 的架构设计如下图所示 ElasticJob-Lite 的架构设计 从上图可以看出Elastic-Job 没有调度中心这一概念而是使用 ZooKeeper 作为注册中心注册中心负责协调分配任务到不同的节点上。 Elastic-Job 中的定时调度都是由执行器自行触发这种设计也被称为去中心化设计调度和处理都是执行器单独完成。 Component ElasticJobConf(name dayJob, cron 0/10 * * * * ?, shardingTotalCount 2,shardingItemParameters 0AAAA,1BBBB, description 简单任务, failover true) public class TestJob implements SimpleJob {Overridepublic void execute(ShardingContext shardingContext) {log.info(TestJob任务名【{}】, 片数【{}】, param【{}】, shardingContext.getJobName(), shardingContext.getShardingTotalCount(),shardingContext.getShardingParameter());} }相关地址 GitHub 地址https://github.com/apache/shardingsphere-elasticjob。open in new window官方网站https://shardingsphere.apache.org/elasticjob/index_zh.htmlopen in new window 。 优缺点总结 优点可以与 Spring 集成、支持分布式、支持集群、性能不错、支持任务可视化管理缺点依赖了额外的中间件比如 Zookeeper复杂度增加可靠性降低、维护成本变高 XXL-JOB XXL-JOB 于 2015 年开源是一款优秀的轻量级分布式任务调度框架支持任务可视化管理、弹性扩容缩容、任务失败重试和告警、任务分片等功能 根据 XXL-JOB 官网介绍其解决了很多 Quartz 的不足。 Quartz 作为开源作业调度中的佼佼者是作业调度的首选。但是集群环境中 Quartz 采用 API 的方式对任务进行管理从而可以避免上述问题但是同样存在以下问题 问题一调用 API 的的方式操作任务不人性化问题二需要持久化业务 QuartzJobBean 到底层数据表中系统侵入性相当严重。问题三调度逻辑和 QuartzJobBean 耦合在同一个项目中这将导致一个问题在调度任务数量逐渐增多同时调度任务逻辑逐渐加重的情况下此时调度系统的性能将大大受限于业务问题四quartz 底层以“抢占式”获取 DB 锁并由抢占成功节点负责运行任务会导致节点负载悬殊非常大而 XXL-JOB 通过执行器实现“协同分配式”运行任务充分发挥集群优势负载各节点均衡。 XXL-JOB 弥补了 quartz 的上述不足之处。 XXL-JOB 的架构设计如下图所示 从上图可以看出XXL-JOB 由 调度中心 和 执行器 两大部分组成。调度中心主要负责任务管理、执行器管理以及日志管理。执行器主要是接收调度信号并处理。另外调度中心进行任务调度时是通过自研 RPC 来实现的。 不同于 Elastic-Job 的去中心化设计 XXL-JOB 的这种设计也被称为中心化设计调度中心调度多个执行器执行任务。 和 Quzrtz 类似 XXL-JOB 也是基于数据库锁调度任务存在性能瓶颈。不过一般在任务量不是特别大的情况下没有什么影响的可以满足绝大部分公司的要求。 不要被 XXL-JOB 的架构图给吓着了实际上我们要用 XXL-JOB 的话只需要重写 IJobHandler 自定义任务执行逻辑就可以了非常易用 JobHandler(valuemyApiJobHandler) Component public class MyApiJobHandler extends IJobHandler {Overridepublic ReturnTString execute(String param) throws Exception {//......return ReturnT.SUCCESS;} }还可以直接基于注解定义任务。 XxlJob(myAnnotationJobHandler) public ReturnTString myAnnotationJobHandler(String param) throws Exception {//......return ReturnT.SUCCESS; }相关地址 GitHub 地址https://github.com/xuxueli/xxl-job/。open in new window官方介绍https://www.xuxueli.com/xxl-job/open in new window 。 优缺点总结 优点开箱即用学习成本比较低、与 Spring 集成、支持分布式、支持集群、支持任务可视化管理。缺点不支持动态添加任务 PowerJob 非常值得关注的一个分布式任务调度框架分布式任务调度领域的新星。目前已经有很多公司接入比如 OPPO、京东、中通、思科。 这个框架的诞生也挺有意思的PowerJob 的作者当时在阿里巴巴实习过阿里巴巴那会使用的是内部自研的 SchedulerX阿里云付费产品。实习期满之后PowerJob 的作者离开了阿里巴巴。想着说自研一个 SchedulerX防止哪天 SchedulerX 满足不了需求于是 PowerJob 就诞生了。 QuartZxxl-jobSchedulerX 2.0PowerJob定时类型CRONCRONCRON、固定频率、固定延迟、OpenAPICRON、固定频率、固定延迟、OpenAPI任务类型内置 Java内置 Java、GLUE Java、Shell、Python 等脚本内置 Java、外置 JavaFatJar、Shell、Python 等脚本内置 Java、外置 Java容器、Shell、Python 等脚本分布式计算无静态分片MapReduce 动态分片MapReduce 动态分片在线任务治理不支持支持支持支持日志白屏化不支持支持不支持支持调度方式及性能基于数据库锁有性能瓶颈基于数据库锁有性能瓶颈不详无锁化设计性能强劲无上限报警监控无邮件短信WebHook、邮件、钉钉与自定义扩展系统依赖JDBC 支持的关系型数据库MySQL、Oracle…MySQL人民币任意 Spring Data Jpa 支持的关系型数据库MySQL、Oracle…DAG 工作流不支持不支持支持支持 作者声明 如有问题欢迎指正
http://www.pierceye.com/news/359756/

相关文章:

  • 行业门户网站php网站开发程序
  • 广州微信网站建设报价表上海注销营业执照流程
  • 陕西省建设执业资格注册中心网站科技有限公司 翻译
  • 做推广都有哪些网站网站怎么上传源码
  • discuz门户网站模板手机电子商务网站规划书范文
  • vps能同时做网站同时做其它事吗wordpress 支持小工具
  • 网站建设制作网络公司wordpress 汽车模板
  • 有哪些做外贸的网站网站快速搭建平台
  • wordpress搜索代码制做优化精灵
  • 连云港做网站推广东莞seo
  • 专业网站设计公司和普通设计公司的区别微信分销网站建设
  • 青海个人旅游网站建设网站建设教程软件下载
  • 做AMC12的题的网站龙华网站建设专业公司
  • 莱州网站制作友情链接交换形式
  • 如何编写网站做美食类网站现状
  • 一站式推广平台做家装模型的效果图网站
  • 企业电子商务网站开发实验报告苏州建筑设计公司排名
  • 网站的优化与网站建设有关吗网站先做移动站在做pc站可行吗
  • 河北网站制作公司电话建设网站的情况说明
  • 高校网站平台建设wordpress小工具不见了
  • 网站建设 会计处理北京垡头网站建设公司
  • 唐山网站制作案例网站建设中标
  • 网站开发培训费济南网络优化推广公司哪家好
  • 谷歌网站优化可以做物理题的网站
  • 公司的网站建设是什么部门品牌餐饮加盟网站建设
  • 深圳品牌网站建设公司哪家好学建网站 必须学那些知识
  • 国内设计网站推荐山东省建设安全生产协会网站
  • 南京专业网站开发团队如何用手机建网站
  • 在婚恋网站上做红娘怎么样正规网络推广服务
  • 网络媒体设计是做什么的西安网站优化公司