laravel 消息队列浅析

  laravel支持消息队列,发短信,发送消息通知 用起来很方便,延时队列还可以用来方式晚上发短信骚扰用户。但是使用的时候遇到了不少问题,比如laravel队列的重试功能,真的是让人很慌,打款或者消息推送,哪个重复了都会造成很大的影响。接下来就列举几个我遇到过的问题,总结一下,防止再次踩坑。

第一点: 使用worker监听,出队的代码如果又修改,那么上线必须重启监听

第二点:防止异常重试,异常重试次数可以通过--tries参数来设置,如果一个业务场景是,少发几条没关系,但是一定不能多发,那么可以不重试,attemps参数可以看到重试了几次,delete()方法,可以手动防止重试,将消息删除。

第三点:防止超时重试, 这个和异常重试不太一样,默认超时时间为60秒,可以通过timeout参数来设置。 如果时间超过60秒,那么这个任务还会被执行。

  从原理分析,一个队列开启监听,这个时候会去检查,delayed队列(这个里面装的都是之前执行异常之后放进去的消息,这些消息的延时时间可以通过sleep参数设置,默认3秒),因为delayed队列用的有序集合,可以很方便获取过期的消息,全部放进默认队列(数据结构为列表)中,并将delayed中的删除, 这个时候去检查reserved队列,这个队列也是有序集合,查看过期的(过期时间60秒,可以通过timeout来设置), 将这部分过期的数据重新放进defeat队列,并将reserved中的删除。

  这个时候准备工作就做好了,准备开始执行, 在执行之前,先将defeat队列中的消息放一份到reserved中(设置有效时间为timeout参数),这个时候从defeat队列弹出数据开始执行,如果执行成功,那么删除reserved队列中的数据。如果执行报错 那么也把消息从reserved队列中删除,并将这条消息放进delayed队列中。

如果一直执行,那么reserved中的数据就一直在,直到过期。 当下一次别的请求进来的时候,又回重复上述动作,这个时候reserved中的消息就会被再放进defeat,就会再次执行。

原文地址:https://www.cnblogs.com/tobemaster/p/10036102.html

时间: 2024-10-29 21:55:29

laravel 消息队列浅析的相关文章

Laravel 集成 RabbitMQ 消息队列

目录 消息队列 RabbitMQ docker 部署 RabbitMQ 操作步骤 访问管理界面 Laravel 集成 RabbitMQ Laravel 5.2 Laravel 5.5 消息队列 消息(Message)是指在应用间传送的数据.可以只包含文本字符串,也可以嵌入对象. 消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递. 消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的

浅析腾讯云分布式高可靠消息队列服务CMQ架构

在分布式大行其道的今天,我们在系统内部.平台之间广泛运用消息中间件进行数据交换及解耦.CMQ是腾讯云内部自研基于的高可靠.强一致.可扩展分布式消息队列,在腾讯内部包括微信手机QQ业务红包.腾讯话费充值.广告订单等都有广泛使用.目前已上线腾讯云对外开放,本文对腾讯云CMQ核心技术原理进行分享介绍. CMQ消息队列主要适用于金融.交易.订单等对可靠性.可用性有较高要求的业务场景. 以腾讯充值系统为例,该充值系统通过CMQ 对交易模块.发货部分.结算系统进行异步解耦.削峰填谷,一方面大大降低了模块间耦

Netty构建分布式消息队列实现原理浅析

在本人的上一篇博客文章:Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇 中,重点向大家介绍了AvatarMQ主要构成模块以及目前存在的优缺点.最后以一个生产者.消费者传递消息的例子,具体演示了AvatarMQ所具备的基本消息路由功能.而本文的写作目的,是想从开发.设计的角度,简单的对如何使用Netty,构建分布式消息队列背后的技术细节.原理,进行一下简单的分析和说明. 首先,在一个企业级的架构应用中,究竟何时需引入消息队列呢?本人认为,最经常的情况,无非这几种:做业务解耦.事件

操作系统 进程间的通信 之 信号 消息队列 共享内存 浅析

[几个易混淆的相关概念] 进程互斥:指在多道程序环境下,每次只允许一个进程对临界资源进行访问. 进程同步:指多个相关进程在执行次序上的协调. 临界资源:在一段时间内只允许一个进程访问的资源. 临界区:每个进程中访问临界资源的那段代码. [进程通信] 现在常用的进程间通信方式有信号.信号量.消息队列.共享内存.通信,是一个广义的意义,不仅仅指传递一些 message.进程通信就是指不同进程之间进程数据共享和数据交换. [信号和信号量] 信号和信号量是不同的,他们虽然都可用来实现同步和互斥,但信号是

浅谈消息队列的原理及优势

什么是消息队列这样的场景你一定不陌生:小王到M记点餐之后,服务员给了他一个号牌,并让他在柜台桌子前方等待叫号取餐.每个人都按照自己付款拿到的号牌顺序排队等叫号.即使店里人再多,也不会显得没有秩序.在上述场景中,柜台其实就充当了一个消息队列(Message Queue).小王等生产者把订餐的消息发送到柜台即消息队列里,又从其中取了餐即消费了消息,可以说这就是消息队列的一个完整走向--消息被发送到队列中,又成功被消费者消费."消息队列"是在消息的传输过程中保存消息的容器,队列的主要目的是提

Azure Messaging-ServiceBus Messaging消息队列技术系列6-消息回执

上篇博文中我们介绍了Azure Messaging的重复消息机制.At most once 和At least once. Azure Messaging-ServiceBus Messaging消息队列技术系列5-重复消息:at-least-once at-most-once 本文中我们主要研究并介绍Azure Messaging的消息回执机制:实际应用场景: 同步收发场景下,消息生产者和消费者双向应答模式,例如:张三写封信送到邮局中转站,然后李四从中转站获得信,然后在写一份回执信,放到中转站

【转】MSMQ 微软消息队列 简单 示例

MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理. 我个人的理解,你可以把他当做一种,把数据打包后,发送到一个地方,程序也可以去取到这个打包的程序,队列的机制就不讲了,并发问题荡然无存.呵呵. 上代码: 首先 using System.Messaging; public class MsmqManagerHe

消息队列(msg)

一.消息队列:从一个进程向另一个进程发送数据块,读取不一定是先入先出. 管道与消息队列区别:管道基于字节流的,消息队列基于消息: 管道只能发送字符串,消息队列有类型: 管道随进程,消息队列随内核. 二.创建函数原型:int msgget(key_t key, int msgflg);    //key由ftok生成,IPC_CREAT|IPC_EXCL 接收消息:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, in

第15章 进程间通行 15.6 XSI IPC 15.7 消息队列

15.6 XSI IPC (1)3种称作XSI IPC的IPC是: 1)消息队列 2)信号量 3)共享存储器 (2)标识符和键 1)标识符:是一个非负整数,用于引用IPC结构.是IPC对象的内部名. 2)键:IPC对象的外部名.可使多个合作进程能够在同一IPC对象上汇聚. (3)IPC_PRIVATE键: 用于创建一个新的IPC结构.不能指定此键来引用一个现有的IPC结构. (4)ftok函数: 由一个路径名和项目ID产生一个键. (5)ipc_perm结构体 规定了ipc结构的权限和所有者.