# 解决大数据组所需要的业务数据
## 一、项目说明
本项目主要是为了解决大数据组所需要的业务数据。由于大数据项目组要访问数据库时,会进行大 SQL 查询,如果直接对业务数据库进行查询,会造成业务数据库的压力过大。所以我们采取的是用 Canel 对数据库进行同步。Canel 监听 MySQL 的 Binlog 对于直接访问数据库来说,开销相对较小。
项目中主要涉及到的有:MySQL、Canel、RocketMQ
## 二、项目的流程
![](https://www.writebug.com/myres/static/uploads/2021/12/6/befd11bb107fad0d2c0860965f7c8eae.writebug)
## 三、具体的操作
### 3.1 部署 Canel
具体操作 参考链接:
这里主要说明一下主要应该修改的部分:/usr/local/java/canel/conf/example/ instance.properties
![](https://www.writebug.com/myres/static/uploads/2021/12/6/a2f909b2539d1252fd0260eb0609fc10.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/6bcb776756f1c2afdf9837f0527429a1.writebug)
两个重要的 log
/usr/local/java/canel/logs/canal/canel.log 记录 canel 的工作情况
/usr/local/java/canel/logs/example/example.log 记录监听 MySQL 日志
### 3.2 CanelClient
- CanelClient 用于读取 Canel 中的信息,并且进行进一步的加工
![](https://www.writebug.com/myres/static/uploads/2021/12/6/698139019bc0306b861bbd8ba2420d3d.writebug)
- 具体的操作
![](https://www.writebug.com/myres/static/uploads/2021/12/6/561ea5e04630c1039490e38709aa1d8c.writebug)
- 在具体法人操作中将拼接好的 SQL 语句发送到 RocketMQ 中
![](https://www.writebug.com/myres/static/uploads/2021/12/6/cbf31bbda5046ac4520cc1abde51397b.writebug)
### 3.2.1 数据库同步的消息乱序问题?
这里有一个问题,就是如果直接不进行任何特殊处理的就直接将小心发送到 RocketMQ 中,消息就会随机均匀的发送到 Broker 中的 MessageQueue 中,Broker 中可能有多个 MessageQueue。如果消费者集群开启多线程处理消息的话,就会出现乱序问题。比如
有两个 SQL 语句:
insert into example.user (id,orderId,username,password,age) VALUES ('8','8','8','8','8');
update example.user set id = '8', orderId = '8', username = '8', password = '80', age = '80' where id=8;
![](https://www.writebug.com/myres/static/uploads/2021/12/6/ac43bdea3495b470fe59763560761d03.writebug)
- 如果两个线程分别对信息进行处理,线程 02 先进行 update,此时 MySQL 中还没有该条数据,所以该操作不会对数据库中产生影响。之后,线程 01 开始处理,插入一条数据。最终的结果是
![](https://www.writebug.com/myres/static/uploads/2021/12/6/ecc42512d8f9686bf49058b79076cd8d.writebug)
- 而正确的执行顺序的结果应该是
![](https://www.writebug.com/myres/static/uploads/2021/12/6/dd889d8b8a1bff5a95d696782d1d24dd.writebug)
### 3.2.2 解决问题的策略
将同一个订单的 binlog 进入同一 MessageQueue 中,并且使用单线程来处理消息
![](https://www.writebug.com/myres/static/uploads/2021/12/6/cb32a30cbb48fa58546e5b7d2a89f668.writebug)
Producer 中的实现策略,主要实在 send 中实现一个对于 MessageQueue 的选择器
![](https://www.writebug.com/myres/static/uploads/2021/12/6/dccffddb0dfdc049b929820b7b998169.writebug)
Consumer 中的策略实现:在监听器中实现 MessageListenerOrderly
![](https://www.writebug.com/myres/static/uploads/2021/12/6/b2489778c0b0b71c6fc789d86c09f3c3.writebug)
### 3.2.3 这就完了吗?没有,万一消息处理失败了可以走重试队列吗?
那么大家觉得这样就完了吗?
绝对不是,我之前给大家讲过,在 Consumer 处理消息的时候,可能会因为底层存储挂了导致消息处理失败,之前我们说过,此时可以返回 RECONSUME_LATER 状态,然后 broker 会过一会儿自动给我们重试。
但是这个方案用在我们的有序消息中可以吗?
那绝对是不行的,因为如果你的 consumer 获取到订单的一个 insert binlog,结果处理失败了,此时返回了 RECONSUMELATER,那么这条消息会进入重试队列,过一会儿才会交给你重试。
但是此时 broker 会直接把下一条消息,也就是这个订单的 update binlog 交给你来处理,此时万一你执行成功了,就根本没有数据可以更新!又会出现消息乱序的问题。
在消息处理出现异常的时候不是返回 RECONSUME_LATERY(会将消息丢入重试队列),而是返回
ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT(会等一会在来处理这批消息)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本项目主要是为了解决大数据组所需要的业务数据。由于大数据项目组要访问数据库时,会进行大 SQL 查询,如果直接对业务数据库进行查询,会造成业务数据库的压力过大。所以我们采取的是用 Canel 对数据库进行同步。Canel 监听 MySQL 的 Binlog 对于直接访问数据库来说,开销相对较小。 详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/132443068
资源推荐
资源详情
资源评论
收起资源包目录
解决大数据组所需要的业务数据之Java.zip (30个子文件)
解决大数据组所需要的业务数据之Java
canel-
text.txt 9B
截图
1-fa96d67fa7275a8282c04679f2f693a2.png 80KB
9-16989aafbab6339c2dc10daa1407e582.png 2KB
2-a857e64f0c5ba30ce0a03953805321f9.png 21KB
7-1b07d2315068dcc29972228835b1ac34.png 25KB
12-9584d7e07e774a4d1dcdb529356d0301.png 137KB
10-8aa218937f93887e136961ba4b59c1f0.png 23KB
11-a2a4a3b229fa684e36cf912685d8deea.png 82KB
6-54dd6f64fef0e1d550730564b3339f62.png 9KB
3-7728ec764dbd1b1788d1a69831fa9dc8.png 27KB
8-8184f3f2f0bbe398a645c1ca946acdb8.png 1KB
4-390da3eacb2b4e17ef2824b6b8e71789.png 74KB
5-baf071354e08fd279ec785704884e901.png 74KB
mvnw.cmd 6KB
pom.xml 5KB
src
test
java
com
chenglong
canel
RocketMQConsumer.java 3KB
SQLOperation.java 977B
DelayMessageConsumer.java 3KB
CanelApplicationTests.java 4KB
CanalClient.java 8KB
RocketMQProducer.java 4KB
main
resources
application.yml 1001B
java
com
chenglong
canel
CanelApplication.java 322B
.mvn
wrapper
maven-wrapper.properties 218B
maven-wrapper.jar 50KB
MavenWrapperDownloader.java 5KB
设计报告.docx 575KB
mvnw 10KB
.gitignore 333B
README.md 5KB
共 30 条
- 1
资源评论
shejizuopin
- 粉丝: 9538
- 资源: 1288
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功