消息队列和事件循环学习流程图

在这里插入图片描述

总结
  1. 如果其他进程想发送给浏览器任务,必须先发给IO线程,再发送到消息队列,最后在渲染页面主线程
  2. 消息队列机制并不是太灵活,为了适应效率和时效性加上了微任务
消息队列事件
  1. 当接收到 HTML 文档数据,渲染引擎就会将“解析 DOM”事件添加到消息队列中

  2. 当用户改变了 Web 页面的窗口大小,渲染引擎就会将“重新布局”的事件添加到消息队列中。

  3. 当触发了 JavaScript 引擎垃圾回收机制,渲染引擎会将“垃圾回收”任务添加到消息队列中。

  4. 同样,如果要执行一段异步 JavaScript 代码,也是需要将执行任务添加到消息队列中。

### 黑马点评消息队列循环报错解决方案 在分布式系统中,消息队列的可靠性至关重要。如果消息队列出现循环报错的情况,通常是因为消费者未能正确处理消息并确认其状态,从而导致消息被重新投递给其他消费者或再次尝试消费。 #### 1. 消息重复处理的原因分析 当消费者接收到一条消息后,如果没有正确地向消息队列服务器发送确认信号,则该消息可能会留在待处理列表(pending list)中[^1]。一旦消费者的连接中断或者超时未完成确认操作,消息队列会认为这条消息尚未成功处理,并将其重新分配给另一个消费者实例或其他可用节点。这种机制可能导致同一消息反复传递至不同的消费者端,形成所谓的“死循环”。 #### 2. 防止消息无限重试的具体措施 为了防止上述情况发生,可以采取以下几种策略: - **设置合理的最大重试次数** 应用程序可以在业务逻辑层面设定每条消息的最大允许失败次数。超过指定阈值之后便不再继续尝试执行而是将此异常记录下来以便后续排查修复工作开展前先隔离有问题的数据项避免影响正常流程运行效率降低用户体验满意度下降等问题产生。 - **实现幂等性设计** 幂等意味着无论调用多少次相同的操作都会得到一致的结果而不会改变系统的最终状态因此对于那些可能因为网络波动等原因造成多次提交请求的服务接口来说特别重要它能够有效减少由于重复计算所带来的资源浪费以及数据不一致性风险同时提高整个架构的安全性稳定性水平 - **利用延迟队列功能** 如果某些特定条件下暂时无法立即响应来自上游模块发出的通知那么可以通过创建专门用于存储这些等待进一步验证后再决定如何处置它们的新类型容器即延时期望经过一段时间再触发对应的回调函数来进行下一步动作而不是立刻反馈错误信息回去这样既给了足够的时间让外部依赖恢复正常又能保持现有链路畅通无阻塞现象发生几率大大减小 ```java // 设置最大重试次数示例代码片段 int maxRetries = 3; for(int retryCount=0; retryCount<maxRetries ;retryCount++) { try{ processMessage(message); break;// 成功则退出循环 }catch(Exception e){ if(retryCount == maxRetries -1 ){ throw new RuntimeException("Max retries reached",e); } Thread.sleep(1000L * Math.pow(2,retryCount)); //指数退避算法增加每次间隔时间 } } ``` #### 3. 结合实际案例优化建议 针对短信验证码场景下的具体应用实践给出如下几点改进建议: - 确保每次生成新的随机数作为验证码之前都要仔细检查输入参数的有效性以杜绝非法字符混入其中引发不必要的麻烦; - 将产生的临时密钥连同关联手机号一并通过 Redis 缓存起来限定存活周期以防泄露敏感资料的同时也方便快速检索匹配结果加快整体反应速度; - 当检测到连续几次都存在相同的访问源地址频繁索取短信用途不明之时应当启动额外防护手段比如加入图形认证码环节提升准入门槛过滤掉恶意爬虫攻击行为保护平台利益不受损害。 综上所述,通过对消息队列配置恰当的应答机制配合良好的编程习惯完全可以规避大部分常见的故障隐患达到预期目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值