RabbitMQ(七)用RabbitMQ实现分布式系统里的信号量控制 -- Distributed Semaphores with RabbitMQ

探秘分布式解决方案: 分布式限流——Redis版分布式信号量原理 (附RedisTemplate具体实现代码) 关于限流这种机制呢也算是老生常谈了, 毕竟在业务开发中实在是很多地方都会用到。比如第三方接口调用限制、并发访问数控制等… 而具体的限流算法在单机中很容易就可以实现,  在java的世界里既有开源库Guava的RateLimiter,  也有JUC中自带的 Semaphore、BlockingQueue等。拿来随手就可以使用。 那么在分布式场景中,  限流就变得不是那么容易了。 在这种环境上想实现限流本质上是在实现一种多个进程之间的协同工作机制。 必须得依靠一个可靠的协调中心才行 阅读详情

翻译自(http://www.rabbitmq.com/blog/2014/02/19/distributed-semaphores-with-rabbitmq)


在这篇博客里面,我们将定位“在一个分布式系统里面,如何实现对特殊资源的访问控制”的问题,解决该问题的方案在计算机界广为人知,那就是被称为信号量的东东。“信号量”是在1965年Dijkstra的“Cooperating Sequential Processes”论文里出现的,下面我们将要讨论如何使用AMQP(consumers,producers,queues)来实现信号量。 


需要信号量的地方 
在我们讨论解决方案之前,让我们先看一下什么时候需要用到它 
假如说:我们的应用有很多进程从队列里面取数据,然后将数据插入到数据库,我们可能想限制同时工作的进程的数量 

相似的,很多进程在处理那些需要通过网络存储到远程服务器上的图片,我们要防止由于图片的传输导致网络拥塞,所以我们要限制同时传输图片的进程的数量。这种情况下,一旦某个进程可以使用网络连接(一旦进程可以运行),他们可以尽可能快的传输图片到远程服务器。 

另一个例子和rabbitMQ有关:你的应用程序可能需要只允许一个生产者(producer)发送消息到exchanger,但是一旦那个进程停止了,你希望另一个producer马上开始发送消息。可能这样做由很多原因。 

另一方面,可能有时候想让cosumers去争着访问queue,但是当AMQP支持了专用队列exclusive queues和exclusive consumer之后,空闲的consumer就没办法知道queue什么时候可以被别的consumer访问了,因此,我们可以使用上面的方法使consumers排队访问queue了。 

值得注意的是,让我们有一个以上的进程去访问特殊资源。比如:我们由十个producer,但是我们只想让其中的五个同时去发布消息。使用信号量,我们也可以实现。 

上面的例子都需要有一个额外的条件:竞争资源的进程或者其它的协调者不应该轮询rabbitMQ。理想情况下,他们应该在等待的时候处于空闲的状态,一旦资源可用了,rabbitMQ马上通知下一个进程,以便它自动的开始工作。 

让我们来转向如何实现 实现信号量 

我们的信号量将使用queues和messages来实现 

我们首先声明一个叫做“resource.semaphore”的queue,resource是我们的信号量将要控制的资源的名字,可能是“images”,“database”,“file_server”,或者是任何符合我们应用程序的名字。 

我们发布一个message到resource.semaphore的queue里面,然后我们启动访问这个message的进程。每个进程都要从resource.semaphore里面获取message;第一个到达的进程将得到这个message,同时其它进程将处于空闲状态去等待这个message。技巧是这些进程从来不去确认这个message,但是他们以ack_mode=on(即非自动应答)的模式来从resource.semaphore的queue里面获取message。所以rabbitMQ将持续跟踪这个message,如果这些进程crash或者exit的时候,这个message将重新回到queue里面(requeue),然后被传送给下一个要从这个queue获取message的进程里。 

使用这样一个简单的技术,我们可以实现在同一时刻只有一个进程能访问特定的资源,并且我们还能保证在这个进程crashes或者exit的时候,不会带走该message。当然,我们假设所有的进程都是正常的访问该资源。例如:他们从来不确认该message。如果他们那样做了,rabbitMQ将删除该message,最终导致该组里的其它进程“饿死”。 

当一个进程想放弃该资源的时候,我们该怎么办,它能返回这个“message”吗?当然这个进程可以突然关闭这个channel,然后rabbitMQ将自动接管这个message,但是也有一个礼貌的方式来实现,该进程可以使用basic.reject(requeue)来告诉rabbitMQ重新给该message排队,使它回到semaphore的queue里面。 

让我们来看看代码是怎么实现的,我们假设已经得到了一个connection和channel,下面是安装我们信号量的代码: 

Python代码   收藏代码
  1. channel.queueDeclare("resource.semaphore", true, false, false, null);  
  2. String message = "resource";  
  3. channel.basicPublish("", "resource.semaphore", null, message.getBytes());  


我们创建一个durable(持久的)queue:“resource.semaphore”,然后我们用默认的exchange发送了一条message。 

下面是使用该信号量的代码: 

Python代码   收藏代码
  1. QueueingConsumer consumer = new QueueingConsumer(channel);  
  2. channel.basicQos(1);  
  3. channel.basicConsume("resource.semaphore", false, consumer);  
  4.   
  5. while (true) {  
  6.   QueueingConsumer.Delivery delivery = consumer.nextDelivery();  
  7.   
  8.   // here we access the resource controlled by the semaphore.    
  9.   
  10.   if(shouldStopProcessing()) {  
  11.     channel.basicReject(delivery.getEnvelope().getDeliveryTag(), true);  
  12.   }  
  13. }  


这儿,我们创建了一个QueueingConsumer来等待来自“resource.semaphore”queue的message。我们通过在basic.qos里设置prefetch-count等于1来确保我们的进程只拿取一条message。一旦有一条message到达该队列,这个进程将开始使用该resource。当shouldStopProcessing()的条件满足的时候,这个进程将basicReject(requeue)这个message,告诉rabbitMQ去重新给这个message排队。一定要记住,这个consumer是使用ack-mode启动的,并且将从不确认从semaphore的queue里收到的message。如果它确认了,将被认为是buggy。 

优先访问信号量 
有没有可能实现优先访问信号量。完全可以,从3.2.0以来,rabbitMQ支持Consumer Priorities。通过使用Consumer Priorities,我们可以告诉rabbitMQ哪个进程可以优先访问来自semaphore queue的message。 

二进制信号量和计数信号量 
目前为止,我们实现的是被成为二进制信号量的机制,即只允许在同一时刻只有一个进程来访问resource。如果我们要允许多个进程同时访问该resource,同时我们也有一个个数的限制,这样我们可以实现计数信号量来实现。为了实现它,我们建立一个信号量,现在不是只发布一个message,而是发布多个message(message的个数是允许同时访问resource的进程数),我们需要确保在我们使用之前,prefetch-count的值是1. 

alerting the count 
我们的进程可以随着时间来增加额外的message来增长进程的数量。如果我们想减少同时访问该resource的进程呢?我们将开启一个新的带有高优先级的consumer,这样他就可以消耗掉多余的message,然后确认他们,这样rabbitMQ将会把它们从队列里移除掉。 

阅读资源 

就像你看到的一样,使用AMQP来实现信号量很简单,使用rabbitMQ我们还可已提高访问resource的优先级。 


课设:FPGA音频均衡器 verilog设计及仿真 加报告 未来,随着FPGA技术的进一步发展和应用场景的扩大,FPGA音频均衡器将发挥出更大的作用,并为音频领域带来更多创新和突破。(a)音乐制作:均衡器可以调整音频信号中不同频段的能量分布,使得乐器声音更加明亮、动感,从而提升音乐制作的质量和创作的灵活性。以上步骤提供了设计一个音频均衡器的大致过程,但值得注意的是,具体实现的细节和复杂度可能因设计要求和所使用的平台而有所不同。确保设计满足预期的性能和要求。确定均衡器的功能和要求:定义你的音频均衡器需要实现的功能,包括频率范围、增益范围以及可调参数数量等。 阅读详情

相关推荐

【Arc GIS 零基础教学】土地利用类型图的绘制方法

​Hi,我是胡学长!今天教大家怎么利用Arc GIS 绘制土地利用类型图。土地利用类型图是表达土地资源的利用现状、地域差异和分类的专题地图。它是研究土地利用的重要工具和基础资料,同时也是土地利用调查研究的主要成果之一。在编制土地利用图的基础上,对当前利用的合理程度和存在的问题、进一步利用的潜力、合理利用的方向和途径,进行综合分析和评价。因此,土地利用图是调整土地利用结构,因地制宜进行农业、工矿业和交通布局、城镇建设、区域规划、国土整治、农业区划等的一项重要科学依据。......

一起来交流学习吧 1万+

Distributed Semaphores with RabbitMQ

翻译自(http://www.rabbitmq.com/blog/2014/02/19/distributed-semaphores-with-rabbitmq/) 在这篇博客里面,我们将定位“在一个分布式系统里面,如何实现对特殊资源的访问控制”的问题,解决该问题的方案在计算机界广为人知,那就是被成为信号量的东东。“信号量”是在1965年Dijkstra的“Cooperating Seque...

liufanyansha的专栏 270

保姆级教程:从Salmon输出到DESeq2,搞定RNA-seq表达矩阵标准化与下游分析准备

本文提供从Salmon输出到DESeq2标准化的RNA-seq数据分析全流程指南,详细解析表达矩阵构建、标准化方法选择及下游分析准备。重点介绍如何将Salmon定量结果转换为DESeq2兼容格式,包括TPM与原始计数的处理技巧,以及常见问题排查方法,帮助研究人员高效完成RNA-seq数据分析。

weixin_42699679的博客 303

单channel监听RabbitMQ消息队列,多线程处理消息任务的实现

项目上碰到一个java后台实现问题,底层依赖的以前开发团队的rabbitMQ的实现,该底层open了一个channel,并一直保持着对该channel的监听,在这个基础上我需要实现的就是一直监听该channel,并将接受到的消息交给其他线程去处理,保证监听主线程不被阻塞。需求大致是这样的。 下面看下我的具体实现: 一、主线程监听消息队列,并将接受的消息交给其他线程去处理,并且处理消息的其他线程

linfujian1999的博客 1万+

ESP32驱动GC9A01圆形屏实战:Arduino平台LVGL移植与图像显示优化

本文详细介绍了在Arduino平台上使用ESP32驱动GC9A01圆形屏的实战指南,包括硬件连接、LVGL移植与图像显示优化。通过SPI配置、LVGL库安装和双缓冲机制等技巧,帮助开发者快速实现高效显示效果,适用于智能家居控制面板等应用场景。

weixin_29182481的博客 734

5分钟搞定!用OpenCV实现全景图像柱面展开的保姆级教程(附完整代码)

本文提供了一份使用OpenCV实现全景图像柱面展开的详细教程。通过清晰的数学原理讲解和分步代码演示,指导读者快速掌握从等距柱状投影全景图到平面展开图的核心转换方法,并涵盖性能优化、参数调整及透视视图扩展等实用技巧,适合图像处理爱好者和开发者实践。

sony5的博客 571

rabbitMQ的高级部分

1、消息的可靠性投递; 2、Consumer ACK 3、消费端限流 4、死信队列实现延迟队列 5、日志与监控 6、消息的可靠性与幂等性的实现方案

pshdhx的博客 407

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

AI人人懂 2733

RabbitMQ高级 -- 分布式事务

一、引言 前端时间因为忙着学吉他~ 就耽误正事了~ 现在就赶紧补回来~~ 二、目录

weixin_46724181的博客 4161

17 指挥AI写Mamba相关模型代码,快速适配大模型场景

本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十七篇,属于第三阶段多场景实战核心内容。本篇聚焦当下大模型领域热门的**Mamba架构**,针对零基础大模型开发、无深度学习基础的使用者,拆解指挥AI生成Mamba基础模型、微调适配、推理部署代码的核心方法,覆盖Mamba基础模块搭建、简易序列建模、小样本微调、本地推理等高频场景,提供可直接复用的高质量指令模板、完整可运行代码、环境配置与避坑指南,无需精通Transformer、状态空间模型等底层原理,轻松上手Mamba大模型开发。

coreopt的博客 61

Veritas NetBackup8.1.1安装

1.在服务器上运行Browser.exe 2.选中安装,点击"NetBackup Server Software Installation" 3.提示一个”UAC模式”,我们确定忽略它 4.下一步 5.接受授权,下一步 6.自定义安装 7.输入Key,并点击”netBackup Master Server” 8.自定义路径,下一步 9.默认端口,下一步 10.创建内置账户 创建本地用户帐户: C:\>net user nbwebsvc <StrongPassword> /

万物皆可学 2万+

分布式事务

本地消息表的最终一致方案采用BASE原理,保证事务最终一致。在一致性方面,允许一段时间内的不一致,但最终会一致。本地消息表实现分布式事务应该是网站前台使用最多的,其核心思想是将分布式事务拆分成本地事务进行处理,这种思路是来源于ebay。使用本地消息表,消息生产方,需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后消息会经过MQ发送到消息的消费方。如果消息发送失败,会进行重试发送。消息消费方,需要处理这个消息,并完成自己的业务逻辑。

m0_67463445的博客 2098

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3647

如何用 RabbitMQ 解决分布式事务?

要说哪种分布式事务处理方案效率高,必然绕不开消息中间件!基于消息中间件的两阶段提交方案,通常用在高并发场景下。这种方式通过牺牲数据的强一致性换取性能的大幅提升,不过实现这种方式的成本和复杂度是比较高的,使用时还要看实际业务情况。...

Java5658的博客 1601

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RabbitMQ——解决分布式事务问题,RabbitMQ的重要作用之一!!!通过可靠生产和可靠消费来完美解决!

分布式事务是指涉及多个独立的计算机系统(也称为节点或参与者)之间的事务处理。在分布式系统中,每个节点可能各自拥有自己的数据存储和事务管理机制。分布式事务的目标是保证在跨多个节点执行的一系列操作可以以一致和可靠的方式执行和提交,即使在面对故障或并发操作时也能保持数据的完整性和一致性。实现分布式事务可以采用两阶段提交(Two-Phase Commit)协议或三阶段提交(Three-Phase Commit)协议等机制。这些协议通过协调参与者之间的状态和决策来实现分布式事务的一致性。

我热爱学习,也乐于分享。无论是科技前沿的洞见,还是生活中的小技巧,我都会在这里与你分享。我相信,知识就是力量,而分享则能让这份力量得到更好的传递。 2003

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RabbitMQ(十一)【高级 - 分布式事务】

分布式事务指事务操作位于不同的节点上,需要保证事物的特性例如再下单场景下,库存和订单如果不在同一节点上,就涉及分布式事务在分布式系统中,要实现分布式事务,无外乎那几种解决方案两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务1. 准备阶段协调者询问参与者事务是否执行成功,参与者发回事务执行结果2. 提交阶段如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者

Vinjcent 1205

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

atguigu7 秒杀_分布式锁/分布式信号量_MQ_Sentinel (seckill)

秒杀架构:秒杀系统关注的问题: 3. Sentinel

1035

分布式锁与信号量详解

分布式锁的实现原理主要依赖于一个可靠的、一致的、可共享的锁管理者。否则,它需要监听比自己序号小的前一个节点的删除事件,一旦该事件触发,客户端就再次判断自己是否是当前序号最小的节点,如果是则获得锁。如果线程在持有锁的过程中出现异常或长时间没有释放锁,则其他线程可以获取锁。ZooKeeper的分布式锁是基于顺序节点的,因此锁的获取顺序是确定的。分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,主要用来解决跨多个JVM、跨多个进程、跨多个服务器、跨多个网络情况下的数据一致性问题。

Weirdo的博客 1489

基于RabbitMQ解决分布式事务

1、可查询操作:服务操作具有全局唯一的标识,操作唯一的确定的时间。 2、幂等操作:重复调用多次产生的业务结果与调用一次产生的结果相同。一是通过业务操作实现幂等性,二是系统缓存所有请求与处理的结果,最后是检测到重复请求之后,自动返回之前的处理结果。 3、TCC操作:Try阶段,尝试执行业务,完成所有业务的检查,实现一致性;预留必须的业务资源,实现准隔离性。Confirm阶段:真正的去执行业务,不做任何检查,仅适用Try阶段预留的业务资源,Confirm操作还要满足幂等性。Cancel阶段:取消执行业务,释放T

Tiger_Paul的博客 2687

【RabbitMQ Learning Journey】分布式事务解决方案思想

(MQ解决分布式事务,内容来源于蚂蚁课堂) 案例: 点外卖案例。 用户下单后,调用订单服务,然后订单服务调用派单服务通知外卖人员送单, 这时候订单系统与派单系统采用MQ异步通讯。 消费者端 RabbitMQ分布式事务解决方案,最终一致性思想。(可以暂时不一致,但是最终要一致) 需要保证以下三要素 1、确认生产者一定要将数据投递到MQ服务器中(采用MQ消息确认机制) 2、MQ消费者消息能够正...

开发学习工作日志 664

【RabbitMQ——消息应答机制——分布式事务解决方式】

NONE值是禁用发布确认模式,是默认值创建一个自己的消息确认类。

qq_45467608的博客 1908

Distributed RabbitMQ

RabbitMQ Features Get Started Support Community Docs Blog Overview AMQP 0-9-1, AMQP 1.0 and the other messaging protocols supported by RabbitMQ via plug-ins (e.g. STOMP), are (of course) inherently d...

[Blog][Domain] programb.blog.youkuaiyun.com 353

实战:RabbitMQ的分布式事务处理

1.背景介绍 分布式事务处理是一种在多个节点之间处理事务的方法,它可以确保在分布式系统中的多个节点之间的事务处理的一致性和完整性。在分布式系统中,事务可能涉及多个节点,这使得事务处理变得复杂。因此,分布式事务处理是一项重要的技术,它可以确保在分布式系统中的事务处理的一致性和完整性。 RabbitMQ是一种开源的消息队列系统,它可以用于分布式系统中的事务处理。在这篇文章中,我们将讨论Rabbit...

AI天才研究院 1835

22-08-18 西安 尚医通(07)挂号流程、就医提醒,预约统计、rabbitmq的使用、定时任务、Echarts

mq在这里充当了异步调用的作用,可以提高下单的响应速度

m0_56799642的博客 1873

「项目实战」有一说一这才是RabbitMQ实现分布式事务的正确姿势(附源码)

有一说一 U1S1 不懂就问 导盲犬禁止入内是给犬看的还是盲人看的?

AntizZ 的博客 1291

RabbitMQ解决分布式事务

rabbitmq都有什么?我们可以看到rabbitmq主要由三部分组成:消费者,生产者,broker。

2201_75420324的博客 427
上一篇: RabbitMQ(七)心跳控制 -- heartbeat
下一篇: mysql随机查询若干条数据
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值