各位大佬们,碰到一个消息发送的需求,想请教一下: 消息体里面的字段是主表+关联表的属性字段,当这些属性字段发生变更时,要把变更的字段内容发出去。 目前的情形是:主表,关联表的字段修改,后端有差不多 10 个接口,我的方案是使用 AOP 去拦截这些接口在 before 和 after 做处理就好了。 但我上司觉得不好,后面如果其他人开发其他接口时也有修改这些属性的可能,可能会漏掉。我上司希望这个东西不会影响后面人的开发,但我比较菜,想不出来其他方法了,希望大家能指点一二

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