(十三)定时任务

news2024/11/25 18:25:43

以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦!

第 13 章 定时任务

13.1 什么是定时任务

1、InfluxDB任务是一个定时执行的FLUX脚本,它先查询数据,然后以某种方式进行修改或聚合,然后将数据写回InfluxDB或执行其他操作。

13.2 示例:将数据转成json发给别的应用

13.2.1 创建任务的途径

1、有很多方式可以帮你创建任务,比如DataExplorer、Notebook、HTTP API和 influx-cli。不过,此处我们为了还愿定时任务的本来面貌,我们会使用influx-cli去创建定时任务。

13.2.2 本任务的需求

1、我们的定时任务要实现下面的需求。

  • 每 30s调度一次
  • 查询最近 30 s的第一条数据
  • 将数据转为json
  • 将json通过HTTP发送SimpleHttpPostServer。

2、SimpleHttpPostServer是自己用go语言写的一个最简单的HTTP POST服务,它的功能就是接收一个POST请求,然后把请求体重的内容转为字符串打印出来。访问github地址https://github.com/realdengziqi/simpleHttpPostServer ,下载源码自行编译,或者在发行记录中下载我已编译好的linux-x64可执行程序。

在这里插入图片描述

13.2.3 启动simpleHttpPostServer

1、下载simpleHttpPostServer后,cd到其所在目录,执行simpleHttpPostServer程序。效果如下图所示,终端会被阻塞。

在这里插入图片描述

13.2.4 测试simpleHttpPostServer是否正常工作

1、我们可以使用curl来验证simpleHttpPostServer是否正常工作。使用下面的命令,向simpleHttpPostServer发送一个POST请求。

curl -POST <http://localhost:8080/> -d '{"hello":"world"}'

2、之后,查看simpleHttpPostServer所占的终端,如果终端出现了一条新的数据,那么说明simpleHttpPostServer工作正常。

在这里插入图片描述

13.2.5 在DataExplorer中编写FLUX脚本

1、我们首先在DataExplorer中把查询到转为json的这段逻辑写好。我们要查询的是test_init存储桶下的 go_goroutines测量。这个测量反应的是我们当前InfluxDB程序中的goroutines(轻量级线程)数量。

2、打开DataExplrer,编写如下代码

在这里插入图片描述

3、代码解释:

  • from -> range -> filter,指定了数据源并取出了我们想要的序列,其中range的start参数我们写死-30s。
  • first函数,Flux查询InfluxDB返回的数据默认是按照时间从先到后排序的,first函数配合前面的查询相当于只取了最近 30 s的第一条数据。
  • map函数,我们在map函数里完成数据的发送。这里需要注意,因为map函数要求必须返回record,而且输出的record不能和输入的record一模一样。所以,结尾return的时候,我们使用了with语法,给map输出的record增加了一个字段。也就是我们发出http
    请求响应的状态码。在map中的匿名函数,我们使用了http.post向http://localhost:8080/发送了一条json格式的数据。

13.2.6 运行代码并观察效果

1、现在,我们点击SUBMIT按钮,执行这个FLUX查询脚本,观察DataExplorer返回的数据和simpleHttpPostServer的输出。

13.2.6.1 观察DataExplorer

1、点击SUBMIT后,点一下view Raw Data按钮,我们关注table格式的数据。可以看到,现在数据中多了status_code一列,而且它的值是 200 。而且,因为first()函数的作用,这次查询,我们只产生了一行数据。

在这里插入图片描述

13.2.6.2 观察 SimpleHttpPostServer

1、可以看到,我们的httpServer顺利收到了JSON。
在这里插入图片描述
2、截至目前,说明我们的 FLUX 脚本可以实现需求,现在的问题就是如何将这份脚本设为定时任务。

13.2.7 配置定时调度

1、现在,在我们的查询逻辑前面插入一行。

option task = { name: "example_task", every: 30s, offset:0m }

2、表示,我们做了一个设定,指定了一个名为example_task的任务。这个任务每隔 30 秒执行一次。offset 这里暂时设为 0m,后面我们会专门讲这里的offset有什么意义。

在这里插入图片描述

13.2.8 使用influx-cli创建任务

1、虽然我们在 DataExplorer 里写了一个 option,但是具体到option会不会生效,必须要看FLUX脚本再跟 InfluxDB 的那个HTTP API进行交互。所以这里点击SUBMIT按钮只会再执行一次查询,option task并不会生效。这里,我们会先用influx-cli创建一遍任务。先把 Flux 脚本复制出来,在 /opt/modules/examples 里创建一个文件,就叫example_task.flux吧。将之前写的脚本粘贴进去。

import "json"
import "http"
option task = { name: "example_task", every: 30s, offset:0m }
	
	from(bucket: "test_init") |> range(start:-30s)
		|> filter(fn: (r) => r["_measurement"] == "go_goroutines")
		|> first(column: "_value")
		|> map(
			fn: (r) => {
			status_code = http.post(url:"http://localhost:8080/", data:json.encode(v:r))
		return {r with status_code:status_code}
	}
)

2、使用下面的命令,创建FLUX任务。

./influx task create --org atguigu -f  /opt/module/examples/example_task.flux

3、可以看到,我们的任务已经成功创建了。

在这里插入图片描述

13.2.9 在Web UI上查看定时任务

1、点击左侧工具栏的 按钮,查看任务列表。可以看到,任务已经成功创建。

在这里插入图片描述
2、点一下任务的名称,可以进去看任务执行详情。

在这里插入图片描述
3、详情页面上,可以看到任务的调度时间、开始时间、任务耗时等信息。在最上方点击 EDIT TASK按钮,可以看到当时的任务定义。在这里,你也可以直接修改任务的定义。

在这里插入图片描述

13.2.10 在接收端查看定时任务效果

1、数据的接收端就是 simpleHttpPostServer。可以看到,我们的接收端目前就是每隔 30s收到一条json数据。

在这里插入图片描述

13.2.11 使用DataExplorer创建任务

1、这一次,我们用DataExplorer来创建任务。现在,我们先将已经存在的任务删除。

在这里插入图片描述

2、打开DataExplorer,编辑FLUX脚本,将我们之前写的查询脚本粘进去。注意,要删除option一行。如下图所示:

在这里插入图片描述

3、完成上面的操作后,点击DataExplorer页面右上方的SAVE AS按钮,在弹出的对话框中选择TASK选项卡。

在这里插入图片描述

  • Name,填写为example_task
  • Every,填写 30 s
  • Offset可以空着,这样默认就是 0 。此处显示的 20m是前端渲染效果,和具体的任务执行无关。
  • 此处的OutputBucket的填写需要注意,本来我们自己编写的脚本并没有指定要把数据回写到InfluxDB,但是如果从Web UI创建定时任务的话,Output Bucket不能不设,这样会造成回写操作。这也是为什么我们之前不用Web UI创建任务的原因。

配置好后,点击SAVE AS TASK。

13.2.12 再次查看任务详情(注意Web UI的小动作)

1、现在,我们再次回到任务列表。可以看到,任务已经成功创建,并且已经正常运行。

在这里插入图片描述
2、点击EDIT TASK按钮,查看我们的FLUX脚本。你会惊奇的发现,我们的FLUX代码居然被修改了,原本不回写数据库的操作被强制加上了一个to函数。另外,可以看到我们代码的前面也被加上了一个option task代码,这说明Web UI的页面点按操作只不过是帮我们完成了手敲代码的几个步骤。

在这里插入图片描述
3、总的来说,看开发者能否接收代码被隐式修改。如果这种行为无法接受,那么强烈建议用influx-cli的方式去创建任务。

13.3 数据迟到问题

1、option中的offset是专门用来帮我们处理迟到问题的。首先,我们来关注一个迟到的场景,如下图所示。我们的定时任务每次查询最近 30 秒的数据。同时,调度的间隔设为每 30 秒执行一次。

在这里插入图片描述
2、这个时候,由于网络的延迟,本该 1 分 20 秒入库的数据, 1 分 32 秒的时候才来。但在 1 分 30 秒的时候,我们的查询已经执行完了。这个时候我们错过了 1 分 20 秒的数据。这个时候,如果我们将offset设为 5 秒。如下图所示:

在这里插入图片描述
3、定时任务的执行时间向后延迟了 5 秒,但是查询的还是原来范围的数据。这个时候定时任务执行的时间是 1 分 35 秒。原先的迟到数据就能被我们查询到了。但是如果你的数据延迟了10秒,那又查不到了,所以这个参数的值需要根据你的业务的速度来考虑。

13.4 cron表达式

1、其实InfluxDB的定时任务还支持cron表达式。option的写法如下:

option task = {
	// ...
	cron: "0 * * * *",
}

2、本文就不做详细演示了。

13.4.1 参考资料

1、crontab是linux上一个可以设置定时执行命令的工具。cron表达式就是最早在就是在crontab中使用的一种表示时间间隔的表达式。相关资料可以参考菜鸟教程开源的cron教程。 https://www.runoob.com/linux/linux-comm-crontab.html

13.4.2 cron辅助开发工具

1、如果是对cron非常熟练,一口气能直接写对那当然是很好的。如果开发时一次写不准可以百度一些在线的cron生成工具作为辅助。不 过 , 这 里 我 更 推 荐 gitee 上 的 开 源 cron 生 成 器 项 目 。 比 如 :https://gitee.com/toktok/easy-cron 这一个基于node.js的corn生成工具。你可以把代码拉下来自己部署,也可以使用它的在线demo。http://www.easysb.cn/open/easy-cron/index.html>

2、这个工具可以同时支持 5 、 6 、 7 字段的cron表达式。

在这里插入图片描述

13.5 补充:InfluxDB抓取任务的本质

1、之前我们在Web UI里设置的抓取任务,其背后其实就是定时执行的FLUX脚本。只不过InfluxDB在API上将他们分开了。

2、在当前的FLUX版本中,experimental/prometheus库为我们提供了采集prometheus格式数 据 的 能 力 。详 细 可 以 参 考 https://docs.influxdata.com/flux/v0.x/prometheus/scrape-prometheus/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/795532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序创建

1&#xff0c;下载HBuilder X ;(3.8.7) HBuilderX-高效极客技巧 2,下载模板&#xff08;不选云服务的&#xff09;&#xff1b; 3&#xff0c;运行-运行到小程序模拟器&#xff1b; 4&#xff0c;安装小程序开发工具&#xff1b; 5&#xff0c;选择稳定版-windows64版&…

骆驼祥子思维导图

《骆驼祥子》简单介绍 《骆驼祥子》小说&#xff0c;以20世纪20年代的旧北京为背景。祥子所处的时代是北洋军阀统治的时代。今天我们就用ProcessOn 思维导图 来给大家解析这本名著。所有文章中的思维导图都可以到ProcessOn 模板社区获得。 1936年&#xff0c;老舍的一位山东大…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块5

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Wonderful Sql

Wonderful Sql 一. 初识数据库 练习题 1.1 编写一条 CREATE TABLE 语句&#xff0c;用来创建一个包含表 1-A 中所列各项的表 Addressbook &#xff08;地址簿&#xff09;&#xff0c;并为 regist_no &#xff08;注册编号&#xff09;列设置主键约束 表1-A 表 Addressbook…

LeetCode64.Minimum-Path-Sum<最小路径和>

题目&#xff1a; 思路&#xff1a; 一开始使用的深度优先搜索,结果果然是超时了.好吧 是需要动态规划的. 和上次有一题有点像.(12条消息) LeetCode62.Unique-Paths&#xff1c;不同路径&#xff1e;_Eminste的博客-CSDN博客 将边缘初始化为数组原本的数.然后每次只能向下或…

#P1108. [NOIP2008提高组] 双栈排序

题目描述 Tom 最近在研究一个有趣的排序问题。如图所示&#xff0c;通过 22 个栈 S_1S1​ 和 S_2S2​&#xff0c;Tom 希望借助以下 44 种操作实现将输入序列升序排序。 操作 aa&#xff1a;将第一个元素压入栈 S_1S1​。 操作 bb&#xff1a;将 S_1S1​ 栈顶元素弹出至输出序…

13.5.3 【Linux】PAM 模块设置语法

PAM 借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以passwd 这个指令的调用 PAM 来说明好了。 当你执行 passwd 后&#xff0c;这支程序调用 PAM 的流程是&#xff1a; 1. 使用者开始执行 /usr/bin/passwd 这支程序&#xff0c;并输入密码&#xf…

windos 服务器设置指定ip访问指定端口,其他ip不能访问

需求&#xff1a;设置指定ip访问指定端口&#xff0c;其他ip不能访问 一&#xff0c;禁止所有ip访问 需要打开IP安全策略 或者winR 输入secpol.msc 1.先创建一个ip安全策略 2.点击添加&#xff0c;不使用添加向导&#xff0c;建一个安全策略 继续点添加 二&#xff0c;放开需…

01 Excel常用高频快捷键汇总

目录 一、简介二、快捷键介绍2.1 常用基本快捷键1 复制&#xff1a;CtrlC2 粘贴&#xff1a;CtrlV3 剪切&#xff1a;CtrlX4 撤销&#xff1a;CtrlZ5 全选&#xff1a;CtrlA 2.2 常用高级快捷键1 单元格内强制换行&#xff1a;AltEnter2 批量输入相同的内容&#xff1a;CtrlEnt…

448.找到所有数组中消失的数字

448.找到所有数组中消失的数字 class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {int[] temp new int[nums.length1];for (int i 0; i < nums.length; i) {temp[nums[i]];}ArrayList<Integer> list new ArrayList<>();for (…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Linux——设备模型

目录 本章目标 一、设备模型基础 二、总线、设备和驱动 --------------------------------------------------------------------------------------------------------------------------------- 工作两周了&#xff0c;真吃不消啊&#xff0c;虽然年轻但是早8.30晚10点还…

JAVA面试总结-Redis篇章(四)——双写一致性

JAVA面试总结-Redis篇章&#xff08;四&#xff09;——双写一致性 问&#xff1a;redis 做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;第一种情况&#xff0c;如果你的项目一致性要求高的话 采用以下逻辑我们应该先删除缓存&#xff0c;再修改数据库&…

【C++】STL——string的模拟实现、常用构造函数、迭代器、运算符重载、扩容函数、增删查改

文章目录 1.模拟实现string1.1构造函数1.2迭代器1.3运算符重载1.4扩容函数1.5增删查改 1.模拟实现string string使用文章 1.1构造函数 这里我们实现常用的第四个string(const char* s)和析构函数 class string { public://初始化列表赋值//string(const char* str "\0…

如何搭建一个成功的书店小程序

随着互联网的快速发展&#xff0c;传统实体书店面临着客流量下降的困境。为了适应市场需求&#xff0c;书店行业转型变得尤为重要。而制作书店小程序商城则成为了一种必备的转型方式。下面将详细介绍如何利用专业的小程序商城制作平台&#xff0c;手把手制作书店小程序商城。 首…

Docker 基础知识解析:容器与虚拟化的区别与优势

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

DTH11 温湿度模块

文章目录 前言一、DTH11 模块介绍二、设备树设置三、驱动程序四、测试程序五、上机测试及效果总结 前言 DHT11 是一款可测量 温度 和 湿度 的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加湿。 一、DTH11 模块介绍 …

VS下c++解析pcap文件

一、pcap文件格式 https://www.cnblogs.com/Chary/articles/15716063.html 接口协议&#xff08;四&#xff09;&#xff1a;以太网&#xff08;Ethernet&#xff09;学习&#xff08;一&#xff09;&#xff1a;协议_以太网协议_QNee的博客-CSDN博客 二、代码 pcapParser.h #…

向npm注册中心发布包(下)

目录 1、在package.json文件中指定dependencies和devDependencies 1.1 将依赖项添加到 package.json 文件 1.2 从命令行中 将依赖项添加到 package.json 文件 1.3 手动编辑 package.json 文件 2、关于语义版本控制 2.1 在已发布的包中增加语义版本 2.2 使用语义版本控制…

CentOS7系统Nvidia Docker容器基于TensorFlow2.12测试GPU

CentOS7系统Nvidia Docker容器基于TensorFlow1.15测试GPU 参考我的另一篇博客 1. 安装NVIDIA-Docker的Tensorflow2.12.0版本 1. 版本依赖对应关系&#xff1a;从源代码构建 | TensorFlow GPU 版本Python 版本编译器构建工具cuDNNCUDAtensorflow-2.6.03.6-3.9GCC 7.3.1Ba…