V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lbprivateacc
V2EX  ›  程序员

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

  •  
  •   lbprivateacc · 331 天前 · 3004 次点击
    这是一个创建于 331 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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