首页 > 其他分享 >Rabbitmq消息队列:Work模式简单应用

Rabbitmq消息队列:Work模式简单应用

时间:2023-11-02 16:01:09浏览次数:32  
标签:分发 消费者 队列 Work Rabbitmq GetTwo 消息 接收 String

一、生产者

  直接使用HelloWorld模式下的应用案例依赖和代码,将生产者Give类拷贝一份。

  将发送消息部分调整为遍历发送,连发10次:

//遍历发送多条消息
for (int i = 0; i < 10; i++) {
    //发送内容
    channel.basicPublish("",QUEUE,null,("这是第" + (i+1) + "条消息").getBytes());
}

二、消费者

  1、普通分发

  直接使用HelloWorld模式下的应用案例依赖和代码,将消费者Get类拷贝两份创建两个消费者,分别为GetOneGetTwo,将其接受消息展示的内容加上前缀(XXX接收:)表示区分:

@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
    String str = new String(body);
    System.out.println("GetOne接收:" + str);
    channel.basicAck(envelope.getDeliveryTag(),false);
}

  同时开启两个消费者的情况下,启动生产者,结果如下:

  

  

  两个消费者根据启动接收方法的先后顺序,也依次地从消息队列中拿到对应的数据。

  将GetTwo的消息处理逻辑调整,添加一个睡眠,模拟实际操作的时间错位:

String str = new String(body);
System.out.println("GetTwo接收:" + str);
try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
channel.basicAck(envelope.getDeliveryTag(),false);

  再次按照上面的方式发送消息,结果如下:

  

  

  第一个消费者不受影响,第二个消费者每睡眠一段时间拿一次消息。但是依旧如之前一般,GetOne只拿奇数,GetTwo只拿偶数。

  也就是说在消息发送的时候,就已经按照两个消费者去分配了,不管谁接收的快,谁接收的慢,都会按照固有的工作量去分配。即便第一个已经接收完五个消息了,而第二个还在缓慢的接收第二个消息。

  在实际应用中,这肯定不合适,消息的处理量肯定不是按照这么去分。万一有一个消费者慢了,就会拖慢整个工作任务,很影响应用的整体性能。所以要对规则进行调整,让消费者能者多劳。

  2、能者多劳式分发

  为了提升整体的运行效率和性能,要对两个消费者做分发规则的调整,在两个消费者的通道上加上:

//在消费者确认消息前,让服务器暂时不要给自己分发消息
channel.basicQos(1);

  这样在其中某些消费者运行慢的时候,消息就会更多地向运行快的消费者分发。

  再次按照上面的方式运行,结果如下:

  

  

  在GetTwo接收一次消息之后,陷入了三秒的沉睡,这期间GetOne已经默默帮懒人GetTwo做完了本该属于他的工作。最后结果就是GetOne分发了9条消息,而GetTwo只有一条。

  但从整体的角度来看,本次消息分发完所需要的时间,相比之前大大降低了。

  之前光是GetTwo接收五条消息所需的四次睡眠间隔就需要12秒,而这次整体只需要三秒多。

 

标签:分发,消费者,队列,Work,Rabbitmq,GetTwo,消息,接收,String
From: https://www.cnblogs.com/guobin-/p/17805603.html

相关文章

  • js worker
         index.html<!DOCTYPEhtml><html><head><title>JavaScriptWorkerExample</title></head><body><script>//主线程constmainWorker=newWorker('worker.js');......
  • 报错 org.springframework.dao.DataIntegrityViolationException: Error attempting t
       原因是持久化层的字段属性 跟数据库的没有对应上,类型不对dao.DataIntegrityViolationException:Errorattemptingtogetcolumn'STATUS'fromresultset.<iftest="record.status!=null">'STATUS'=#{record.status,jdbcType=......
  • highcharts network 网络图
    highchartsnetwork网络图要在边上加上箭头,十分困难?Re:HighChartsNetworkGraphArrowLinksWedJul15,20209:47amHi!Welcometoourforumandthanksforcontactinguswithyourquestion!FromtheAPI,thisoptionisnotpossible.Toachievethis,youhavetoext......
  • How to determine the correct number of epoch during neural network training? 如
     Thenumberofepochsisnotthatsignificant.Moreimportantisthethevalidationandtrainingerror.Aslongasitkeepsdroppingtrainingshouldcontinue.Forinstance,ifthevalidationerrorstartsincreasingthatmightbeaindicationofoverfittin......
  • in org.springframework.cache.annotation.ProxyCachingConfiguration required a be
    我的项目是springboot项目,在启动过程中报错如何下Parameter0ofmethodcacheAdvisorinorg.springframework.cache.annotation.ProxyCachingConfigurationrequiredabeanoftype'org.springframework.cache.interceptor.CacheOperationSource'thatcouldnotbefound......
  • 2023NOIP A层联测22 差后队列
    2023NOIPA层联测22差后队列挺有意思的期望题,题解做法应该是DP,但是我又双叒写出奇怪的做法……思路除去最大值外的元素个数的倒数就是这一轮取到某个数的概率,而最大值是特殊的情况,在被替代之前或作为最后一个数被弹出之前,不参与计算。对于操作0的输出和操作1的输出分开......
  • 队列和堆
    先说说队列,队列就是跟排队一样,从头部出去,从尾部进来,堆的话,可以把它理解为一本书,从最顶部(也就是尾巴进去),从最顶部出去 先说说队列,学了两种实现方式,一种是数列实现方式,一种是链表 先说说数列,数列要实现队列(不管是单向还是双端)的话,有个难点就是从头部操作,一般的操作,可能就是,后......
  • Server-Worker 模式
    常见并发编程模式,用于构建服务器应用程序和处理并发请求。也称:"Master-Slave"模式或"Producer-Consumer"模式具体实现方式可以有所不同,但思想一致。这种模式的两种角色:服务器(Server)或主控(Master):负责接收、处理和分发任务。监听来自客户端或请求队列的请求,并将这些请求分发......
  • Redis队列升级版利用Spring项目BeanDefinition自动注入
    利用Redis实现队列先进先出队列:https://www.cnblogs.com/LiuFqiang/p/16366813.html延迟队列:https://www.cnblogs.com/LiuFqiang/p/16592522.html定长队列:https://www.cnblogs.com/LiuFqian/p/17372463.html在使用Redis做消息队列的时候,需要配置队列属性的bean,如果自己项目......
  • SOLIDWORKS2024新功能发布啦!
    SOLIDWORKS2024新功能已经发布,您可以亲身体验新的用户驱动增强功能,这些增强功能旨在帮助您更智能、更快速、更协同地工作。立即加入并开始探索这些关键的发布亮点:一、工作智能化SOLIDWORKS2024新功能通过更有效地去除模型特征,减少SOLIDWORKS中的工作量。首先将组件关联地插......