后台计划任务设计思路:

  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. C语言变量及其生命周期

    变量类型以及作用域和生命周期 变量的作用域 变量的作用域就该变量可以被访问的区间,变量的作用域可以分为以下四种: 进程作用域(全局):在当前进程的任何一个位置都可以访问 函数作用域:当流程转移到函数后 ...

  2. 3、Spring教程之IOC创建对象方式

    1.通过无参构造方法来创建 1.User.java public class User { private String name; public User() { System.out.printl ...

  3. 【笔记】《Redis设计与实现》chapter9 数据库

    9.1 服务器中的数据库 Redis服务器将所有都保存在服务器状态redis.h/redisServer结构中 struct redisServer{ //... // 一个数组,保存着服务器中所有数 ...

  4. 网络编程Netty入门:ByteBuf分析

    目录 Netty中的ByteBuf优势 NIO使用的ByteBuffer有哪些缺点 ByteBuf的优势和做了哪些增强 ByteBuf操作示例 ByteBuf操作 简单的Demo示例 堆内和堆外内存 ...

  5. [源码分析] 分布式任务队列 Celery 多线程模型 之 子进程

    [源码分析] 分布式任务队列 Celery 多线程模型 之 子进程 目录 [源码分析] 分布式任务队列 Celery 多线程模型 之 子进程 0x00 摘要 0x01 前文回顾 1.1 基类作用 1. ...

  6. 编写一个简单的flask的前后端交互的网页(flask简单知识的讲解)

    实验原理: 1.什么是flask Flask是一个使用Python编写的轻量级Web应用框架,其WSGI工具采用Werkzeng,模板引擎使用Jinja2.Flask与 Django之间的区别就是Dj ...

  7. OO_UNIT4_SUMMARY

    经过一个学期的学习,OO课程终于落下帷幕.本次博客会首先对第四单元作业的架构进行分析,再对OO课程进行总体回顾,最后是个人的建议与体会. 一.第四单元三次作业架构设计 1.第一次作业 第一次作业是对类 ...

  8. Spring-Cloud-Alibaba之Seata

    微服务中不可避免的会发生服务间的调用,这就一定会涉及到事务相关的问题,在单体项目中我们可以直接很方便的实现事务回滚,但是在分布式系统中就不能像以前那么做了,因为各个服务是独立的一套系统: 而要实现跨服 ...

  9. 【SpringBoot】SpringBoot2.x整合定时任务和异步任务处理

    SpringBoot2.x整合定时任务和异步任务处理 一.项目环境 springboot2.x本身已经集成了定时任务模块和异步任务,可以直接使用 二.springboot常用定时任务配置 1.在启动类 ...

  10. 【工具库】Java实体映射工具MapStruct

    一.什么是MapStruct? MapStruct是用于代码中JavaBean对象之间的转换,例如DO转换为DTO,DTO转换为VO,或Entity转换为VO等场景,虽然Spring库和 Apache ...