# jds
**Repository Path**: sdvdxl/jds
## Basic Information
- **Project Name**: jds
- **Description**: java data sync, java 数据同步/分发框架,支持重试策略
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-12-16
- **Last Updated**: 2021-12-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# JAVA 简单数据同步(传输)框架
## 背景
A服务(称为上游服务)推送了数据过来后,需要服务转发数据给B,C,D(称为下游服务)。上游服务发送成功后就不关心这个数据了,因此需要本服务保证下游服务都能够收到这些数据。
但是下游服务中的任一个任何时刻都有可能出现问题,比如网络不通,服务停机维护等。所以需要本服务在提供转发数据的同时,尽可能减少其他服务的影响(B停机不影响C和D的转发),所以需要并行分发,同时提供重试机制。
## 原理
1. 通过 `putData` 方法同步接收数据并持久化,保证接收数据这个地方是可靠的,如果这个地方出现问题,需要上游服务提供重试机制
2. 每个 DataSync 实例内部都有一个线程进行数据处理,start 之后,此线程就不断查询同步状态记录,将最后同步的一条记录的id作为查询条件,查询新的一条数据并返回给内部处理
3. 内部调用用户数据处理接口,用户需要实现 `UserDataHandler` 接口
4. 如果 `UserDataHandler` 成功,应该返回 `NEXT` 代表处理下一条数据;否则应该返回 `RETRY`,不建议返回异常,异常信息最好用户自己处理完成后根据业务选择返回结果
5. 根据用户返回结果处理,如果是 `NEXT` 保存最后一条记录状态,继续处理下一条数据;如果非NEXT,sleep 3s 重试
## 底层数据存储支持:
- [x] mongodb
- [ ] mysql
- [ ] redis
- [ ] elasticsearch
- [ ] kafka
- [ ] rabbitmq
- [ ] zookeeper
- [ ] ... 需要自行实现api接口
## 使用方式
添加依赖
```xml
cloud.uke.jds
mongodb-provider
1.0.0-SNAPSHOT
```
尝鲜版需要加入snapshot仓库
```xml
sonatype-snapshot
https://s01.oss.sonatype.org/content/repositories/snapshots/
```
```java
DataSyncBuilder builder = DataSync.builder();
builder.setInternalStoreDataHandler(new MongoInternalStoreDataHandlerImpl<>(mongoTemplate));
builder.setUserDataHandler(
student -> {
System.out.println("同步数据:" + student);
return SyncResult.NEXT;
});
builder.setSrcId(src);
builder.setTargetId(target);
DataSync dataSync = builder.build();
dataSync.start();
```
参见测试用例 `DataSyncMongoProviderTest`。
## 方法介绍
- start 启动数据同步
- pause 暂停数据同步
- stop 停止数据同步(此实例无法再次使用,需要重新实例化)
- veryDangerOperationCleanAllData 删除 src 相关的原始数据,并删除src和target相关的同步状态,注意这个是非常危险的操作,数据不可恢复,所以弄了个这么长的名字以此引起你的注意
- putData 同步记录新增的数据进行持久化