V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lbprivateacc
V2EX  ›  程序员

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

  •  
  •   lbprivateacc · 2023-05-28 23:17:43 +08:00 · 3347 次点击
    这是一个创建于 579 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2023-05-29 11:31:35 +08:00
    统一回复一下:
    属性修改有业务逻辑,设计到属性状态这些的,有些属性修改要审批通过后才发消息。cannal 我看了下是支持带业务逻辑的处理,但目前时间比较紧,应该来不及去研究了,准备穷举接口先把需求完成吧。
    刚入职一个月,对项目还不是很熟悉,真是鸭梨山大啊,谢谢大家的回复😘
    25 条回复    2023-08-07 09:34:05 +08:00
    k9990009
        1
    k9990009  
       2023-05-29 06:28:24 +08:00 via Android
    canal
    xuanbg
        2
    xuanbg  
       2023-05-29 08:33:41 +08:00
    binlog
    cloud107202
        3
    cloud107202  
       2023-05-29 08:43:46 +08:00
    debezium
    96XL
        4
    96XL  
       2023-05-29 08:49:28 +08:00
    拦截这些表的 update sql ?
    4lieS
        5
    4lieS  
       2023-05-29 08:57:18 +08:00
    canal
    bugprovider
        6
    bugprovider  
       2023-05-29 09:03:30 +08:00
    binlog
    chenPiMeiHaoChi
        7
    chenPiMeiHaoChi  
       2023-05-29 09:50:43 +08:00
    发哪去啊?发给其他平台的话就用 mq ,记好日志,留好证据吵架用。
    siweipancc
        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 大部分是无意义的🤣
    jiakme
        9
    jiakme  
       2023-05-29 12:00:18 +08:00
    flink-cdc
    yinaqu
        10
    yinaqu  
       2023-05-29 12:39:19 +08:00   ❤️ 1
    兄弟,你拦截接口层,那必然会导致后续有新接口也要加拦截,甚至不是接口去修改,就是个定时任务或者其他 service 修改了字段,你或者其他开发人员忘记了有这么个更新字段业务的情况(没忘每次都要额外处理也烦)。反正你这种实现方式确实不合适。binlog 的方案我感觉相对也麻烦,思路切换到在表格映射 java 实体这一层做钩子我觉得会好很多。如果你们用的是 jpa hibernate 之类的,可以尝试直接在 entity 这一层使用 @PreUpdate 和 @PrePersist
    yinaqu
        11
    yinaqu  
       2023-05-29 12:46:23 +08:00
    @yinaqu 如果你们用的是其它 orm 框架,比如 mybatis 之类的,就去查它有没有类似的功能,感觉这是个相当基础的功能,一般来说都有
    cnoder
        12
    cnoder  
       2023-05-29 12:53:23 +08:00
    canal
    fengpan567
        13
    fengpan567  
       2023-05-29 15:15:06 +08:00
    canal
    Gobling
        14
    Gobling  
       2023-05-29 15:25:40 +08:00 via Android
    你担心 deadline ,可以和上级商量。花时间去研究 canal ,这对项目来说是好事。好过你去写一个未来肯定会废弃的东西,浪费时间。
    KimAndBella
        15
    KimAndBella  
       2023-05-29 17:25:57 +08:00
    可以考虑字节码编程,在驱动层拦截 sql ,并且抛出来,项目实现接口自定义处理方法,这样不管哪里来的 sql 都可以抓到。 以上可能描述不是很准确,不过我觉得应该可以满足你的需求。
    ycvk
        16
    ycvk  
       2023-05-29 17:32:11 +08:00
    flink cdc
    andrew2558
        17
    andrew2558  
       2023-05-29 17:36:12 +08:00
    你这个字段变更时,是要时实的发出去吗?如果不需要实时的话。可以用触发器呀,有更新时将修改内容插入到一个特定表内,再用程序去定时观察这张表不就可以了?
    SANJI59
        18
    SANJI59  
       2023-05-29 19:20:55 +08:00
    用的什么 orm 框架,拦截 sql 就可以啊。
    urnoob
        19
    urnoob  
       2023-05-29 19:40:40 +08:00 via Android
    拦 sql 会有可靠性问题。
    flink debezium 之类的可以。而且实现起来也简单
    lbprivateacc
        20
    lbprivateacc  
    OP
       2023-05-29 21:36:42 +08:00 via Android
    @yinaqu 用的是 mybaties ,想过在 dao 层做,但这些字段更新,消息发送存在着业务逻辑。处理起来感觉要😇就放弃了
    lbprivateacc
        21
    lbprivateacc  
    OP
       2023-05-29 21:37:50 +08:00 via Android
    @Gobling 要和其他项目,没办法往后推了
    lbprivateacc
        22
    lbprivateacc  
    OP
       2023-05-29 21:38:29 +08:00 via Android
    联调,漏打了
    totoro52
        23
    totoro52  
       2023-05-30 09:08:00 +08:00
    canal 无脑上啊 ,简简单单, 搞个 client 就行了
    nanjingwuyanzu
        24
    nanjingwuyanzu  
       2023-05-30 10:01:47 +08:00
    直接 canal ,你用其他的方式出了问题研究的时间肯定大于等于你研究 canal 的时间了、
    chachae
        25
    chachae  
       2023-08-07 09:34:05 +08:00
    debezium cdc ,有用 flink 的可以直接上 flink-cdc
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   974 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:37 · PVG 06:37 · LAX 14:37 · JFK 17:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.