分享一篇关于使用阿里云消息队列中遇到的坑
相信很多小伙伴都在开发中使用过消息队列,尤其是高并发的情况,一般可以在缓存中操作数据,然后通过消息异步处理业务逻辑,操作数据库等。
本人所在的公司使用了阿里云的消息队列和RabbitMQ,据说使用阿里云消息队列的一部分原因是RabbitMQ实现延迟消息比较复杂,要依赖死信...接下来进入主题,说说我是怎么使用消息和遇到的坑吧~
一般来讲,我们可以使用一个脚本来接收阿里云消息处理业务逻辑,但是如果业务量特别大的话,我们可能会遇到一个问题,就是脚本处理不过来,消息积攒的数量可能远远超出每秒能够处理的数量。针对这种现象,我们可以启动多个处理脚本来同时处理消息,这样会明显加快处理消息的速度。
但是,多个脚本同时从一条消息队列里面取消息的时候,会不会同时取到同一条消息,然后造成消息重复处理的现象呢?我觉得肯定是会的,消息是第三方服务,我们无法保证他的100%稳定,所以我们需要在处理的时候下点功夫了。
我们发送消息的数据体是json,一般我们会在每条消息里面加一个taskid,以时间戳(精确到毫秒级) + 随机数组成,这个taskid足够长,我们得以保证他不会重复(重复的可能性极小,类似于mongodb的主键也是这个原理)。
接下来看一段代码:
<?php
try {//伪代码$getData = $mq->receive();$getData = \Zend\Json\Json::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();
}
小伙伴们知道这段代码哪里有问题吗?
分享一篇关于使用阿里云消息队列中遇到的坑相关推荐
- 阿里云消息队列 2021 新功能新特性重要里程碑
关于阿里云消息队列更多新功能新特性及详细介绍,欢迎大家查阅官网各产品"新功能发布记录": [1] RocketMQ: https://help.aliyun.com/docu ...
- 阿里云消息队列 RocketMQ、Kafka 荣获金融级产品稳定性测评 “先进级” 认证
近日,由中国信通院和混沌工程实验室联合举办的混沌工程技术沙龙–金融行业精品专场顺利召开,并发布金融级产品稳定性测评成果.在分布式系统稳定性评估体系获奖名单中,阿里云分布式消息队列服务成为通过首批消息队 ...
- 阿里云消息队列 RocketMQ 5.0 全新升级:消息、事件、流融合处理平台
从"消息"到"消息.事件.流"的大融合 消息队列作为当代应用的通信基础设施,微服务架构应用的核心依赖,通过异步解耦能力让用户更高效地构建分布式.高性能.弹性健壮 ...
- 云栖发布|阿里云消息队列 RocketMQ 5.0:消息、事件、流融合处理平台
简介:RocketMQ5.0 的发布标志着阿里云消息正式从消息领域正式迈向了"消息.事件.流"场景大融合的新局面. 引言:从"消息"到"消息.事件.流 ...
- 阿里云消息队列Kafka商业化:支持消息无缝迁移到云上
摘要: 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态.在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性9 ...
- 阿里云消息队列MQ学习—阿里云大学视频课
在刷ACE题的过程中,感觉对于消息队列部分的理解不是很深刻,这里来学习一下. 例行还是先走一遍阿里云大学的一些视频课程扫扫盲,选择如下课程: 阿里消息队列MQ简介:阿里巴巴中间件技术部自主研发的专业消 ...
- 阿里云消息队列python_41. Python Queue 多进程的消息队列 PIPE
消息队列: 消息队列是在消息传输过程中保存消息的容器. 消息队列最经典的用法就是消费者和生产者之间通过消息管道来传递消息,消费者和生产生是不通的进程.生产者往管道中写消息,消费者从管道中读消息. 相当 ...
- 国内外物联网平台初探(篇二:阿里云物联网套件)
国内外物联网平台初探(篇二:阿里云物联网套件) ------ [导读]------ 物联网智库将于本周开始,在每周五下午的第二篇文章推送由马智先生研究撰写的系列文章--<国内外物联网平台初探&g ...
- 【专栏】国内外物联网平台初探(篇二:阿里云物联网套件)
[专栏]国内外物联网平台初探(篇二:阿里云物联网套件) 作者:马智 物联网智库 整理发布 转载请注明来源和出处 ------ [导读]------ 物联网智库将于本周开始,在每周五下午的第二篇文章推送 ...
最新文章
- 且看电脑高手如何优雅的使用windows系统
- unique函数_走进C++11(三十四)unique_ptr
- 小众的分布式版本管理工具Code Co-op
- html selsec 文字靠右,EDA课程设计
- 图片添加图片水印和文字水印
- 为什么python的命名不能以数字开头_python变量不能以数字打头
- 动态规划算法分析与探究
- MySQL基于日志还原数据
- 对分类型变量,进行编码处理——pd.get_dummies()、LabelEncoder()、oneHotEncoder()
- C#压缩指定的文件并生成zip文件
- java 万年历_改进java万年历,前几天看到别人写的java万年历,其中不足之处多多...
- python生成的exe反编译
- 模糊综合评价(清风建模学习笔记)
- Android TV H5 电视应用
- 用了这个办法解决Discuz! Database Error报错
- 解决1 error and 0 warnings potentially fixable with the `--fix` option.
- oracle12c配置文档,Oracle12C安装配置文档
- 洛谷—— AT_pakencamp_2021_day2_a Participants 2
- 主持人大赛计算机专业,计算机系主持人大赛简报
- Required request parameter ‘xxxx‘ for method parameter type Date is present but converted to null