后台计划任务设计思路:

  1. 日志埋点处理,便于prd排查问题
  2. 2种主动job搭配规范(正向job、反查job)
  3. 1种消息接收的处理规范,重试机制,返回状态
  4. job开关维度
  5. 数据流图
  6. 线上暗job-便捷性-工具job
  7. 处理流水表的设计
  8. 分布式多副本考虑

一一说来

日志埋点处理,便于prd排查问题

prd环境由于会受到严格管控,因此不可能让你idea直接连接jvm instance调试,一般来说,都是需要通过查数据或者查日志来看有没有执行,执行有没有报错,怎样的报错

也就是说此时的日志信息越完善越好,并且人类看了需要显而易懂,不需要倒腾来倒腾去,这样的日志信息给到的话,对开发人员来说是最友好的

因此埋点很重要,日志信息要详尽,越详尽越好,比如搜索出来的List size这些信息都要有,而不光是错误日志,记住越详尽越好,每个if/else节点的记录都要有

上面是记录,也就是日志埋点要想尽,但是人类需要interface才能查看到这些日志信息,因此日志的搜索也很重要,如:kibana等,因此针对kibana设计日志格式也很重要,日志记录时就要考虑到查看的友好性,不要日志记了,就是不好查。。。就麻烦了

也可以是日志记录归记录,中间加个处理切分丰富日志的表示环节也可以,到查看端能更易且更丰富的表现形式。

避免由于日志不详尽导致需要重新发布程序才能细化查问题现象出现。

2种主动job搭配规范(正向job、反查job)

当需要和三方系统做对接时,一般是我方get/post请求到对方系统,这个调用方式我称为正向调用

如果出现网络不通、或者对方系统正在发布而500报错了怎么办?

如果调用结果返回的是部分完成状态怎么办?比如我方系统把订单post到三方做业务,对方系统可能做了半同步半异步拆分,导致返回的业务状态为:部分完成。

而我们的系统依赖于这个业务返回完整完成状态后才能进行后续操作,同时我们也不想重复post订单到对方系统时,怎么办?

这时引入反查job,专门用来定时到对方系统查询业务最新状态(此时依赖对方系统有这种业务查询api供我方调用)

也就是写2个job,管你是否存在网络问题啥的,统统能考虑的到(对方系统api需要提供+自身状态机的流转(如网络不通时就不应该让反查job查了,因为根本还没有post订单过去))

1种消息接收的处理规范,重试机制,返回状态

有时,对方系统会主动通知业务的状况,可能是一次性的也可能是对方系统用了定时器定期推送的

此时,就需要和对方对应好是怎样的通知机制了,多次通知,可能需要做幂等

也可能约定好我方系统返回怎样的json内容,对方将终止推送等等

此时幂等必须要做了,因为从设计角度讲,总是需要将外部系统设定为不可靠系统对待。

job开关维度

大点的系统,job肯定是很多的,不同模块都好多job,有的会考虑把所有相关的job都合并起来处理

我说的合并是指1个job里,捞出一个大的List集合,然后分别foreach item,再循环内部判断这个item需要执行怎样的子job

当然上述是1个维度

还有个维度,就是尽量拆分子job到独立job里,单独变化,单独执行,要开要关都独立进行,没有job层面的依赖性(当然,数据层面必须会存在依赖先后顺序)

这个时候一般来说会拆分job,这样上了prd,会很方便的stop、start、临时execute某个具体job,不会说由于突发业务,或者突发异常,导致执行大job而产生一大堆job跑,或者说需要改数据才行,不太方便

job拆分后,很可能越拆越细,如果后续拆到独立docker中跑某几个job,大job就得改,麻烦

数据流图

job一多,其实对开发本身就越来越混淆了,再加上正向、反查job、工具job等,以及状态机这种依赖,确实需要设计图用来记录,帮助开发人员理解这些job

流程图(也包括跨系统的流程图)+数据流图

线上暗job-便捷性-工具job

其实上了生产环境后,很多时候系统还不太完善,有些小工具job还是要做的,比如红冲这种,可能需要做成job,并且要job能接收参数,要能临时红冲某笔订单等

这些其实很常见

处理流水表的设计

针对每笔业务的变动、每个三方api请求的参数、以及返回的response,都要记录到流水表中记录下来,这个和普通日志埋点又有区别

  1. 日志埋点一般来讲不是结构化的,都是文本类型,对搜索不太友好
  2. 日志一般来讲,运维会在一定时间删除的,如:3个月
  3. 对重要数据的变动必须要记录到流水表中
  4. 流水表必须只insert,不update,不query的,因为表会越来越大;如果流水表不是mysql表,则另外的思路。
  5. 流水表关键信息是长时间完备的

分布式多副本考虑

谁家的prd不是2副本以上?

因此得考虑job的并发问题、xxl-job能较好的解决并发问题,小概率的高并发在job层面不太多,实在出现了,就分布式锁搞定。

job其实水也挺深,但是有了最佳实践,就会好很多,你说呢

xxl-job的一些感悟与规范的更多相关文章

  1. Android 命名规范 (提高代码可以读性)

    android文件众多,根据名称来辨别用途很重要,因此命名要规范 这篇文章可参考:Android 命名规范 (提高代码可以读性) 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名 ...

  2. C#编程普通型计算器 经验与感悟

    先贴图: 这是用C# 语言编写的普通型计算器,功能基本模仿Windows8自带计算器程序(版本6.3,内部版本9600).支持加.减.乘.除.退格.清除.平方根.倒数.相反数.连续四则.连续等号.自动 ...

  3. Android 命名规范 (提高代码可以读性) 转

    转自:http://blog.csdn.net/vipzjyno1/article/details/23542617 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名的那个控件 ...

  4. 2018/2/14 设计模式学习笔记(一) 自己实现ArrayList,LinkedList和Iterator,以及在此过程中对于面向对象,面向接口,还有抽象类的一些思考感悟

    因为本人目前为止学习编程不过七个月,所以后面的感悟对于一些大神来说可能嗤之以鼻,但对于一些刚刚入门的萌新来说在理解面向对象的思想上,以及抽象类和接口应该怎么设计等方面应该还是会有所帮助的 首先我们定义 ...

  5. LM**项目开发感悟

    LM**项目开发感悟 经过一个多月的项目开发,自己主要负责服务端业务逻辑的实现.服务端采用纯servlet完成,自己是在已有的项目架构上进行编程,对于所使用的架构,自己还没有认真的研究过,但明白其用到 ...

  6. [转] Android 命名规范 (提高代码可以读性)

    Android命名规范编码习惯 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名的那个控件什么是什么用的,就要读一遍甚至好几遍才知道,这样的话,在代码的 审查和修改过程中就会浪费 ...

  7. Java游戏服务器成长之路——感悟篇

    又是一个美好的周末啊,现在一到周末,早上就起得晚,下午困了又会睡一两个小时,上班的时候,早上起来喝一杯咖啡,然后就能高效的工作一整天,然而到了周末人就懒散了,哈哈. 最近刚跳槽,到新公司已经干了有两周 ...

  8. jQuery编程规范与最佳实践(附带一些个人的笔记)

    加载jQuery-Loading jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地 ...

  9. Android 命名规范 (转)

    刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名的那个控件什么是什么用的,就要读一遍甚至好几遍才知道,这样的话,在代码的审查和修改过程中就会浪费不少不必要的时间.如果就是我一个人 ...

随机推荐

  1. nodeJS详解2

    Nodejs应用场景 创建应用服务 web开发 接口开发 客户端应用工具  gulp webpack vue脚手架 react脚手架 小程序 NodeJs基于 Commonjs模块化开发的规范,它定义 ...

  2. 干掉前端!3分钟纯 Java 注解搭个管理系统

    大家好,我是小富~ 最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下. 在我刚开始工作接触的项目都还没做前后端分离,经常需要后端来维护 ...

  3. 使用C# (.NET Core) 实现命令设计模式 (Command Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外 ...

  4. Docker安装完成后启动报错:Failed to start Docker Application Container Engine

    报错如下:显示没有启动 先关闭防火墙:防火墙关闭指令请看  <a href="Linux防火墙篇">https://www.cnblogs.com/szx666/p/1 ...

  5. 简单了解Git

    目录 Git命令 如何将一个新建的文件添加到Git仓库 版本控制 本地的项目丢到Gitee上 代码修改以及推送步骤 分支管理 Git命令 ​ 1.git init创建git本地仓库 ​ 2.ls 查看 ...

  6. 华为云PB级数据库GaussDB(for Redis)揭秘第七期:高斯Redis与强一致

    摘要:在KV数据库领域,"强一致性"不仅是一个技术名词,它更是业务与运维的重要需求. 清明刚过,五一假期就要来了.大好春光,不如去婺源看油菜花吧!小云迅速打开APP刷出余票2张,赶 ...

  7. BUAAOO第三单元总结

    JML理论基础 JML规定了一些语法,用这些语法可以描述一个方法,一个类的行为,理论基础是离散数学吧 JML常用语法 前置条件: 使用 require + 表达式 ,表达式一般为布尔表达式 副作用: ...

  8. Linux保护机制和绕过方式

    Linux保护机制和绕过方式 CANNARY(栈保护) ​ 栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行.用C ...

  9. Mybatis3源码笔记(三)Configuration

    1. XMLConfigBuilder 上一篇大致介绍了SqlSession的生成.在DefaultSqlSessionFactory的构造函数中就提到了Configuration这个对象.现在我们来 ...

  10. 面试系列<5>——面向对象

    面试系列--面向对象思想 一.三大特性 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其成为一个不可分割的独立实体.数据被保护在抽象数据类型内部,尽可能地隐藏内部细节,只保留一些对外的接口 ...