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

Rabbit MQ 延时消息实现 redis 过期 key 自动刷新!

  •  
  •   571726193 · 2019-09-09 09:31:45 +08:00 · 5305 次点击
    这是一个创建于 1909 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先声明,这是一篇求助帖。。。

    逻辑是这样写的,我把需要缓存下来的值缓存完之后,放入队列里,在过期前,发送给消费者,消费者里去处理这个过期的 key,更新完 key 的值之后 再放入队列,等快过期是再发送,依次循环来更新过期 key 的值。但是这么做有很大的问题,会不间断的生产,不间断的消费,比如我设置的延时发送消息 3 秒一次,也不会生效,由于刚上手 mq 所以 不是太懂,求指导。

    接口 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    21 条回复    2019-09-12 10:52:13 +08:00
    hhyvs111
        1
    hhyvs111  
       2019-09-09 09:48:14 +08:00
    这个代码背景看的眼睛疼
    runnerlee
        2
    runnerlee  
       2019-09-09 09:53:35 +08:00
    手机号码暴露
    LeeSeoung
        3
    LeeSeoung  
       2019-09-09 09:55:08 +08:00
    了解下 死信 这个概念吧,rabbitmq 你用错了。
    LeeSeoung
        4
    LeeSeoung  
       2019-09-09 09:56:37 +08:00
    rabbitmq 实现延迟队列 搜下这个
    DanielGuo
        5
    DanielGuo  
       2019-09-09 10:00:03 +08:00
    我也不太懂 mq,但是根据你的描述,为什么不直接开一个定时任务直接更新,而是发到 mq 里呢?
    jakehu
        6
    jakehu  
       2019-09-09 10:04:08 +08:00
    如果只是延时队列的话我推荐你 https://github.com/beanstalkd/beanstalkd
    hosaos
        7
    hosaos  
       2019-09-09 10:07:33 +08:00
    消息堆积怎么办?没及时消费消息 还是可能导致 redis 缓存过期
    TangMonk
        8
    TangMonk  
       2019-09-09 10:07:49 +08:00
    以前做过 rabbitmq 的延时消息
    https://www.cloudamqp.com/docs/delayed-messages.html
    lllllliu
        9
    lllllliu  
       2019-09-09 10:16:32 +08:00
    redis 过期之后在生成?
    如果这样的话直接订阅 Redis 的 KeySpaceEvent 触发生成呗。
    tinybaby365
        10
    tinybaby365  
       2019-09-09 10:17:20 +08:00
    rabbitmq 安装一个延迟队列的插件。可以用这个 docker 镜像:jiangfengbing/rabbitmq-x:latest

    https://github.com/jiangfengbing/rabbitmq-x/blob/master/Dockerfile
    571726193
        11
    571726193  
    OP
       2019-09-09 10:21:00 +08:00
    @LeeSeoung 请告知一下哪里用错了
    571726193
        12
    571726193  
    OP
       2019-09-09 10:21:17 +08:00
    @DanielGuo 定时任务消耗比较大
    571726193
        13
    571726193  
    OP
       2019-09-09 10:22:16 +08:00
    @hosaos 消息堆积 和没及时消费信息 如何产生的啊 老哥
    LeeSeoung
        14
    LeeSeoung  
       2019-09-09 11:15:38 +08:00
    @571726193 不好意思没仔细看,x-delay 这个需要配合插件 rabbitmq-delayed-message-exchange 使用,没有生效的 话看下是不是安装插件并且启用了。
    571726193
        15
    571726193  
    OP
       2019-09-09 13:45:10 +08:00
    谢谢 各位的答复,目前已经解决,换了一种写法而已,功能已实现。只是还是 不太清楚原因而已。================================================================================================================================================
    blackccc
        16
    blackccc  
       2019-09-09 14:05:31 +08:00
    @571726193 什么写法
    qinxi
        17
    qinxi  
       2019-09-09 15:14:53 +08:00
    @lllllliu #9 同感为啥不用 redis 自己的
    changdy
        18
    changdy  
       2019-09-10 07:39:27 +08:00
    @lllllliu
    @qinxi
    2333 这就要从 redis 的策略说起了...那么思考题来了.你们觉得 redis 是怎么实现过期 删 key 的? 不展开了. 两位可以自己搜索.这个地方其实是个坑.
    571726193
        19
    571726193  
    OP
       2019-09-11 16:30:49 +08:00
    @qinxi redis 自带的比较消耗 cpu 量多的情况下 可想而知
    571726193
        20
    571726193  
    OP
       2019-09-11 16:31:09 +08:00
    @blackccc 还是 用延时队列
    xiaoyaojc
        21
    xiaoyaojc  
       2019-09-12 10:52:13 +08:00
    redis 的 key 过期是惰性的,不是实时的,换句话说,延迟的时间是不确定的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2635 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:51 · PVG 09:51 · LAX 17:51 · JFK 20:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.