xxl-job的一些感悟与规范
后台计划任务设计思路:
- 日志埋点处理,便于prd排查问题
- 2种主动job搭配规范(正向job、反查job)
- 1种消息接收的处理规范,重试机制,返回状态
- job开关维度
- 数据流图
- 线上暗job-便捷性-工具job
- 处理流水表的设计
- 分布式多副本考虑
一一说来
日志埋点处理,便于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,都要记录到流水表中记录下来,这个和普通日志埋点又有区别
- 日志埋点一般来讲不是结构化的,都是文本类型,对搜索不太友好
- 日志一般来讲,运维会在一定时间删除的,如:3个月
- 对重要数据的变动必须要记录到流水表中
- 流水表必须只insert,不update,不query的,因为表会越来越大;如果流水表不是mysql表,则另外的思路。
- 流水表关键信息是长时间完备的
分布式多副本考虑
谁家的prd不是2副本以上?
因此得考虑job的并发问题、xxl-job能较好的解决并发问题,小概率的高并发在job层面不太多,实在出现了,就分布式锁搞定。
job其实水也挺深,但是有了最佳实践,就会好很多,你说呢
xxl-job的一些感悟与规范的更多相关文章
- Android 命名规范 (提高代码可以读性)
android文件众多,根据名称来辨别用途很重要,因此命名要规范 这篇文章可参考:Android 命名规范 (提高代码可以读性) 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名 ...
- C#编程普通型计算器 经验与感悟
先贴图: 这是用C# 语言编写的普通型计算器,功能基本模仿Windows8自带计算器程序(版本6.3,内部版本9600).支持加.减.乘.除.退格.清除.平方根.倒数.相反数.连续四则.连续等号.自动 ...
- Android 命名规范 (提高代码可以读性) 转
转自:http://blog.csdn.net/vipzjyno1/article/details/23542617 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名的那个控件 ...
- 2018/2/14 设计模式学习笔记(一) 自己实现ArrayList,LinkedList和Iterator,以及在此过程中对于面向对象,面向接口,还有抽象类的一些思考感悟
因为本人目前为止学习编程不过七个月,所以后面的感悟对于一些大神来说可能嗤之以鼻,但对于一些刚刚入门的萌新来说在理解面向对象的思想上,以及抽象类和接口应该怎么设计等方面应该还是会有所帮助的 首先我们定义 ...
- LM**项目开发感悟
LM**项目开发感悟 经过一个多月的项目开发,自己主要负责服务端业务逻辑的实现.服务端采用纯servlet完成,自己是在已有的项目架构上进行编程,对于所使用的架构,自己还没有认真的研究过,但明白其用到 ...
- [转] Android 命名规范 (提高代码可以读性)
Android命名规范编码习惯 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名的那个控件什么是什么用的,就要读一遍甚至好几遍才知道,这样的话,在代码的 审查和修改过程中就会浪费 ...
- Java游戏服务器成长之路——感悟篇
又是一个美好的周末啊,现在一到周末,早上就起得晚,下午困了又会睡一两个小时,上班的时候,早上起来喝一杯咖啡,然后就能高效的工作一整天,然而到了周末人就懒散了,哈哈. 最近刚跳槽,到新公司已经干了有两周 ...
- jQuery编程规范与最佳实践(附带一些个人的笔记)
加载jQuery-Loading jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地 ...
- Android 命名规范 (转)
刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名的那个控件什么是什么用的,就要读一遍甚至好几遍才知道,这样的话,在代码的审查和修改过程中就会浪费不少不必要的时间.如果就是我一个人 ...
随机推荐
- 【安全研究】Domain fronting域名前置网络攻击技术
出品|MS08067实验室(www.ms08067.com) 千里百科 Domain Fronting基于HTTPS通用规避技术,也被称为域前端网络攻击技术.这是一种用来隐藏Metasploit,Co ...
- 20184307 实验三 Socket编程技术
实验三 Socket编程技术 学号 20184307 2019-2020-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级:1843 姓名:章森洋 ...
- 14、运行Django时浏览器中遇到Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny'
问题:Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny' 解决办法: 只需要在 Djagno ...
- mybatis-plus的Could not set property 'updateDate' of 'class com.example.pojo.User' with value 'Fri Jul 24 10:29:39 CST 2020' Cause: java.lang.IllegalArgumentException: argument type mismatch解决方案
按照官网在写mybatis-plus的自动填充功能一直报错,发现官网的解说不全,数据库是datetime类型,java程序又是date,类型不匹配 org.mybatis.spring.MyBatis ...
- C语言const是如何保证变量不被修改的?
这小段文章要理清楚的是,在C语言中,$const$是如何保证变量不被修改的? 我们可以想到两种方式: 第一种,由编译器来阻止修改$const$变量的语句,让这种程序不能通过编译: 第二种,由操作系统来 ...
- 生产中常用的获取IP地址方法的总结
从ifconfig命令的结果中筛选出除了lo网卡之外的所有IPv4地址 centos7 (1)ifconfig | awk '/inet / && !($2 ~ /^127/){pri ...
- Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)
简介 Superstellar 是一款开源的多人 Web 太空游戏,非常适合入门 Golang 游戏服务器开发. 规则很简单:摧毁移动的物体,不要被其他玩家和小行星杀死.你拥有两种资源 - 生命值(h ...
- 开源一周岁,MindSpore新特性巨量来袭
摘要:MindSpore很多新特性与大家见面了,无论是在效率提升.易用性,还是创新方面,都是干货满满. 最近,AI计算框架是业界的热点,各大厂商纷纷投身AI框架的自研发,究其原因:AI框架在整个人工智 ...
- 消息中间件-ActiveMQ
转播给所有订阅这个topic的使用者 package com.study.mq.b7_transaction; import org.apache.activemq.ActiveMQConnectio ...
- 【笔记】《Redis设计与实现》chapter13 客户端
服务器为每个客户端建立相应的redis.h/redisClient结构,这个结构保存了客户端当前的状态信息 客户端的套接字描述符 客户端的名字 客户端的标志值 只想客户端正在使用的数据库的指针,以及该 ...