各位大佬们,碰到一个消息发送的需求,想请教一下: 消息体里面的字段是主表+关联表的属性字段,当这些属性字段发生变更时,要把变更的字段内容发出去。 目前的情形是:主表,关联表的字段修改,后端有差不多 10 个接口,我的方案是使用 AOP 去拦截这些接口在 before 和 after 做处理就好了。 但我上司觉得不好,后面如果其他人开发其他接口时也有修改这些属性的可能,可能会漏掉。我上司希望这个东西不会影响后面人的开发,但我比较菜,想不出来其他方法了,希望大家能指点一二
1
k9990009 2023-05-29 06:28:24 +08:00 via Android
canal
|
2
xuanbg 2023-05-29 08:33:41 +08:00
binlog
|
3
cloud107202 2023-05-29 08:43:46 +08:00
debezium
|
4
96XL 2023-05-29 08:49:28 +08:00
拦截这些表的 update sql ?
|
5
4lieS 2023-05-29 08:57:18 +08:00
canal
|
6
bugprovider 2023-05-29 09:03:30 +08:00
binlog
|
7
chenPiMeiHaoChi 2023-05-29 09:50:43 +08:00
发哪去啊?发给其他平台的话就用 mq ,记好日志,留好证据吵架用。
|
8
siweipancc 2023-05-29 10:24:49 +08:00
最近写了个类似的东西,如果是 java 跟 Hibernate 有几个类给你关注一下
`org.hibernate.integrator.spi.Integrator`,`org.hibernate.event.spi.PostUpdateEventListener` 然后可以参照一下官方的缓存实现 `org.hibernate.cache.internal.CollectionCacheInvalidator` 其他的实现 JPA 标准的提供商都应该都有这一块的逻辑,非 service 驱动的话 hook 进去即可。如果不是 JPA 标准,那么你只能自己实现了,注意`脏值`这个语义, 拦截 sql 大部分是无意义的🤣 |
9
jiakme 2023-05-29 12:00:18 +08:00
flink-cdc
|
10
yinaqu 2023-05-29 12:39:19 +08:00 1
兄弟,你拦截接口层,那必然会导致后续有新接口也要加拦截,甚至不是接口去修改,就是个定时任务或者其他 service 修改了字段,你或者其他开发人员忘记了有这么个更新字段业务的情况(没忘每次都要额外处理也烦)。反正你这种实现方式确实不合适。binlog 的方案我感觉相对也麻烦,思路切换到在表格映射 java 实体这一层做钩子我觉得会好很多。如果你们用的是 jpa hibernate 之类的,可以尝试直接在 entity 这一层使用 @PreUpdate 和 @PrePersist 。
|
11
yinaqu 2023-05-29 12:46:23 +08:00
@yinaqu 如果你们用的是其它 orm 框架,比如 mybatis 之类的,就去查它有没有类似的功能,感觉这是个相当基础的功能,一般来说都有
|
12
cnoder 2023-05-29 12:53:23 +08:00
canal
|
13
fengpan567 2023-05-29 15:15:06 +08:00
canal
|
14
Gobling 2023-05-29 15:25:40 +08:00 via Android
你担心 deadline ,可以和上级商量。花时间去研究 canal ,这对项目来说是好事。好过你去写一个未来肯定会废弃的东西,浪费时间。
|
15
KimAndBella 2023-05-29 17:25:57 +08:00
可以考虑字节码编程,在驱动层拦截 sql ,并且抛出来,项目实现接口自定义处理方法,这样不管哪里来的 sql 都可以抓到。 以上可能描述不是很准确,不过我觉得应该可以满足你的需求。
|
16
ycvk 2023-05-29 17:32:11 +08:00
flink cdc
|
17
andrew2558 2023-05-29 17:36:12 +08:00
你这个字段变更时,是要时实的发出去吗?如果不需要实时的话。可以用触发器呀,有更新时将修改内容插入到一个特定表内,再用程序去定时观察这张表不就可以了?
|
18
SANJI59 2023-05-29 19:20:55 +08:00
用的什么 orm 框架,拦截 sql 就可以啊。
|
19
urnoob 2023-05-29 19:40:40 +08:00 via Android
拦 sql 会有可靠性问题。
flink debezium 之类的可以。而且实现起来也简单 |
20
lbprivateacc OP @yinaqu 用的是 mybaties ,想过在 dao 层做,但这些字段更新,消息发送存在着业务逻辑。处理起来感觉要😇就放弃了
|
21
lbprivateacc OP @Gobling 要和其他项目,没办法往后推了
|
22
lbprivateacc OP 联调,漏打了
|
23
totoro52 2023-05-30 09:08:00 +08:00
canal 无脑上啊 ,简简单单, 搞个 client 就行了
|
24
nanjingwuyanzu 2023-05-30 10:01:47 +08:00
直接 canal ,你用其他的方式出了问题研究的时间肯定大于等于你研究 canal 的时间了、
|
25
chachae 2023-08-07 09:34:05 +08:00
debezium cdc ,有用 flink 的可以直接上 flink-cdc
|