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

制作网站设计作品网站排名优化服务公司

制作网站设计作品,网站排名优化服务公司,传媒公司主要做什么业务,做网页建网站挣钱背景 Apache DolphinScheduler 定时任务配置采用的 7 位 Crontab 表达式,分别对应秒、分、时、月天、月、周天、年。 在团队日常开发工作中,工作流的定时调度一般不会细化到秒级别。但历史上出现过因配置的疏忽大意而产生故障时间,如应该配…

背景

Apache DolphinScheduler 定时任务配置采用的 7 位 Crontab 表达式,分别对应秒、分、时、月天、月、周天、年

在团队日常开发工作中,工作流的定时调度一般不会细化到秒级别。但历史上出现过因配置的疏忽大意而产生故障时间,如应该配置每分钟执行的工作流被配置长了每秒执行,造成短时间内产生大量工作流实例,对 Apache DolphinScheduler 服务可用性和提交任务的 Hadoop 集群造成影响。

基于此,团队决定将 DolphinScheduler 中定时任务配置模块的 Crontab 表达式做限制,从平台侧杜绝此类事件发生

方案

我们的方案是从前后端双方面限制 Crontab 表达式的第一位:

  • 前端配置选择不提供“每一秒钟”选项
  • 服务端接口判断第一位为 * 时,返回错误

前端修改

在前端项目中,秒、分、时 均为统一模版(CrontabTime),因此新增 dolphinscheduler-ui/src/components/crontab/modules/second.tsx

只保留两种模式:intervalTimespecificTime

/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements.  See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the "License"); you may not use this file except in compliance with* the License.  You may obtain a copy of the License at**    http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import _ from 'lodash'
import { defineComponent, onMounted, PropType, ref, toRefs, watch } from 'vue'
import { NInputNumber, NRadio, NRadioGroup, NSelect } from 'naive-ui'
import { useI18n } from 'vue-i18n'
import { ICrontabI18n } from '../types'
import { isStr, specificList } from '../common'
import styles from '../index.module.scss'const props = {timeMin: {type: Number as PropType<number>,default: 0},timeMax: {type: Number as PropType<number>,default: 60},intervalPerform: {type: Number as PropType<number>,default: 5},intervalStart: {type: Number as PropType<number>,default: 3},timeSpecial: {type: Number as PropType<number | string>,default: 60},timeValue: {type: String as PropType<string>,default: '*'},timeI18n: {type: Object as PropType<ICrontabI18n>,require: true}
}export default defineComponent({name: 'CrontabSecond',props,emits: ['update:timeValue'],setup(props, ctx) {const options = Array.from({ length: 60 }, (x, i) => ({label: i.toString(),value: i}))const timeRef = ref()const radioRef = ref()const intervalStartRef = ref(props.intervalStart)const intervalPerformRef = ref(props.intervalPerform)const specificTimesRef = ref<Array<number>>([])/*** Parse parameter value*/const analyticalValue = () => {const $timeVal = props.timeValue// Interval timeconst $interval = isStr($timeVal, '/')// Specific timeconst $specific = isStr($timeVal, ',')// Positive integer (times)if (($timeVal.length === 1 ||$timeVal.length === 2 ||$timeVal.length === 4) &&_.isInteger(parseInt($timeVal))) {radioRef.value = 'specificTime'specificTimesRef.value = [parseInt($timeVal)]return}// Interval timesif ($interval) {radioRef.value = 'intervalTime'intervalStartRef.value = parseInt($interval[0])intervalPerformRef.value = parseInt($interval[1])timeRef.value = `${intervalStartRef.value}/${intervalPerformRef.value}`return}// Specific timesif ($specific) {radioRef.value = 'specificTime'specificTimesRef.value = $specific.map((item) => parseInt(item))return}}// Interval start time(1)const onIntervalStart = (value: number | null) => {intervalStartRef.value = value || 0if (radioRef.value === 'intervalTime') {timeRef.value = `${intervalStartRef.value}/${intervalPerformRef.value}`}}// Interval execution time(2)const onIntervalPerform = (value: number | null) => {intervalPerformRef.value = value || 0if (radioRef.value === 'intervalTime') {timeRef.value = `${intervalStartRef.value}/${intervalPerformRef.value}`}}// Specific timeconst onSpecificTimes = (arr: Array<number>) => {specificTimesRef.value = arrif (radioRef.value === 'specificTime') {specificReset()}}// Reset interval timeconst intervalReset = () => {timeRef.value = `${intervalStartRef.value}/${intervalPerformRef.value}`}// Reset specific timeconst specificReset = () => {let timeValue = '0'if (specificTimesRef.value.length) {timeValue = specificTimesRef.value.join(',')}timeRef.value = timeValue}const updateRadioTime = (value: string) => {switch (value) {case 'intervalTime':intervalReset()breakcase 'specificTime':specificReset()break}}watch(() => timeRef.value,() => ctx.emit('update:timeValue', timeRef.value.toString()))onMounted(() => analyticalValue())return {options,radioRef,intervalStartRef,intervalPerformRef,specificTimesRef,updateRadioTime,onIntervalStart,onIntervalPerform,onSpecificTimes,...toRefs(props)}},render() {const { t } = useI18n()return (<NRadioGroupv-model:value={this.radioRef}onUpdateValue={this.updateRadioTime}><div class={styles['crontab-list']}><NRadio value={'intervalTime'} /><div class={styles['crontab-list-item']}><div class={styles['item-text']}>{t(this.timeI18n!.every)}</div><div class={styles['number-input']}><NInputNumberdefaultValue={5}min={this.timeMin}max={this.timeMax}v-model:value={this.intervalPerformRef}onUpdateValue={this.onIntervalPerform}/></div><div class={styles['item-text']}>{t(this.timeI18n!.timeCarriedOut)}</div><div class={styles['number-input']}><NInputNumberdefaultValue={3}min={this.timeMin}max={this.timeMax}v-model:value={this.intervalStartRef}onUpdateValue={this.onIntervalStart}/></div><div class={styles['item-text']}>{t(this.timeI18n!.timeStart)}</div></div></div><div class={styles['crontab-list']}><NRadio value={'specificTime'} /><div class={styles['crontab-list-item']}><div>{t(this.timeI18n!.specificTime)}</div><div class={styles['select-input']}><NSelectmultipleoptions={specificList[this.timeSpecial]}placeholder={t(this.timeI18n!.specificTimeTip)}v-model:value={this.specificTimesRef}onUpdateValue={this.onSpecificTimes}/></div></div></div></NRadioGroup>)}
})

服务端

添加Crontab表达式检验(有两处:一处是新增Post接口、另一处是修改PUT接口),直接添加个检测方法供这两处调用:

        if (scheduleParam.getCrontab().startsWith("*")) {logger.error("The crontab must not start with *");putMsg(result, Status.CRONTAB_EVERY_SECOND_ERROR);return result;}

本文完!

本文由 白鲸开源科技 提供发布支持!

http://www.dinnco.com/news/11988.html

相关文章:

  • 郑州正规公司网站建设服务推广一款app的营销方案
  • 微信导航网站怎么做国家域名注册服务网
  • 老罗做的网站360应用商店
  • 哪个网站可以做旅行攻略品牌推广方式都有哪些
  • iis5.1发布网站什么样的人适合做营销
  • 做动车哪个网站查网络营销怎么做推广
  • 网站建设费用清单推销一个产品的方案
  • 移动端网站怎么做网络营销案例分析题及答案
  • 铜仁北京网站建设十大免费网站推广入口
  • 西安维护网站网站怎么制作免费的
  • 集团公司做网站关键词优化简易
  • 广州建设工程信息网站友情链接发布网
  • 优质聊城做网站公司十大网站排行榜
  • 济南网站建设webwz8广州网络推广选择
  • wordpress全站搜索免费刷网站百度关键词
  • 三星网上商城客服电话杭州优化公司多少钱
  • 电影宣传网站模板免费下载百度爱采购
  • 亚马逊网站开发的技术百度知道首页登录入口
  • 搜索排名优化公司厦门seo小谢
  • wang域名注册网站咸阳网络推广
  • 做视频网站怎么看不会卡关键词分类哪八种
  • SEO网站建设全方位部署最近的新闻事件
  • 怎样做网站的背景图片成品短视频网站源码搭建
  • 素材模板网站网站制作代码
  • 网站模板用什么软件做百度手机
  • 免费html5播放器优化seo排名
  • 直播网站建设书籍营销失败案例分析
  • 做网站的总要求上门磁力岛
  • 荔湾网站制作公司百度搜索引擎优化详解
  • 成都哪里有网站开发公司外链推广平台