菜鸡碰到一个消息发送的需求,想不到啥好的解决方法,想请教一下大家

2023-05-28 23:17:43 +08:00
 lbprivateacc

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

3380 次点击
所在节点    程序员
25 条回复
k9990009
2023-05-29 06:28:24 +08:00
canal
xuanbg
2023-05-29 08:33:41 +08:00
binlog
cloud107202
2023-05-29 08:43:46 +08:00
debezium
96XL
2023-05-29 08:49:28 +08:00
拦截这些表的 update sql ?
4lieS
2023-05-29 08:57:18 +08:00
canal
bugprovider
2023-05-29 09:03:30 +08:00
binlog
chenPiMeiHaoChi
2023-05-29 09:50:43 +08:00
发哪去啊?发给其他平台的话就用 mq ,记好日志,留好证据吵架用。
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 大部分是无意义的🤣
jiakme
2023-05-29 12:00:18 +08:00
flink-cdc
yinaqu
2023-05-29 12:39:19 +08:00
兄弟,你拦截接口层,那必然会导致后续有新接口也要加拦截,甚至不是接口去修改,就是个定时任务或者其他 service 修改了字段,你或者其他开发人员忘记了有这么个更新字段业务的情况(没忘每次都要额外处理也烦)。反正你这种实现方式确实不合适。binlog 的方案我感觉相对也麻烦,思路切换到在表格映射 java 实体这一层做钩子我觉得会好很多。如果你们用的是 jpa hibernate 之类的,可以尝试直接在 entity 这一层使用 @PreUpdate 和 @PrePersist
yinaqu
2023-05-29 12:46:23 +08:00
@yinaqu 如果你们用的是其它 orm 框架,比如 mybatis 之类的,就去查它有没有类似的功能,感觉这是个相当基础的功能,一般来说都有
cnoder
2023-05-29 12:53:23 +08:00
canal
fengpan567
2023-05-29 15:15:06 +08:00
canal
Gobling
2023-05-29 15:25:40 +08:00
你担心 deadline ,可以和上级商量。花时间去研究 canal ,这对项目来说是好事。好过你去写一个未来肯定会废弃的东西,浪费时间。
KimAndBella
2023-05-29 17:25:57 +08:00
可以考虑字节码编程,在驱动层拦截 sql ,并且抛出来,项目实现接口自定义处理方法,这样不管哪里来的 sql 都可以抓到。 以上可能描述不是很准确,不过我觉得应该可以满足你的需求。
ycvk
2023-05-29 17:32:11 +08:00
flink cdc
andrew2558
2023-05-29 17:36:12 +08:00
你这个字段变更时,是要时实的发出去吗?如果不需要实时的话。可以用触发器呀,有更新时将修改内容插入到一个特定表内,再用程序去定时观察这张表不就可以了?
SANJI59
2023-05-29 19:20:55 +08:00
用的什么 orm 框架,拦截 sql 就可以啊。
urnoob
2023-05-29 19:40:40 +08:00
拦 sql 会有可靠性问题。
flink debezium 之类的可以。而且实现起来也简单
lbprivateacc
2023-05-29 21:36:42 +08:00
@yinaqu 用的是 mybaties ,想过在 dao 层做,但这些字段更新,消息发送存在着业务逻辑。处理起来感觉要😇就放弃了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943696

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX