资讯专栏INFORMATION COLUMN

分享一篇关于使用阿里云消息队列中遇到的坑

idealcn / 3023人阅读

摘要:相信很多小伙伴都在开发中使用过消息队列,尤其是高并发的情况,一般可以在缓存中操作数据,然后通过消息异步处理业务逻辑,操作数据库等。

相信很多小伙伴都在开发中使用过消息队列,尤其是高并发的情况,一般可以在缓存中操作数据,然后通过消息异步处理业务逻辑,操作数据库等。

本人所在的公司使用了阿里云的消息队列和RabbitMQ,据说使用阿里云消息队列的一部分原因是RabbitMQ实现延迟消息比较复杂,要依赖死信...接下来进入主题,说说我是怎么使用消息和遇到的坑吧~

一般来讲,我们可以使用一个脚本来接收阿里云消息处理业务逻辑,但是如果业务量特别大的话,我们可能会遇到一个问题,就是脚本处理不过来,消息积攒的数量可能远远超出每秒能够处理的数量。针对这种现象,我们可以启动多个处理脚本来同时处理消息,这样会明显加快处理消息的速度。

但是,多个脚本同时从一条消息队列里面取消息的时候,会不会同时取到同一条消息,然后造成消息重复处理的现象呢?我觉得肯定是会的,消息是第三方服务,我们无法保证他的100%稳定,所以我们需要在处理的时候下点功夫了。

我们发送消息的数据体是json,一般我们会在每条消息里面加一个taskid,以时间戳(精确到毫秒级) + 随机数组成,这个taskid足够长,我们得以保证他不会重复(重复的可能性极小,类似于mongodb的主键也是这个原理)。

接下来看一段代码:

try {
    //伪代码
    $getData    = $mq->receive();
    $getData    = endJsonJson::decode($getData, true);  //如果不是json数据 我们可以捕获到异常

    //先检测数据
    $errorMsg   = [];
    if (!isset($getData["taskid"]) || $getData["taskid"] == "") {
        $errorMsg[]     = "taskid不能为空";
    }

    if (!isset($getData["order_id"]) || $getData["order_id"] == "") {
        $errorMsg[]     = "订单号不能为空";
    }

    if (!cache()->setex($this->cachePrefix . $getData["taskid"], 1)) {
        $errorMsg[]     = "该任务已被处理";
    }

    if (count($errorMsg) >= 1) {
        //记日志  方便排错
        $this->log("xxxx处理脚本错误 哪个文件 错误级别 错误原因" . implode("|", $errorMsg));
        return false;
    }

    //必须有过期时间  不然会把redis撑爆
    cache()->expire($this->cachePrefix . $getData["taskid"], 7 * 86400);

    /**
     * 处理业务逻辑
     */
    
    //业务逻辑处理正常,删除redis锁,删除消息
    cache()->del($this->cachePrefix . $getData["taskid"]);
    $mq->ack();
    return true;
}

//捕获到了异常
catch (Exception $e) {
     //一定要把这次消息删掉 不然会重复进来 日志错误级别记高一点 手动处理问题
    $mq->ack();
    //记日志
    $this->log();
}

小伙伴们知道这段代码哪里有问题吗?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30005.html

相关文章

  • 面试关于Redis的问题看这篇就够了

    摘要:所以查阅官方文档以及他人造好的轮子,总结了一些面试和学习中你必须掌握的问题。在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。 昨天写了一篇自己搭建redis集群并在自己项目中使用的文章,今天早上看别人写的面经发现redis在面试中还是比较常问的(笔主主Java方向)。所以查阅官方文档以及他人造好的轮子,总结了一些redis面试和学习中你必须掌握的问题。...

    yanbingyun1990 评论0 收藏0
  • 面试关于Redis的问题看这篇就够了

    摘要:所以查阅官方文档以及他人造好的轮子,总结了一些面试和学习中你必须掌握的问题。在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。 昨天写了一篇自己搭建redis集群并在自己项目中使用的文章,今天早上看别人写的面经发现redis在面试中还是比较常问的(笔主主Java方向)。所以查阅官方文档以及他人造好的轮子,总结了一些redis面试和学习中你必须掌握的问题。...

    A Loity 评论0 收藏0
  • 【面试精选】关于大型网站系统架构你不得不懂的10个问题

    摘要:降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。谈谈你对和的认识两者关系具体可以看公众号阿里巴巴中间件的这篇文章独家解读从微服务框架到微服务生态与并不是竞争关系,作为成熟的框架,其易用性扩展性和健壮性已得到业界的认可。 该文已加入笔主的开源项目——JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目),地址:https://github.com/...

    leiyi 评论0 收藏0
  • 【面试精选】关于大型网站系统架构你不得不懂的10个问题

    摘要:降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。谈谈你对和的认识两者关系具体可以看公众号阿里巴巴中间件的这篇文章独家解读从微服务框架到微服务生态与并不是竞争关系,作为成熟的框架,其易用性扩展性和健壮性已得到业界的认可。 该文已加入笔主的开源项目——JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目),地址:https://github.com/...

    luqiuwen 评论0 收藏0
  • android知识总结 - 收藏集 - 掘金

    摘要:一个精简全面方便的库掘金可设置开启和关闭可设置全局关于六掘金现在的没有几个是不联网的了,在流量费用很高速度一般的今天给用户合理节省流量,以及提高响应速度就显得尤为重要了。内容提要架构浮窗组件开源应用瘦身,从到掘金,大家好,我是。 一个精简、全面、方便的 AndroidLog 库 --ALog - Android - 掘金Functions 可设置Log开启和关闭 可设置Log全局Tag...

    sPeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<