# Final-consistency-task **Repository Path**: yao-yang/Final-consistency-task ## Basic Information - **Project Name**: Final-consistency-task - **Description**: 精致,硬朗,除了不大什么都大的分布式最终一致性任务框架 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-20 - **Last Updated**: 2022-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 最终一致性任务框架 ## 1、介绍 精致,硬朗,除了不大什么都大的分布式最终一致性任务框架 ## 2、执行流程 ![输入图片说明](https://images.gitee.com/uploads/images/2022/0120/162404_615bc670_1082266.png "屏幕截图.png") ## 3、详细运行原理 撰写中。。。。 ## 4、使用场景 用于保证某个操作一定成功,最终一致 1. xxxx 2. xxxx 3. xxxx ## 5、数据库脚本 ### 5.1、单库单任务表的数据库脚本 > 在所在服务的数据库中加入该表即可,如果需要分库,在每个库中创建一份即可 ### 5.2、多库每个库一个任务表的数据库脚本 > (这里以2库每个库一张任务表举例) ```sql CREATE DATABASE `consistency_task0` CHARACTER SET 'utf8' COLLATE 'utf8mb4_general_ci'; USE `consistency_task0`; CREATE TABLE `final_consistency_task` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键自增', `task_id` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户自定义的任务名称,如果没有则使用方法签名', `task_status` int NOT NULL DEFAULT '0' COMMENT '执行状态', `execute_times` int NOT NULL COMMENT '执行次数', `execute_time` bigint NOT NULL COMMENT '执行时间', `parameter_types` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数的类路径名称', `method_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '方法名', `method_sign_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '方法签名', `execute_interval_sec` int NOT NULL DEFAULT '60' COMMENT '执行间隔秒', `delay_time` int NOT NULL DEFAULT '60' COMMENT '延迟时间:单位秒', `task_parameter` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务参数', `performance_way` int NOT NULL COMMENT '执行模式:1、立即执行 2、调度执行', `thread_way` int NOT NULL COMMENT '线程模型 1、异步 2、同步', `error_msg` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '执行的error信息', `alert_expression` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '告警表达式', `alert_action_bean_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '告警逻辑的的执行beanName', `fallback_class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '降级逻辑的的类路径', `fallback_error_msg` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '降级失败时的错误信息', `shard_key` bigint DEFAULT '0' COMMENT '任务分片键', `gmt_create` datetime NOT NULL COMMENT '创建时间', `gmt_modified` datetime NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_id_shard_key` (`id`,`shard_key`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ``` ## 6、在工程中的配置文件添加配置 > 做了配置项提示功能,在配置application.yml或application.properties文件中可以通过输入 xxx 得到相关提示 ### 6.1、任务表为单库的配置 ### 6.2、任务表为多库的配置 ```yaml xxx: final: consistency: parallel: pool: thread-max-pool-size: 6 thread-core-pool-size: 6 thread-pool-keep-alive-time: 60 thread-pool-keep-alive-time-unit: SECONDS thread-pool-queue-size: 100 action: fail-count-threshold: 0 shard: # 表示任务表有多个库,一致性框架自身会计算分库的key task-shared: true # 开启分库以后记的把分库的配置也写出来,框架使用了shardingsphere作为分库的插件,记的在项目的pom依赖中加入shardingsphere的依赖,下面的配置是分两个库为演示 spring: main: allow-bean-definition-overriding: true shardingsphere: datasource: # 数据源名称 names: ds0,ds1 ds0: jdbc-url: jdbc:mysql://localhost:3306/consistency_task0?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false username: root password: rootroot driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: connection-timeout: 3000 ds1: jdbc-url: jdbc:mysql://localhost:3306/consistency_task1?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false driver-class-name: com.mysql.cj.jdbc.Driver username: root password: rootroot type: com.zaxxer.hikari.HikariDataSource hikari: connection-timeout: 3000 props: sql: show: true sharding: tables: # 最终一致性任务库分库策略 xxx_final_consistency_task: # 数据分布情况 actual-data-nodes: ds$->{0..1}.xxx_final_consistency_task # order库分库策略 database-strategy: inline: # 分库字段为 shard_key 这个写死即可 sharding-column: shard_key algorithm-expression: ds$->{shard_key % 2} ``` > 上面给出的是相关的配置项,同时如果不配置,框架会按照上面给出的默认值进行自动配置,业务服务根据自身情况定制即可。 ### 6.3、如果您选择了任务表为多库模式的配置请在pom配置文件中加入相关依赖 ```xml org.apache.shardingsphere sharding-jdbc-spring-boot-starter 4.0.0-RC1 ``` > 注意:因为框架是基于AOP的,因此注解只能加到public的方法上,建议所有发消息的组件放到一个类中,或者做一个发消息的接口,统一管理发消息的方法 ## 7、告警通知 > 1、配置了降级类的告警逻辑 > 如果配置了降级类,则会先进行原逻辑的调度用,调用失败,满足降级配置,则会降级。 > 如果一次调用中,正常逻辑失败,降级也失败,满足告警条件则会进行告警。 > 2、没有配置降级类的告警逻辑 > 如果没有配置降级类,只要满足告警表达式就会进行告警。 ``` EXECUTE_RIGHT_NOW(1, "立即执行"), EXECUTE_SCHEDULE(2, "调度执行"); ``` ###### EXECUTE_RIGHT_NOW: 表示任务会被框架立即执行。 ###### ###### EXECUTE_SCHEDULE表示,任务下发后,不会执行,需要业务服务中的定时任务来进行调度。 ​ ## 8、任务调度 注:业务服务需要在一个定时任务中调用框架的方法。框架会将到时间需要执行及执行失败的任务查询出来后进行执行。 ### 8.1、使用spring定时任务调度 使用spring的定时任务来执行performanceTask()方法时候,需要保证多个业务服务的实例,同一时间只有一个实例可以执行runTask()方法。 所以要加分布式锁来实现。 ### 8.2、使用xxl-job或elastic-job调度 分布式任务调度框架可以设置任务同一时间只有一个实例可以执行成功,比如选择执行的策略是第一个或者最后一个即可实现该功能。 ​ ## **未完待续。。。。。。**