找回密码
 立即注册

QQ登录

只需一步,快速开始

ngqj

银牌会员

271

主题

742

帖子

2831

积分

银牌会员

积分
2831
ngqj
银牌会员   /  发表于:2021-12-10 20:12  /   查看:3006  /  回复:15
10金币
本帖最后由 ngqj 于 2021-12-10 20:43 编辑

我们需要从第三方平台通过http请求取数据保存到数据库表,数量量比较大,也有时效性要求。
其中重要的请求参数就是开始时间和结束时间。
以前我们实现模式是定时3分钟(0.05小时)自动执行,其中开始和结束时间取当前时间的前三分钟及当前时间。
然后出现了两个不友好的问题:
1、由于收到网络等影响,发现少数时候3分钟根本不能完全实现前三分钟数据的请求及保存,甚至有时候跑到了10分钟,这样的话3分钟后不会重新发起计划任务,导致数据掉了不少。
2、由于每次请求时间和通过now()取的时候有误差,虽然最多好像也只有1-2秒   数据也会掉。


今天研究了服务端日志保存到表后,发现有每次请求开始和结束时间。所以有个想法:
1、直接将服务端日志表的请求开始和结束作为时间变量去请求,这一步是没问题的。
2、但是每次计划任务不是定时方式,而是每次请求结束后自动进行进行下一次请求。


文字比较多,望大佬能耐心指导下!

最佳答案

查看完整内容

感觉可能需要电话沟通一下,您可以私信我留下您的联系方式,稍后会电话和您联系~ 问题跟进: 已远程(2021/12/13) 了解到实际的问题场景: 需要通过发送请求获取数据,请求有两个参数,起止时间,发送请求可以获取起止时间之间的记录,需要实时、连续地获取数据。 但是由于网络通信原因的影响,以及服务器时间差异,有时候在发送请求、接收或者保存到数据库时可能会失败,会造成数据的遗漏和丢失。 解决方案: 在定 ...

15 个回复

倒序浏览
最佳答案
最佳答案
Chelsey.Wang讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2021-12-10 20:12:17
来自 5#
本帖最后由 Chelsey.Wang 于 2021-12-16 14:44 编辑
ngqj 发表于 2021-12-13 13:56
没有完全理解您的意思。如果是指程序执行,是这些数据请求回来都要保存到数据库库里才执行完成,每次请求都 ...

感觉可能需要电话沟通一下,您可以私信我留下您的联系方式,稍后会电话和您联系~
问题跟进:
已远程(2021/12/13)

了解到实际的问题场景:
需要通过发送请求获取数据,请求有两个参数,起止时间,发送请求可以获取起止时间之间的记录,需要实时、连续地获取数据。
但是由于网络通信原因的影响,以及服务器时间差异,有时候在发送请求、接收或者保存到数据库时可能会失败,会造成数据的遗漏和丢失。

解决方案:
在定时任务中通过请求获取数据时,先检查数据库中已有数据中的最大时间,将最大时间作为下一次请求的起始时间参数的值,截止时间可以继续使用服务器时间的NOW(),这样就可以尽量保持数据同步且不会造成数据的遗漏了。

关于计划任务的执行时间:
计划任务执行策略是这样的:所有的定时任务都会使用同一个队列,就是说定时任务时间一到,会往队列中排队,如果前面有未完成的任务,就会等待,一直等到它能执行。
关于计划任务执行时间的原因分析:
根据以上策略,如果是间隔为3分钟的定时任务,从12:00开始执行,由于网络不稳定,第一次执行完后可能已经12:10了;这时队列中还有三个分别应该在12:03、12:06、12:09执行的计划任务,它们会在12:10分的时候依次开始执行,如果这个时候网突然又变好了,每个执行完可能只需要20S。、那么最终日志中就会这样表现:这个计划12:00执行了一次,然后在12:10分左右执行了3次。

关于计划任务的测试:
设置计划任务后,一定要先在本地测试,确认无误后再发布到正式环境。
通过服务端命令中的测试功能先检查命令是否能跑通;
确认命令本身逻辑没有问题时,可以先在设计器端尝试运行,并通过记录日志的方式记录下运行的时间,可以像我上图一样,专门在日志表中新建一个字段,标记是在设计器中运行的还是在服务器中执行的;
在发布前取消在设计器中执行,发布后在服务端确认定时任务已开启。

另外,在昨天远程时,发现这样的现象存在:
多个人在设计和发布工程,但是并没有使用协同工程,主要是通过互相发送工程文件来同步工作,这就导致可能存在其他人修改了工程,但是没有同步给所以人的情况。
结合以上两点,我猜测日志中显示的间隔不是三分钟的数据可能是其他人修改了工程并发布后(比如设置为30s用于测试)产生的。
针对这个现象,可能会由于同步问题进一步引发很多问题,在需要多人共同作业时十分建议您使用协同工程来进行:
第四十三章 协作开发 - 活字格V7帮助手册 - 葡萄城产品文档中心 (grapecity.com.cn)



回复 使用道具 举报
ngqj
银牌会员   /  发表于:2021-12-11 10:54:47
2#
补充一下,即使都在3分钟以内,定时任务执行也不规则。这是从数据库查询结果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Chelsey.Wang讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2021-12-13 13:43:06
3#
您好,看完您的问题说明后,我还有一个比较关心的点,就是咱们这个请求并保存数据后会有什么标志吗?程序是如何知道数据已经保存完了的呢?
回复 使用道具 举报
ngqj
银牌会员   /  发表于:2021-12-13 13:56:32
4#
没有完全理解您的意思。如果是指程序执行,是这些数据请求回来都要保存到数据库库里才执行完成,每次请求都是当时时间点前的数据,所以数据肯定是有固定总量的。
这个命令我们放在前端做过若干次测试,没有报错现象。
回复 使用道具 举报
ngqj
银牌会员   /  发表于:2021-12-14 23:03:03
6#
小姐姐,抱歉,我们的环境还停留在昨天远程服务端命令在日志表根本没数据的阶段。。。。。。。。。。。
还是有数据到表,但丢失更严重了
回复 使用道具 举报
Chelsey.Wang讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2021-12-15 10:16:13
7#
ngqj 发表于 2021-12-14 23:03
小姐姐,抱歉,我们的环境还停留在昨天远程服务端命令在日志表根本没数据的阶段。。。。。。。。。。。
还 ...

之前看您的日志表使用的外联数据库,这个数据库和活字格服务管理器在同一台机器上吗?
另外,如果将日志表转为内建表会有日志吗?(转换为内建表后可以通过获取数据库数据获取服务端对应表中的数据)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
ngqj
银牌会员   /  发表于:2021-12-15 10:45:12
8#
转换了也没有,并且其他都有,就这个命令没有,和当时远程的时候一样,重新发布了也不行
回复 使用道具 举报
Chelsey.Wang讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2021-12-15 12:31:36
9#
ngqj 发表于 2021-12-15 10:45
转换了也没有,并且其他都有,就这个命令没有,和当时远程的时候一样,重新发布了也不行

如果其他命令都有,只有这个命令没有,感觉是这个命令本身的问题;
您可以按照以下方式排查,进一步缩小问题范围:
1.设置一个条件为服务端命令执行后的计划任务记录日志,看看计划任务中的服务端命令是否能记录下对应的日志。
2.重新设置一个服务端命令以及计划任务,具体内容都copy现在这个命令,看看这个计划任务是否有日志呢?
回复 使用道具 举报
ngqj
银牌会员   /  发表于:2021-12-15 14:29:34
10#
SOS,命令和我发出的DEMO完全一样,按照两种排查过们,都还是没有,并且今天发现另外一个命令也没有了  但还是有其他好几个计划任务是有的,求远程啊
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部